由于SSD采用闪存芯片取代了机械臂移动和盘片旋转,读写速度非常快,普通的SSD读写都在500MB/s以上。
RAID RAID(Redundant Array of Independent Disk,独立磁盘冗余阵列),它的基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使得性能达到甚至超过一个价格昂贵、容量巨大的硬盘。
RAID技术提供了一种高性能、高可靠的数据存储技术,通过RAID技术组合多个盘,当数据读写时可以分散到多个磁盘,从而提高读写速度。并且配合校验、纠错技术,当有一个磁盘,出现故障后,能恢复数据,从而保证数据的高可靠。
分布式存储和 RAID 有相同的设计思想:数据拆分存储。
RAID等级从RAID0~RAID6七个等级。其中,RAID 0只做条带化,没有数据高可用保障;RAID 1通过镜像技术将数据同时原样写入两个磁盘,保障数据高可靠性;而RAID 5通过校验码的方式保存数据。
RAID 1采用的就是镜像技术,它的写入速度会比较慢,但读取速度会比较快,如图4-4所示。读取速度可以接近所有磁盘吞吐量的总和,写入速度受限于最慢的磁盘,没有校验数据。RAID1由于是数据镜像,所以浪费了一组磁盘,并且写性能不好,而读性能提升了。
RAID 5是当前最流行的RAID, RAID 5是通过计算数据的校验和,如果图4-5所示数据文件A被拆分成 A1、A2、A3三个数据块,通过校验算法计算出校验块Ap,并将这四个数据块保存到四个磁盘上面。无论是哪一个磁盘发生故障,都可以通过逆向生成数据块,从而保障数据的安全,RAID 5可以允许一个磁盘发生故障。
存储按照使用的方式分为块存储、文件存储和对象存储。
分块存储
分布式块存储主要考量的性能指标有IOPS(Input/OutputOperations per Second,即每秒能处理的I/O个数,用于表示块存储处理读写能力)、吞吐量(单位时间内可以成功传输的数据数量)和访问延迟(块存储处理一个I/O需要的时间)。
文件存储
文件存储(File storage)是以文件目录的方式提供的,直接将文件系统呈现给用户。我们每天使用的桌面系统,使用的就是文件系统。
对象存储
对象存储(Object storage)是以二进制对象的方式提供服务,它既不像块存储那样提供块的读取,也不像文件存储那样读写文件,而是以HTTP API的方式上传或者下载二进制对象。我们使用的网盘服务就是一种对象存储,当然,最著名的对象还是 AWS的 S3存储。
对象存储的另一个重要作用是存储大文件,如视频、图片等,相比文件存储和块存储,对象存储的容量更大,价格更便宜,并且消除了文件存储 inode 个数的限制,在处理大量文件遍历的场景也比文件存储要快,但对象存储也不是万能的,它必须通过HTTP接口的方式传输数据,这导致读写的性能不会太高,并且也无法组织复杂的目录结构。
对象存储通常分为两级,bucket(桶)和object(对象),可以将bucket当作一个大的目录,而 object 则是这个目录下的文件。为了安全访问,还可以分别针对 bucket 和object设置读写权限。
开源存储
Ceph需要具有可靠性(reliability)、可扩展性(scalability)、统一性(unified)和可分布式(distributed)存储特性。
可靠性主要分为两点,第一,写入数据的强一致性,它并非是最终一致性,必须完成多副本的成功写入才能提交;第二,通过多副本保证数据不丢失,避免因为单个服务器或者单个机架的故障导致数据丢失。
可扩展性,主要指通过增加系统节点数,扩大系统规模的同时,系统的存储容量也相应提高,当然在理想情况下应该成线性关系,Ceph的OSD支持动态添加,当集群容量不足时,通过增加OSD节点便可以扩展集群的容量,并且Ceph能够自动完成数据重新分配。
统一性,是指Ceph能够同时支持文件存储、对象存储和块存储。这些特点最终都得利用Ceph分布式的架构设计和去中心化的设计思想。
SeaweedFS是Golang实现的具有文件存储和对象存储功能的分布式存储。SeaweedFS系统架构图如图4-25所示。
Master负责维护集群信息,并管理多个VolumeServer,Master之间通过Raft协议保持数据一致,而每个VolumeServer又负责管理多个卷(大小固定)。如果Client需要写数据,需要先请求Master写入数据,Master 返回fid和VolumeServer地址。其中,fid前32位代表Volume ID,这样客户端便可以通过HTTP的方式上传文件。SeaweedFS也是一个多副本、强一致性的方案,只不过它的副本是卷,并非单个文件。SeaweedFS还提供了 FUSE文件挂载,这样便可以通过mount方式挂载到机器上。
网友评论