【摘要】
本文从可靠性、可用性、IO 性能、数据存储效率、安全性、可管理性等多方面对分布式存储系统进行了描述,对希望了解分布式存储系统的读者很有帮助
【分享者】xianghezhang
一、 内容总括
分布式存储系统是基于分布式架构,由多个软硬件协同的存储节点通过网络互联来提供存储服务的系统。或简言之,分布式存储系统使用分布式的方法来提供存储服务。
分布式存储系统首先是存储系统。作为存储存储系统,最基本的需求是提供系统的可靠性和可用性。可靠性是指,用户在存储系统写入的数据不能丢,读取的数据不能错;可用性是指,系统提供的服务不中断。
除了可靠性和可用性,存储系统还需要具备高性能、高数据存储效率、高安全、易管理等特点。高性能是指系统提供高 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 双活系统比异步远程复制提供更高的可用性(以及数据可靠性),当然,其实现的技术复杂度、实施成本、技术限制(互联距离、互联带宽 / 时延要求)也更高。
高可用性的获得不仅体现在技术上,也体现在服务能力上。比如,备件能力、可维护性等。总之,系统的高可用性是多个因素共同作用的结果。
四、 IO 性能
对于存储系统,经常用 IOPS ( I/O per second )、带宽( Throughput )、时延( Latency )这三个参数作为性能衡量指标。IOPS 指的是系统在单位时间( 1 秒)内能处理的最大的 I/O 数量。把 IOPS 的值乘以 IO 尺寸,就得到了带宽指标。所以说, IOPS 和带宽不是两个独立的指标。那为什么人们为什么要采用两个指标来做度量呢?实际上,这和存储系统本身的特性相关:对于不同尺寸和访问模式(随机 / 顺序)的数据,存储系统性能会表现出很大差异!具体来说,在相同的设备上,对于小尺寸 IO (如 4KB 、 8KB )的随机读写和大尺寸 IO (如 1MB 以上)的读写,从存储系统所能获得的带宽可能有数量级的差异 ! 所以,我们提到存储存储系统的 IOPS ,一般是指在小尺寸 IO (即小 IO )下每秒内可获得的 IO 次数;而带宽指大尺寸 IO (即大 IO )下(这里不再区分随机 / 顺序不同模式的原因是大 IO 性能对不同模式不敏感)的读写存储系统所获得的吞吐量。再进一步追问,为什么不同尺寸 IO 在性能上会有如此大的差异呢?这是存储介质( HDD 、 SSD )的特性所决定的。以目前在存储系统中最广泛使用的磁盘( HDD )为例,一般 SATA 接口的硬盘,在 4KB 的 IO 尺寸下, IOPS 值大概是 100 ,照此计算,此时的带宽是 0.4MB; 在 1MB 的 IO 尺寸下,其带宽却可以达到 100MB 。由此可见,不同的 IO 模式,磁盘的带宽值可以相差数百倍!至于磁盘的性能表现为何如此,这是由其物理特性和读写方式决定的,此处不再详述。
实际上,正是因为磁盘在不同 IO 尺寸和访问模式下性能的巨大差异,才导致了需要对以磁盘为主要存储介质的存储系统进行性能优化的可能。如果磁盘在任意 IO 下的性能是相同的,性能优化的意义就大打折扣。
对存储系统的写性能优化和读性能优化,其原理并不相同。
实际上,在存储系统的发展过程中,对性能优化的一个关键技术就是如何能充分发挥存储介质的性能。在存储系统中,和 IO 处理直接相关的部件基本指标如下图所示:
从上图可以看出,从 CPU 到 CPU Cache ,再到 DRAM 内存、 PCM ( Phase-Change Memory ,非易失性内存的一种)、 SSD 、 HDD ,访问时延和容量都迅速变大。所以,对于性能优化,一方面要充分利用高速缓存介质,另一方面要充分利用 HDD 和 SSD 的性能,因为数据最终要存储在这些介质上。
如前所述,对于 HDD 来说,其大块数据的顺序读写性能远高于随机读写性能。对于 SSD 来说,作为半导体存储,不存在 HDD 通过机械臂寻道导致的时延问题,但由于其自身的 GC 机制(垃圾回收),顺序访问的性能同样高于随机访问,当然,其访问性能差异远没有 HDD 大。应用访问存储的 IO 读写模式并不固定,既有以随机小 IO 居多的应用(如数据库) , 也有以 IO 居多的应用(如视频、 HPC 等),当然,更多的是大小 IO 混杂应用。
既然大 IO 可以充分发挥硬盘( HDD 或 SSD )性能,那么,性能优化的一个方向就是把小 IO 变成大 IO ,把随机 IO 变成顺序 IO 。下面分别从 IO 存取两方面分别说明。
首先看一下基本的数据写入流程:
在应用将数据写入到存储系统的内存后,系统会在把数据的副本(通常以日志形式)写入非易失性高速介质(如 NVDIMM 、 PCM 、 NVMe SSD 等)后,就会向应用返回写入成功信息;然后,内存中的数据以异步的形式写入真正的存储介质,即硬盘中。这样做一方面可以在节点数据可靠性(因为写入了非易失性介质中,即使突然断电,系统重启后数据可恢复)的前提下做到低时延,另一方面可以对内存中的写入数据(小 IO )进行一定的处理,使得这些数据写入硬盘获得更好的性能。从而在整体写入性能上获得低时延,更高的带宽。
把写入的随机小 IO 变成大 IO (或顺序 IO )的方法之一就是利用写缓存技术。
其原理如下:
我们以磁盘为例进行说明。大体上有两类方法进行写性能优化。
其一是 IO 调度法。在多个随机小 IO 写入缓存(高速介质,如内存)后,由算法根据 IO 调度:调度的结果是部分小 IO (逻辑位置相邻)被合并成较大 IO ;部分小 IO 被重排,重排后的 IO 可以使磁盘的磁头以相对较好的顺序性访问磁盘,从而提升写入性能。
其二是数据重映射法。这种方法的核心思想是小 IO 不再进行“ in-place ”的写入,而是通过引入一个重映射层(或称索引层),把随机写入的 IO 以追加写( append )的方式变成变成对磁盘的顺序写入。这样就可以充分利用磁盘顺序写入的高带宽特性,付出的代价是首先,要建立原有随机小 IO 和新的顺序 IO 之间的映射表(索引);其次,要有垃圾回收机制,因为数据不是以“ in-place ”的方法写入的,旧有的数据必须在系统后台定期进行清理,释放出空间。再次,新的映射层会导致对上层应用来说逻辑连续的数据在磁盘上可能不再连续,从而对数据的连续读性能造成影响。
实际上,以上两种对写性能的优化思路在系统层面和部件层面都广泛存在。除了广为人知的存储系统软件、操作系统等层面使用写缓存技术,在部件层面,比如 RAID 卡、 HDD 、 SSD 等,也都存在用于写优化的缓存层。
对于读性能的优化,主要的方法是根据应用 IO 读请求的特点对数据进行预取,预取数据放在高速缓存( Cache )中,这样,在下一个读请求命中 Cache 时,可以快速返回数据。我们知道,在存储系统中,读 Cache 的容量比介质容量要小若干个数量级。所以,此种方法的核心在于如何对读请求作出正确的预测,使得后续读请求数据可命中 Cache 。实际上,对相当多的应用来说,读取数据时具备一定的空间局部性( temporal locality ),也就是说,假设应用目前在读取第 K 块数据,那么接下来有很大的几率读取第 K 块附件的数据,所以我们可以将第 K 块附件的数据(对于 HDD 来说,这些数据数据很可能也是物理连续的,可以充分发挥磁盘顺序读取的性能优势)预读到 Cache 中。当然,如果对于真正完全随机的数据,预读的方法是没有用处的,反而会造成一定的系统负担。真实世界中,完全随机的读取是很少的。目前人们在探索利用 AI 的算法对读请求进行模式识别,这会比简单地根据空间局部性预测命中率更高,一些公司在这方面已经取得了很好的结果。同写缓存类似,读缓存也分为多个层次。
分布式存储中,一般存在一个由各存储节点的高速介质(易失或非易失性内存)组成的分布式全局缓存。全局缓存一般采用读写缓存分离设计。这样做的好处是一方面避免读写缓存相互影响(写缓存刷盘、读缓存淘汰数据),一方面可以对读写缓存独立实施实现灵活的策略(缓存空间占用大小、副本数、后端存取介质等)。除此之外,为实现对后端存储介质友好(大块连续数据)的数据写入,还会在全局缓存层实现随机小 IO 到大块顺序 IO 的 IO 聚合功能。如前文所述,此时需要记录随机小对象到聚合对象的映射关系,这个映射一般采用 KV 数据库实现(一般基于 LSM 或 B+ 树实现,典型如 RockDB )。在存储海量数据时, KV 数据库的读写效率会成为影响性能的关键因素。
利用缓存(单层或多层)固然可以提升读写性能,但需注意由此引入的读写数据一致性的问题。比如,在多层级的读写缓存中,由于在写入过程中数据是自上而下(也是由高速到低速)逐层写入的,在读取数据时,为保证数据一致性,必须保证同一层级先写后读(先从写缓存寻找数据再从读缓存寻找数据),不同层级自上而下的原则。
对于由 N 个节点组成的分布式存储系统,主机应用可能通过网络,连接 N 个节点中的部分或全部节点,并行读写存储系统。所以,从理论上说,存储系统作为一个整体的性能不超过各个节点性能之和。要使系统到达高性能,从数据布局( data layout )的角度说,一方面要将数据充分打散存储,另一方面就是要将保证数据在存储介质上基本均衡。数据打散就是存储系统把来自主机应用的大块数据切割成小块,分散放置到不同节点的不同硬盘上,这就相当于以并行的方式访问硬盘,性能自然高。数据均衡则从概率的角度使得每块硬盘具有近似的访问几率,这样就从整体上可以发挥所有硬盘的能力,从而达到性能最佳值。
数据布局就是要把打散的定长数据块映射到系统中的某个硬盘上。映射的方法基本可以分成两类。一类是显示映射法,就是系统对于每个分块数据,根据硬盘的状态(容量、使用率等)显示地指定,并把这个映射关系记录下来形成映射表。之后,读写这块数据都要查询这个映射表。另一类方法是采用广义的 HASH 计算法,就是根据分块数据的特性(命名空间、 LUN 或文件名、地址偏移信息等)利用 HASH 函数以伪随机的方法映射到某个硬盘。这个映射关系不需要显示记录,因为 HASH 函数的计算极快,下次访问此数据块只要再计算一下就可以找到对应的硬盘。在分布式存储中常用的 DHT 、 CRUSH 等方法均属此类。
显示映射法和广义 HASH 法各有千秋。显示映射法可以设置灵活的数据布局策略,在数据均衡、迁移、数据耐久性变更等方面易于实现,但因为要显示的记录映射关系,不易处理海量数据。广义 HASH 法因不需要存储映射表,存储的数据量理论上可以无穷大,但其在数据均衡性、数据布局策略灵活变更等方面不及显示映射法。实际的分布式存储系统往往两种方法结合使用。
十多年前,存储系统的存储介质主要是 HDD 磁盘。因为 CPU 、内存和 HDD 性能的巨大差异,单颗 CPU 下可以挂数十块甚至上百块磁盘。随着 SSD 技术的长足进步(性能、容量不断增长,价格则不断下降), SSD 在存储系统中被广泛采用,全闪存储设备高速增长。SSD 和 CPU 都是基于半导体技术,性能差异已经显著缩小。目前商用的单块 NVMe SSD ( PCIe 4.0 )的带宽性能可达 6~8GB/s , IOPS 达数十万。这个性能是 HDD 的千百倍。对于存储系统来说,除了基本的读写之外,还需要提供 EC/RAID 计算、快照 / 克隆、数据重删、压缩、加密等增值功能,这些功能叠加在一起,对 CPU 的性能的要求急剧提升。这对以通用计算为目的设计的 CPU 来说就显得有些心有余而力不足。此时,就需要一些专用处理器做协议卸载,这些专用硬件如智能网卡、计算存储设备( Computational Storage Device )、 DPU ( Data Processing Unit )等。DPU 专为数据处理而设计,存储系统可以利用 CPU+DPU 的组合方案,把存储 IO 处理、纠删码计算、数据重删、数据压缩、加密等功能卸载到 DPU 上, CPU 只集中于系统控制面的功能。一些更加激进的公司甚至在存储系统中用 DPU 完全取代了 CPU 。从整个存储行业来看, DPU 的应用还处于起步阶段,后续随着 DPU 本身的不断发展,它会在存储系统中发挥越来越重要的作用。
存储系统的性能发挥不仅依赖于其本身,还与存储访问协议和网络相关。
常用的存储网络包括 FC 、 EHT/IP 、 IB 等。其中 FC 网络专为存储设计,在网络稳定性、可用性、时延等方面具有优势,但其速率不如 ETH 和 IB ,成本也高;IB 网络主要应用在超算领域,可为应用提供超高带宽,但其成本高,供应商少;ETH/IP 是数据中心最为广泛采用的网络技术,带宽高,成本低,但其在拥塞避免、拥塞控制、时延、易用性等方面不如 FC 。近几年, EHT 借鉴 IB 网络的 RDMA 方法,将 RDMA 承载在无损以太网上,发展了 RoCE ( RDMA over Converged Ethernet )方法。为了更好地和存储结合,一些厂商还在 RoCE 的基础上进行了增强,使其可用性(快速故障倒换)、易用性和丢包率等指标接近 FC 。
在访问协议上,传统存储主要以 SCSI 协议访问磁盘。SCSI 协议不能发挥 SSD 介质的高性能, NVMe 协议以及 NVMe-oF 协议应运而生。NVMe 协议面向 SSD 介质设备,在并发能力(队列数量、队列深度)和传输能力上均好于 SCSI 。NVMe-oF 协议兼容性好,可以使 NVMe 运行在多种网络上。
在实际部署中,将 NVMe 承载在 FC 上、 RoCE 上、以及 TCP 上是目前常用的方法。
五、 数据存储效率
随着数据量的高速增长,所需存储设备的空间越来越大。如何在固定的存储物理空间上存储更多的数据,就是数据存储效率问题。需要说明的是,高效的数据存储不能损害数据可靠性。常见的提升数据存储效率的方法包括精简配置、 RAID/EC ( Erasure coding )、重删、压缩等技术。下面对分布式存储中常用的纠删码( EC )、重删、压缩等技术做一简要说明。
纠删码
存储系统为了提高数据的容错能力,一般会采用多副本或者纠删码技术。纠删码比多副本有更高的存储效率,更加适合海量数据存储。
纠删码在数学上主要利用了伽罗华域( Galois Field ),使得其运算保持封闭性。纠删码是指将要存储的数据分割成小的数据块,通过算法将数据块进行编码生成校验数据块,然后把这些数据块(包括原始数据块和校验数据块)存储在不同的存储位置。相对单纯的副本方式,使用纠删码在同样的硬盘或节点配置下可以为用户提供更多的有效存储空间,盘的利用率更高。
纠删码配置比例一般用( k , m )标识。k 表示原始数据块数量, m 是校验数据块数量。
总数据块 n = 原始数据块 k + 校验块 m 。
纠删码存储空间利用率为 k/n ,例如系统 6 块硬盘,纠删码配置为( 4,2 )可以表示 6 个硬盘, 4 个存储数据, 2 个存储校验数据,存储空间利用率为 4/6=66.7% ;对应三副本存储,数据需要放置 3 份,存储空间利用率为 33.3% ;存储空间利用率率纠删码比副本多一倍。如果采用大比例纠删码,利用率可以进一步提升,甚至到 90% 以上!
和副本技术相比,纠删码的编码(存储)和解码(数据恢复)需要更多的 CPU 处理能力,同时,由于较多的分片(尤其是大比例纠删码)会产生较大的尾时延。分布式存储实际应用中,经常把副本和纠删码结合使用:为减少时延,数据首先以副本的方式存在缓存层,立即向应用返回 IO 成功,之后,再以异步的方式通过纠删码存储在后端介质上。
压缩
数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。数据压缩能够实现是因为多数现实世界的数据都有冗余,数据压缩的过程是去除多余的冗余数据。压缩的本质是对信息进行再编码,即使用另一种更简洁的方式重新表达。数据压缩技术可以分为两大类,一类是有损压缩,一类是无损压缩。存储系统中一般使用无损压缩。
无损压缩是指使用一定的算法对数据进行压缩,用压缩后的数据进行重构,可以恢复原始的数据信息,压缩前后信息不受损失。无损压缩广泛应用于文本数据、程序和特殊应用场合的图像数据等需要精确存储数据的压缩。在存储领域,除了通用压缩算法,还在研究基于特定场景和数据类型的专用算法,以期进一步提升数据存储效率。
重删
重复数据删除技术(简称“重删”)也是一种重要的数据缩减技术,通过对新数据与已存储数据进行对比分析,避免将已经存储在设备中的数据再一次存储,通过建立“索引”来将多份数据指向设备中已存在的数据,这样可以有效的节省存储空间。重复数据删除可优化冗余,而不会损坏数据保真度或完整性。重删本质上是一种压缩技术。
重删的基本流程如下图所示。
重复数据删除按数据处理时间可以分类为在线重删和后重删。在线重删是在数据存储到存储设备上的同时进行重复数据删除操作,在数据存储到硬盘之前,重复数据已经被去除掉了。后重删是在写到存储设备的同时不进行重删处理,先把原始数据写到盘上,随后启动后台进程对这些原始数据进行重删处理。与在线重删相比较,后重删需要更高的硬盘性能。
对分布式存储来说,存储海量数据一个关键技术是如何处理较大的指纹表。从数据重删步骤可以看出,在数据块长度固定的前提下,指纹库的大小和数据量成正比。举例来说:假定一个存储服务器包含 24 块硬盘,每块硬盘容量 4TB 。数据块采用定长方式,每块 8KB 。指纹生成采用 SHA1 算法,即每个指纹 20Byte 。在此情况下,计算可得,若存储服务器写满数据,指纹所需的内存空间为 240GB !这还仅仅是一个存储服务器的指纹容量。所以,在实际应用重删技术时,一般采用牺牲一部分数据存储效率,在内存中只存储“热指纹”的方法;另外,为了保证全局重删的效果,需要保证指纹库的分布式布局。
六、 安全性
任何 IT 系统都面临着安全威胁,既有传统安全威胁也有新兴的安全威胁。对于存储系统,除了网络安全威胁,如 IP 攻击、软件漏洞、病毒、木马、 ARP 欺骗、恶意插件等外,还面临着数据泄露、数据篡改、数据勒索等。这些安全威胁都需要通过技术控制手段,保证数据完整性、保密性和可用性。
传统的存储安全包括存储设备安全、存储网络安全、存储业务安全、存储管理安全等方面。存储设备安全包括操作系统加固、 Web 安全、补丁管理等;存储网络安全包括存储三网分离(管理网、业务网、存储网)、安全传输通道等;存储业务安全包括数据安全性、访问控制、认证的权鉴、防篡改等;存储管理安全则包括用户安全、密码安全、日志和告警管理等内容。