|
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="" ng-bind-html="message.MMActualContent" style="max-width: 100%;letter-spacing: 0.544px;background-color: rgb(255, 255, 255);box-sizing: border-box !important;overflow-wrap: break-word !important;"><section class="" data-tools="135编辑器" data-id="41056" data-color="#757576" style="max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;white-space: normal;font-family: 微软雅黑;font-size: 16px;border-width: 0px;border-style: none;border-color: initial;overflow-wrap: break-word !important;"><blockquote style="margin-top: 2px;margin-bottom: 2px;padding: 2px;border-width: 1px;border-style: dotted;border-color: rgb(117, 117, 118);color: rgba(0, 0, 0, 0.5);font-size: 14px;max-width: 100%;line-height: 25px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section class="" style="padding: 10px;max-width: 100%;box-sizing: border-box;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(136, 136, 136);box-sizing: border-box !important;overflow-wrap: break-word !important;">【摘要】</span></span><span style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: normal;color: rgb(136, 136, 136);box-sizing: border-box !important;overflow-wrap: break-word !important;">本文打算阐述 Ceph、HDFS、Swift、GFS、Luster 等几种主流分布式存储技术的实现原理,并且总结它们各自的特点以及合适的使用场景,目的是帮助架构师在规划存储架构时能够选择合适的存储技术。</span><span style="max-width: 100%;letter-spacing: normal;color: rgb(136, 136, 136);box-sizing: border-box !important;overflow-wrap: break-word !important;"></span></span><br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
<span style="max-width: 100%;letter-spacing: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(136, 136, 136);box-sizing: border-box !important;overflow-wrap: break-word !important;">【作者】范永清,</span><span style="max-width: 100%;color: rgb(136, 136, 136);box-sizing: border-box !important;overflow-wrap: break-word !important;">高级工程师在厦门银行信息技术部工作。目前,他主要承担着厦门银行技术架构设计的任务。</span></span>
</section></blockquote></section> <br />
</pre></p>
存储依据其类型划分,有块存储、对象存储和文件存储。在主流的分布式存储技术里,HDFS、GPFS、GFS属于文件存储这一类型,Swift属于对象存储,而 Ceph 能够支持块存储、对象存储以及文件存储,所以它被称作统一存储。
一、 Ceph
Ceph最早是在 Sage 读博士期间开展工作并取得成果,该成果于 2004 年发表,之后被贡献给开源社区。经过多年的发展历程,它已经获得了众多云计算和存储厂商的支持,如今已成为应用最为广泛的开源分布式存储平台。
Ceph按场景划分可分为对象存储、块设备存储和文件存储。Ceph与其他分布式存储技术相比,具有以下优势:它不仅是存储,还能充分利用存储节点上的计算能力。在存储每一个数据时,会通过计算来确定该数据的存储位置,并且会尽量使数据分布均衡。它采用了 CRUSH、HASH 等算法,所以不存在传统的单点故障。并且,随着规模的扩大,其性能也不会受到影响。
1.Ceph的主要架构
Ceph 的最底层是 RADOS,它属于分布式对象存储系统。RADOS 具备可靠、智能以及分布式等特性,能够实现高可靠、高可拓展、高性能以及高自动化等功能,并且最终用于存储用户数据。RADOS 系统主要由两部分构成,其中一部分是 OSD,另一部分是……
RADOS 的上面有一个库,这个库能让应用程序通过访问它来与 RADOS 系统进行交互,并且它支持多种编程语言,例如 C、C++等。
基于层开发的有三种接口,分别是、和MDS。
这是一套网关,它基于当前流行的协议。这套网关支持对象存储,并且兼容 S3 和 Swift。
提供分布式的块存储设备接口,支持块存储。
MDS提供兼容POSIX的文件系统,支持文件存储。
2.Ceph的功能模块
各组件的功能分别如下:
客户端:负责存储协议的接入,节点负载均衡
MON 监控服务的职责包括:监控整个集群;维护集群的健康状态;维护并展示集群状态的各种图表,像 OSD Map、Map、PG Map 和 CRUSH Map 。
MDS 元数据服务的职责是保存文件系统的元数据,并且对目录结构进行管理。
OSD 存储服务的主要功能包括存储数据、复制数据、平衡数据、恢复数据,并且会与其他 OSD 进行心跳检查等。通常情况下,一块硬盘会对应一个 OSD。
3.Ceph的资源划分
Ceph 运用 crush 算法,在大规模集群的情形下,能够实现数据快速且准确地存放。并且,在硬件出现故障或者需要扩展硬件设备的时候,能够做到数据迁移的量尽可能小。其原理具体如下:
用户将数据存储到 Ceph 集群时,数据会先被分割成多个部分,每个部分都有一个 id,其大小可以设置,默认是 4MB,这些部分是 Ceph 存储的最小存储单元。
因为数量众多,为能有效减少到 OSD 的索引表且降低元数据的复杂度,让写入和读取更灵活,所以引入了 pg(Group)。PG 用于管理,每个都通过 Hash 方式,被映射到某个 pg 中,且一个 pg 可以包含多个。
Pg 经过 CRUSH 计算后,会被映射到 osd 中。如果是三副本的情况,那么每个 pg 都会映射到三个 osd ,这样就保证了数据的冗余。
4.Ceph的数据写入
Ceph数据的写入流程
1) 数据通过负载均衡获得节点动态IP地址;
2) 通过块、文件、对象协议将文件传输到节点上;
3) 数据被分割成4M对象并取得对象ID;
4) 对象ID通过HASH算法被分配到不同的PG;
5) 不同的PG通过CRUSH算法被分配到不同的OSD
5.Ceph的特点
Ceph 能够提供对象存储服务、块存储服务以及文件存储服务。因此,它被称作统一存储。
采用 CRUSH 算法,能使数据分布保持均衡,并且并行度较高,同时也不需要去维护那种固定的元数据结构。
数据具有很强的一致性,只有当所有副本的写入都完成了,才会返回确认。这种特性适合读多写少的场景。
去中心化,MDS之间地位相同,无固定的中心节点
Ceph存在一些缺点:
去中心化的分布式解决方案需要提前进行规划设计,并且对技术团队的要求能力较高。
Ceph 在扩容时,因为它具有数据分布均衡的这种特性,所以会使得整个存储系统的性能出现下降的情况。
二、 GFS
GFS 是一种分布式文件存储系统,它是专门为存储海量搜索数据而设计的。它于 2003 年被提出,是闭源的分布式文件系统。它适用于大量的顺序读取和顺序追加操作,比如大文件的读写。它注重大文件的持续稳定带宽,而不是单次读写的延迟。
1.GFS的主要架构
GFS 架构较为简单。一个 GFS 集群通常包含一个主服务器,还有多个数据服务器以及多个客户端。
在 GFS 里,所有文件被分割成若干个 chunk 。每个 chunk 都有唯一且不变的标识,这个标识在 chunk 创建时,是由特定的部分负责分配的。并且,所有 chunk 都实实在在地存储在特定的磁盘上。
为了容灾,每个 chunk 都会被复制到多个
2.GFS的功能模块
GFS 客户端为应用提供了与 POSIX API 类似的 API。并且它还会缓存从 GFS 读取的元数据 chunk 信息。
GFS 元数据服务器负责管理所有文件系统的元数据,其中包含命令空间(目录层级)、访问控制信息以及文件到 chunk 的映射关系和 chunk 的位置等。并且,它还对系统范围内的各种活动进行管理,这些活动包括 chunk 创建、复制、数据迁移以及垃圾回收等。
GFS 的存储节点是用于存储所有 chunk 的。一个文件会被分割成多个大小固定的 chunk,其默认大小为 64M。并且每个 chunk 都有全局唯一的 chunk ID。
3.GFS的写入流程
询问要修改的 chunk 位于哪个位置,以及该 chunk 其他副本的位置信息;
2) 将、的相关信息返回给 ;
3) 将数据推送给 和 ;
当所有副本都确认已收到数据时,会向其发送写请求。会给不同的操作分配序号,以保证这些操作能够按照顺序执行。
将写请求发送至指定位置,依照分配的序号顺序依次执行所有操作。
6) 当 执行完后回复 执行结果;
7) 回复 执行结果。
由上述可见,GFS在进行写数据时,有如下特点:
GFS 在进行数据读写操作时,其数据流与控制流是相互分离的。并且通过租约机制,在跨多个副本进行数据写入的过程中,能够保障顺序的一致性。
将 chunk 租约发放给其中一个副本,此副本被称作主副本。主副本负责确定 chunk 的写入顺序,而次副本会遵守这个顺序。通过这种方式,就保障了全局顺序的一致性。
返回客户端主副本的位置信息,客户端将其缓存以备将来使用。同时返回次副本的位置信息,客户端也将其缓存。只有当主副本所在位置不可用,或者返回的租约过期了,客户端才需要再次联系以获取位置信息。
GFS 采用链式推送这种方式,目的是最大化地利用每台机器的网络带宽,同时避免出现网络瓶颈以及高延迟的连接情况,并且能够最小化推送所产生的延迟。
GFS使用TCP流式传输数据,以最小化延迟。
4.GFS特点
适合大文件的场景应用,尤其针对 GB 级别的大文件。这种应用适用于搜索类业务,且对数据访问延时不敏感。
中心化架构,只有1个处于状态
缓存和预取的作用在于,通过在终端缓存元数据,能够尽量减少与其他方面的交互。同时,通过对文件进行预读取,能够提升并发性能。
高可靠性意味着需要持久化的数据会以操作日志的方式存放多份,并且在发生故障后能够自动切换并重启。
三、 HDFS
HDFS(文件),它是一个适合在通用硬件上运行的分布式文件系统。它是核心子项目,是为了满足基于流数据模式访问和处理超大文件的需求而开发的。该系统仿照了谷歌文件系统(GFS),是 GFS 的一个简化且开源的版本。
1.HDFS的主要架构
HDFS(客户端):先获取文件的位置信息,接着进行读取或者写入数据的操作。并且,在数据存储过程中,负责对文件进行分割。
元数据节点负责管理名称空间,它要处理数据块(Block)的映射信息,还要配置副本策略,同时也会处理客户端的读写请求。
存储节点负责执行实际的读写操作,并且存储实际的数据块,同一个数据块会被存储在多个地方。
定期进行元数据的合并,然后将其推送给相关方。在遇到紧急情况时,这些合并后的元数据可以辅助进行 HA 恢复。
2.HDFS的特点(vs GFS)
分块更大,每个数据块默认128MB;
不支持并发,同一时刻只允许一个写入者或追加者;
过程一致性,写入数据的传输顺序与最终写入顺序一致;
HA 的 2.X 版本支持两个,一个处于某种状态,另一个处于另一种状态,故障切换时间通常在几十秒到数分钟之间。
3.HDFS适合的应用场景
适用于处理大文件和大数据。能够处理达到 GB 级别的数据,也能处理达到 TB 级别的数据,甚至能处理达到 PB 级别的数据。
适合流式文件访问,一次写入,多次读取。
文件一旦写入不能修改,只能追加。
4.HDFS不适合的场景:
低延时数据访问。
小文件存储
并发写入、文件随机修改
四、 Swift
Swift 起初是由某公司开发的一种分布式对象存储服务。在 2010 年,它被贡献给了开源社区。它是某公司最初的核心子项目之一,为该公司的 Nova 子项目提供虚机镜像存储服务。
1.Swift的主要架构
Swift 采用的是完全对称且面向资源的分布式系统架构设计。它的所有组件都具备可扩展性。这样的设计能够避免因为单点失效而对整个系统的可用性造成影响。
Swift 组件包括
- 也能够将请求转发至相应的对象服务。
认证服务:对用户的身份信息进行验证,进而获得一个访问令牌(Token)。
缓存服务(Cache)会缓存令牌以及账户和容器的信息,然而不会缓存对象自身的数据。
账户服务提供账户元数据和统计信息,同时维护所含容器列表。
容器服务:它能够提供容器的元数据以及统计信息,同时还会维护所包含对象的列表。
对象服务提供对象元数据和内容服务,并且每个对象会被以文件的形式存储在文件系统中。
复制服务():对本地副本与远程副本进行一致性检测,以推式(Push)方式来更新远程副本。
更新服务():对象内容的更新
审计服务:检查对象的完整性,检查容器的完整性,检查账户的完整性。若发现错误,文件将被隔离。
账户清理服务:移除被标记为删除的账户,将其包含的所有容器和对象予以删除。
2.Swift的数据模型
Swift 的数据模型采用层次结构,一共设置了三层,分别是账户层、容器层和对象层。每层的节点数都没有限制,能够任意进行扩展。数据模型具体如下:
3.一致性散列函数
Swift 基于一致性散列技术。它通过计算,能将对象均匀分布到虚拟空间的虚拟节点上。在增加或删除节点时,能够大大减少需移动的数据量。
为了便于进行高效的移位操作,通常将虚拟空间大小设定为 2 的 n 次方;借助独特的数据结构 Ring(环),接着把虚拟节点映射到实际的物理存储设备上,从而完成寻址过程。如下图所示:
散列空间是 4 个字节,也就是 32 位。虚拟节点数最多能达到 232 个。如果把散列结果向右移动 m 位,那么就能产生 2 的(32 - m)次方个虚拟节点。(就像上图所展示的那样,当 m = 29 时,能够产生 8 个虚拟节点。)
4.环的数据结构
Swift为账户、容器和对象分别定义了的环。
环的设计目的是将虚拟节点(分区)映射到一组物理存储设备上,并且提供一定的冗余度。环的数据信息包含存储设备列表和设备信息,还有分区到设备的映射关系,以及计算分区号的位移(也就是上图中的 m)。
账户、容器和对象的寻址过程。(以对象的寻址过程为例):
以对象的层次结构当作键,运用 MD5 散列算法从而得到一个散列值。
对该散列值的前 4 个字节进行右移操作,即将其向右移动 m 位,从而得到分区索引号;
在分区到设备的映射表中,依据分区的索引号,去查找该对象所在分区相对应的所有物理设备编号。如下所示:
5.Swift的一致性设计
Swift 采用 仲裁协议
定义:数据的副本总数为 N;写操作被确认接受的副本数量是 W;读操作的副本数量为 R
强一致性意味着当 R+W>N 时,能够确保对副本的读写操作会有交集,进而可以读取到最新版本。
弱一致性:R+W |
|