xianghezhang
作者xianghezhang·2022-12-19 15:23
系统工程师·新华三技术有限公司

分布式存储系统概述(一)

字数 5455阅读 1276评论 1赞 1

本文对分布式存储系统的一些基本问题作一简要描述,以期对希望了解分布式存储基本概念的读者有所帮助。
# 一、 内容总括

分布式存储系统是基于分布式架构,由多个软硬件协同的存储节点通过网络互联来提供存储服务的系统。或简言之,分布式存储系统使用分布式的方法来提供存储服务。

分布式存储系统首先是存储系统。作为存储存储系统,最基本的需求是提供系统的可靠性和可用性。可靠性是指,用户在存储系统写入的数据不能丢,读取的数据不能错;可用性是指,系统提供的服务不中断。

除了可靠性和可用性,存储系统还需要具备高性能、高数据存储效率、高安全、易管理等特点。高性能是指系统提供高 IOPS 、高带宽、低时延;高数据存储效率是指,存储系统利用数据缩减方法(如 RAID 、 EC 、重删、压缩等)使用户写入的数据占用尽量小的存储空间;高安全主要针对存储系统的用户业务、存储设备、存储网络等,需要保证它们不易受到安全威胁和攻击,即使收到攻击后也易于恢复;易管理是指系统在生命周期内可以进行方便的配置、维护、优化等。

分布式存储是使用分布式的方法设计的,必然具有分布式系统的特点。这些特点包括易扩展、融合存储服务、生态开放等。易扩展是指可以在方便地在已有的分布式存储系统中添加(或缩减)节点,并且系统的整体性能( IOPS 、带宽)和节点数量(近)线性相关;融合服务能力是指存储系统可以同时支持块、文件、对象、 HDFS 等多种存储服务;生态开放是指分布式存储不仅可以方便地对接各种上层应用,其系统自身的软硬件也具有相对开放的生态。

人们总是追求完美的产品。对于分布式存储产品,也不例外。比如数据高可靠要高,永远不会丢数据;系统可用性要高,永远在线;系统扩展性要强,可任意扩、缩存储节点;系统容错性强,随便坏几块硬盘,甚至坏几个节点都不会影响存储系统的可靠性和系统可用性;当然,存储还必须具备高性能。但是,完美的存储系统是不存在的。这倒不完全是由于技术的原因,一些更深层的原理,比如分布式存储中的 CAP 理论,就从理论上制约了完美存储的存在。

实际上,我们在设计分布式系统的时候,往往要在可靠性、可用性、性能、存储效率、成本等不同的方面进行权衡和取舍。不同的用户、不同的应有场景,对分布式存储系统的关注点也不尽相同。这也是为什么即使是同一个的厂商的分布式存储产品,也会分成不同的产品系列和型号。其主要作用就是满足不同场景和用户的需求。

本文的主要目的,是对分布式存储系统设计中所关注的问题和方法做一些简要的说明,以期读者通过此文对分布式存储系统有一个基本的了解。下面,我将对本文中提及的分布式存储的特征做一个基本描述。因为文章长度的限制,这里的描述是粗略的。之后,我希望根据读者的兴趣和本人的能力,对分布式存储系统中的一些问题和方法进行专题论述。

二、 可靠性

首先,我们看一下分布式存储系统的可靠性。“可靠性”在不同的语境下有不同的含义。为避免歧义,此文中我们特指存储系统数据的可靠性。更加严格一点说,是指存储系统在给定的时间内(定量计算中一般取一年)数据不丢失的概率。比如,亚马逊 S3 存储服务的数据可靠性指标是 11 个 9 ,也就是 99.999999999% 。照此计算,用户存储百亿对象,平均十年可能出现 1 个对象丢失。

对分布式存储系统来说,造成数据丢失的主要原因是硬件失效(除硬件失效外,软件 Bug 也会造成数据可靠性降低,软件 Bug 不在本文中论述)。硬件失效包括硬盘失效、存储节点失效、网络异常、 IDC 故障等。硬件失效时不可避免的。为了保证在发生硬件失效时,从整个存储系统的角度不丢失数据,一般采用数据冗余的方法,在分布式存储集群内做数据冗余,甚至在 IDC 机房间的不同分布式存储集群间做数据冗余(数据备份)。当前较为成熟的数据冗余方法包括多副本和纠删码,一些新的网络编码方案也探索中。多副本,顾名思义,就是把数据在分布式系统中保存多份;纠删码是 RAID 技术的拓展,它把将存储数据分割成固定长度的数据片段,基于这些数据片段,利用算法计算出若干个校验片段,然后把数据片段和校验片段存储到不同的存储介质上。为了最大限度的提高数据可靠性,数据的不同副本或纠删码片段尽量要存储在不同存储节点(甚至不同机架)。基于硬件失效(硬盘、节点、网络等)的数据可靠性可以通过建模的方法计算出来。常见的算法模型包括蒙特卡洛方法和基于泊松分布的数据估计方法,后续文章专门论述,本文从略。

数据可靠性还包含了数据完整性。用户写入存储系统的数据再读取时必须正确的。实际上,数据进入存储系统,要经过网卡、 CPU 、内存、 RAID ( HBA )卡、硬盘等多个部件的处理,理论上,每个部件在处理过程中都可能发生数据错误。为避免这些可能的错误,需要数据中添加校验信息,以保障最终落盘数据的完整性。校验信息不仅可以保障落盘数据的完整性,还可以避免另一类重要问题,即静默错误( Silent Data Corruption )。磁盘发生静默错误的原因包括介质损坏、 firmware 问题等。在读取发生静默错误的数据时,通过校验信息,就可以发现读物数据的问题,此时,通过其他副本(或其他校验方法)可以重新读出正确的数据,保证读取数据的完整性。

为了提升分布式存储系统的数据可靠性,需要从多个维度进行考量。从存储节点部件(硬盘、内存、 CPU 、 RAID/HBA 卡)级,到存储集群系统级,再到解决方案级,需要多个层次通盘考虑。在部件级,硬盘(包括 HDD 和 SSD )最终承载了用户数据,且其数量大,相对易出错,所以,如何有效、快速地识别和处理硬盘故障,把硬盘故障对整个系统的影响降到最低,是可靠性设计面临的关键挑战。对硬盘可靠性提升的方法包括硬盘坏道检测、错误处理、满盘检测和隔离、故障预测等内容。除硬盘外,网卡、内存等部件有需要相应的可靠性检测和保护技术。

存储集群系统级的可靠性技术包括数据布局的方法、故障节点的快速检测和切换、数据的快速重构等。数据布局技术就是数据的副本或 EC 分片在存储集群中的分布方法。良好的数据布局在可以在相同副本或 EC 配置下最大化数据可靠性。为此,经常需要综合利用节点池、硬盘池、故障域、保护域等多种技术。节点故障(包括硬盘故障)的快速检测对提升存储系统数据可靠性和系统可用性(下文中详细讲解)都要重要作用。通常利用基于软件心跳的方法检测节点故障,部分厂商基于硬件故障上报或软硬结合的方法,可以更快地进行故障检测和切换。在单个硬盘或节点失效时,存储系统部分数据可靠性处于降级状态,此时,需要尽快地进行数据重构,恢复数据完整性。计算表明,数据重构的时间和数据可靠性并非线性关系,而是指数型关系,所以快速重构对于数据可靠性的提升具有重大意义。而数据重构速度在很大程度上依赖于数据布局策略,良好的数据布局可以充分发挥分布式存储的特点,多个节点(硬盘)并行重构数据,从而大幅提升重构效率。

解决方案级的数据可靠性技术主要包括不同存储系统间的异步复制和同步复制技术。此处不详述。

三、 可用性

系统的可用性( availability )指系统可以正常提供服务的能力。对分布式存储系统而言,可用性就是指系统可以正常提供读 / 写数据的能力。这里所谓的“正常”,是指用户的读写操作在合理的时间内被存储系统执行,用户写入数据被正确地持久化在存储系统内,用户读出的数据是最近更新成功的数据。可用性一般用系统提供正常服务的时长与总时长的比例来衡量。比如,若一个存储系统的可用性指标是 99.9999% ,则该系统在一年内不能提供服务的时间约为 30 秒。

对分布式存储系统来说,硬件部件(如硬盘)故障、节点失效、网络故障都被视为无可避免的正常情况。要实现系统高可靠,就是在这些情况出现,分布式存储整体作为一个系统,将不可提供读写服务的时间压缩到最短,甚至没有(主机应用读写无感知)。理论上将,对于一个含有 N 个节点的对称式分布式存储集群来说,每一份写入集群的数据最好能在每个节点上有一个副本,这样,及时 N-1 个节点全部失效,剩下的一个节点也包含完整数据,可以对外提供读写服务。但如果这样做,必然导致数据存储效率的降低,以及较低的性能。这时显而易见的。所以,系统设计时,要在可用性和存储效率、性能之间做一定的取舍和均衡。

分布式存储系统的一个好处是,系统中的任何一个节点都可以提供读写服务。一个自然的要求是,我们希望每个节点在同一时刻看到的数据是一致的。更具体地说,就是在一个具有一致性的分布式系统中,一旦对任何一个节点的写入返回成功,后续系统中其它任何节点都可以立即读到这个更新值。这个性能称为分布式系统的一致性( Consistency )。一致性的要求是合理的,比如对于一个分布式应用来说,一些节点需要从存储系统的不同节点上读取数据的最新写入值,并根据这个值做进一步处理。此时,如果不能满足数据一致性的要求,就可能导致应用错误。

分布式系统的另一个合理要求是分区容错性( Partition tolerance )。分区即网络分区,是因为网络故障导致网络不连通,不同节点分布在不同的子网络中,子网内通信正常。分区容错性就是在发生网络分区时,系统仍然可提供服务,系统仍然可用。

从需求上说,系统可用性、一致性、分区容错性都是分布式存储的必备性质。然而, 2002 年,麻省理工学院的 Gilbert 和 Lynch 发表了著名的 CAP 定理,证明了在分布式系统中,一致性( Consistency )、可用性( Availability )、分区容错性( Partition tolerance )不可兼得。虽然 CAP 定理存在一定争议,但争议本身已在不断加深人们对分布式系统内在性质的理解。

实际上,一致性的模型是比较复杂的。从概念上分,一致性模型包括严格一致性、线性一致性、顺序一致性、因果一致性、单调一致性、最终一致性等。 CAP 定理中的一致性指线性一致性,属于强一致性中的一种。对一致性的详细介绍在专门的文章中讨论。

对分布式存储来说,网络分区( P )是不可避免的。而 C 、 A 、 P 又不能共存,那么我们只能选择 CP 或者 AP 。对于一个通用的分布式存储系统来说,缺少一致性对部分应用来说是不可接受的,所以,大部分分布式存储系统都是 CP 型系统。当然,这并不意味着完全舍弃了可用性( A )。实际上, CAP 理论中的 A 是理论上的最高可用性。在实际的系统中,并不会放弃 A ,设计者只是选择在 C 和 A 中选择哪个更多一点,再一次做权衡和取舍。

在发生分区的时候,我们选择了 CP ;不发生分区的时候, C 和 A 自然是可以兼顾的。然而在此时,可用性和性能,具体地说,是可用性和时延又成了一对不可兼得的特性。也就是说,在无分区的情况下,要追求更强的一致性,就得接受更高的响应时长。这个结论出自 PACELC 定理。对这个定理的一个粗略解释是:更强的一致性必然要求数据以同步的方式进行复制,相比于异步复制,同步复制需要花费更多的时间。响应时长就是性能三大指标之一的时延。从这里我们也可以看到,及时在不发生网络分区的情况下,可用性和性能(时延)之间也要做仔细的权衡和取舍。

分布式存储系统要做到高可用,需要从多个角度进行设计。

分布式存储系统自身首先要做到高可用。存储系统中保存多份数据(数据可靠性),并且其中多个(甚至所有)节点都可以独立对外提供存储服务,这是高可用的基础。另外,在系统中发生故障时,需要系统具备快速的故障检测和故障转移能力。距离来说,外部主机通过虚拟地址连接到存储集群中的某一台存储节点读写集群数据,在该存储节点发生宕机等事件无法继续提供服务时,存储系统要具备快速将服务切换到虚拟地址对应的备用存储节点上继续提供服务。

要提升可用性,有时还需要应用侧(主机侧)进行配合。比如,在主机通过多路径软件连接到分布式存储集群时,在存储集群检测到其中某个存储节点故障时,可以立即通知主机侧(如通过主机上安装的代理软件),进行快速路径切换。这种方法比简单地通过主机侧利用软件超时的方法进行故障倒换要快的多。再比如,在主机侧安装特定的存储客户端软件,使主机以负载分担的方法,和存储集群中的多个节点同时通信。此时,若某个节点故障,主机还可以通过其他链路读写集群数据,这也是对可用性的提升。

除了在本地分布式存储集群中考虑提升可用性外,如果有更高的可用性要求,可以考虑基于不同地理位置的业务连续性保护方案,典型如异步复制方案、 AA 双活方案等。

异步复制方案中,存储系统一般分为主端和从端。主端存储系统的数据会周期性地备份到从端存储系统。这样,在主存储端整体不可用(如断电、火灾等)时,还可以利用从端的数据继续提供服务。 AA 双活的两个存储系统均处于活跃( Active ),用户端从任意一个系统写入的数据会以同步的方式写入到另一个系统。当一个系统发生设备故障,甚至单个系统整体故障时,业务自动切换到另一个存储系统。 AA 双活系统比异步远程复制提供更高的可用性(以及数据可靠性),当然,其实现的技术复杂度、实施成本、技术限制(互联距离、互联带宽 / 时延要求)也更高。

高可用性的获得不仅体现在技术上,也体现在服务能力上。比如,备件能力、可维护性等。总之,系统的高可用性是多个因素共同作用的结果。

(未完待续)

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论1 条评论

匿名用户
2023-06-09 16:06
学习一下,分布式,还没用过!
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广