当前位置: 首页 > 科技观察

老码农眼中的存储是什么样的

时间:2023-03-21 17:50:50 科技观察

存储是我们码农每天都要打交道的东西,而当我们面对RAID、SAN、对象存储、分布式数据库等技术时,往往是似是而非的。成为我们的陌生人。在老程序员眼里,存储好像就是这样。从计算机结构说起,存储是计算机的一部分。在冯·诺依曼架构中,有一个重要的单元——存储器,它连接着输入/输出,还有控制器和运算单元,处于核心环节。与存储中数据的交互是通过IO实现的,IO的性能直接影响到系统的性能。我们甚至把应用分为IO密集型和CPU密集型等等。从IO访问方式来看,可以分为阻塞/非阻塞,同步/异步。Linux中提供了五种IO模型:BlockingI/O:阻塞I/ONon-blockingI/O:非阻塞I/OI/Omultiplexing:I/O多路复用(select和poll)Signal-drivenI/O:信号drivenI/O(SIGIO)asynchronousI/O:异步I/O(POSIXaio_functions)在性能方面,异步IO的性能无疑是最好的。IO抽象为逻辑IO和物理IO,分为磁盘、卷和文件系统三层。打个简单的比方,磁盘好比一个空地,卷好比一个小区,文件系统就是小区里的建筑物和房间。卷位于操作系统和硬盘之间,屏蔽了底层硬盘组合的复杂性,使得多个硬盘在操作系统看来就像一个硬盘。镜像、快照、磁盘的动态扩展都可以通过卷来实现。文件系统的主要目标是管理磁盘空间。对于程序员来说,我们一般面对的是文件系统,通过文件系统感知存储中的数据。提高存储的可靠性——磁盘阵列的硬盘一旦发生故障,极有可能导致数据丢失,进而演化为灾难。对于很多企业应用来说,直接提高存储可靠性的方式就是通过磁盘阵列——RAID。RAID是RedundantArraysofIndependentDisks的首字母缩写,是将相同的数据存储在多个硬盘的不同位置。通过将数据放置在多个硬盘驱动器上,输入和输出操作可以以平衡的方式重叠,从而提高性能并延长平均故障间隔时间(MTBF),存储冗余数据也增加了容错性,从而提高了存储可靠性。常见的RAID类型如下:RAID的两个主要目标是提高数据可靠性和I/O性能。实际上,RAID可以看作是一种虚拟化技术,将多个物理磁盘虚拟成一个大容量的逻辑驱动器。增加存储容量——存储网络磁盘阵列虽然也在一定程度上增加了存储容量,但很难满足人们对存储容量的需求。为了解决存储空间的问题,采用了分而治之的方法,通过DAS独立使用硬盘作为存储空间。DAS(DirectAttachedStorage)是指通过SCSI接口或光纤通道将存储设备直接连接到主机上。DAS是磁盘的集合,数据的读写也是由主机控制的。但是DAS无法实现多主机共享磁盘空间的问题。为了解决共享问题,出现了SAN(StorageAreaNetwork)---存储网络。由于SAN网络不直接与磁盘交互,而是解决数据访问问题,所以使用的协议比DAS更高。对于存储网络,带宽要求非常高,所以在SAN网络下,光纤成为连接的基础。光纤上的协议比以太网协议更紧凑,性能更高。从数据的角度来看,存储空间的共享可以体现在文件的共享上。NAS(NetworkAttachedStorage)是通过标准以太网将存储设备连接到一组主机上。N是一种组件级的存储方式,可以解决存储容量快速增长的需求。也就是说,NAS从文件系统层面解决了存储扩展问题。NAS和SAN的本质区别在于文件管理系统。在SAN中,文件管理系统在每台应用服务器上;而在NAS中,各个应用服务器通过网络共享协议(如NFS等)使用同一个文件管理系统。NAS的出发点是应用程序、用户和文件,以及它们共享的数据;而SAN的起点是磁盘和连接它们的基础设施。三者的关系如下图所示:通用存储系统应用存储是我们软件产品和服务中必不可少的一部分,通用存储系统应用包括:配置数据服务:只读访问缓存系统:有/无持久化文件系统:目录/POSIX对象系统:Blob/KV表系统:Column/SQL数据库系统:满足ACID备份系统:冷存储/延迟读...在使用存储系统时,我们可能需要关注的指标:存储成本功能:读/写/列索引/条件查询/事务/权限。.性能:读写吞吐量/IOPS/延迟/负载均衡。..AvailabilityReliabilityScalabilityConsistency存储引擎是存储系统中的引擎,直接决定了存储系统的性能和功能,实现了存储系统的增/删/改/查,广泛应用于数据库系统。常见的存储引擎有:哈希存储引擎、B树存储引擎(磁盘索引节省内存)和LSM树存储引擎(随机写到顺序写)。分布式存储系统应用——云服务分布式存储系统一般采用可扩展的体系结构,利用多台存储服务器分担存储负载,利用位置服务器定位和存储信息,不仅提高了系统的可靠性、可用性和访问效率,易于扩展。分布式存储的应用场景一般分为三种:对象存储:即通常的key-value存储,其接口简单GET、PUT、DEL等扩展块存储:通常以QEMUDriver或QEMUDriver的形式存在KernelModule,需要实现Linux的BlockDevice接口或者QEMU提供的BlockDriver接口,比如AWS的EBS,青云的云硬盘,百度云的云盘等。文件存储:支持POSIX接口,提供并行化能力,比如如Ceph的CephFS,但有时GFS、HDFS等非POSIX接口类文件存储接口也算作这一类。一般对象存储通常以大文件为主,需要足够的IO带宽。块存储:它可以处理大文件和小文件的读写。块存储要求的延迟是最好的。文件存储需要考虑目录、文件属性等的支持,难以支持并行化。通过具体的实现来定义接口可能会更容易。实现分布式存储系统通常涉及元数据、分区、复制、容错等诸多方面。分布式设计采用master-slave,fullydistributed,或者两者兼而有之。底层存储可以依赖本地文件系统的接口,也可以实现简单的物理块管理,但相对来说并不容易。好在分布式存储系统已经成为云服务的基础能力,尤其是对象存储,比如七牛、S3、OSS、BOS等,已经是标配。有了云服务的存储,我们可以更专注于业务本身。各种存储带来的烦恼,会不会逐渐随风而去?!【本文来自专栏作家“老曹”原创文章,作者微信公众号:哦家ArchiSelf,id:wrieless-com】点此阅读更多本作者好文