一.多副本及纠删码释义
1.多副本
顾名思义就是多个数据副本,简单来说就是一个数据拷贝多份完全一样的副本,分别存放在多个不同节点上。比如我们常用的3副本(如下图所示)就是将D这个数据拷贝了3份,分别存放在节点1、3、4上,这三个节点是在整个集群中随机选择的,下一个B数据有可能就放在节点1、2、4上了。
当节点1和3同时故障时,节点4上仍然会保存有A数据。以此类推,我们可以知道,N副本技术可以允许N-1个节点同时故障数据不丢失。如果是硬盘故障,只要故障硬盘的范围不超过N-1个节点,数据也不会丢失,比如节点1坏了3块盘、节点3坏了4块盘,数据仍然不会丢失。
2.纠删码
纠删码的英文全称是Erasure Code,所以有时我们也会简称为EC。纠删码顾名思义是一种纠正数据丢失的校验码,大家可以把它类比成一个方程组。我们如果知道4个数a、b、c、d,就可以通过2个不同的公式算出2个校验数据x和y,把6个数据一起保存起来,那么当a、b、c、d其中1个或2个数据丢失的话,就可以通过剩余的2个值和计算公式,反推出丢失的2个数据。比如:
已知:a+b+c+d=x=10,a+2b+3c+4d=y=20,c=2,d=1
那么:a+b=7,a+2b=10,则a=4,b=3
当然以上计算只是一个简化的方案,目的是帮助大家理解,真正存储中用的校验方式会比这个复杂得多,但效果是类似的。
如果我们用M+N表示纠删码的话,以上就是一个4+2的纠删码方案,数据会被切分成4个相同大小的分片,并通过校验算法生成2个同样大小的校验分片P和Q。比如32KB的数据会被切成4个8KB的分片,再生出2个8KB的分片,总计48KB数据。当6个数据分片生成后,它们会被随机存到6个不同的节点上(如下图所示)。
当任意2个节点故障时,数据是不会丢失的,因为只会丢失2个数据分片,还是可以反算出来的。当然如果同时故障了3个节点,4+2的纠删码是无能为力的,就像1个方程有2个未知数怎么也解不出来一样。而且4+2纠删码也可以允许2个节点内任意个数硬盘故障时,数据不丢失。比如节点1、节点2分别故障了5块硬盘,也完全不会有影响,因为每一组4+2分片都有4个分片还在,数据还是可靠的。
二.多副本与纠删码对比
三副本和EC纠删码作为分布式存储中常见的两种数据保护机制。由于EC纠删码存在比较严重的写放大问题,小块数据的写性能严重不足,通常仅适用于视频、备份、容灾等对IO性能要求不高的业务场景。在虚拟化、私有云、数据库等块存储场景,最常见的是三副本机制,即数据块按某种随机规则,保持在三个不同节点上的不同磁盘上。
对比项 | EC(N+M) | 三副本 |
空间利用率 | 至少66%,随N值增加,利用率提升 | 33% |
可靠性 |
机柜级安全:允许故障M个机柜或M个节点 服务器级安全:允许故障任意M个节点或N个硬盘 |
允许任意2机柜/2节点/2盘故障 机柜级安全:允许故障任意2个机柜 服务器级安全:允许故障任意2个节点 |
重构 | 数据需要通过EC解码后得到目标分片 | 直接从其他盘中拷贝后重建 |
SSD缓存寿命 | 业务IO相同情况,无效IO少,总写次数是三副本2/3,SSD缓存消耗少 | 业务IO相同情况,无效IO多,总写次数是EC1.5倍,SSD缓存消耗多 |