EC纠删码与多副本区别
EC纠删码与多副本区别
EC纠删码
Erasure Coding(简称EC,即纠删码)是一种冗余保护机制,通过计算校验片的方式实现数据冗余保护。与RAID区别在于,EC可以避免节点发生故障时无法有效恢复数据的问题。
原理
在写入数据时,将数据切分为N个数据块(N为偶数),通过EC编码算法计算得到M个校验块(M取值2、3或4)。将N+M个数据块和校验块存储于不同的节点中,组成一个条带,即使故障M个节点或M块硬盘,系统仍可正常读写数据。
空间利用率计算公式为N/(N+M),N越大,空间利用率越高;数据的可靠性由M值的大小决定,M越大可靠性越高。例如,4+2配比的空间利用率可达66.7%。
EC配比方式
- (4+2):允许2块硬盘或者2个节点同时发生故障
- 折叠(4+2:1):允许2块硬盘,1个节点同时发生故障
场景1:正常EC读写场景
当存储节点的个数≥N+M时采用N+M冗余配比,当(N+M)/M≤存储节点的个数<N+M时采用N+M:1冗余配比。
以N=4、M=2、存储节点个数=7为例:
- 写原理:用户写入数据Data后被系统切分为4个数据块(D1~D4),同时通过EC编码得到2个校验码(C1-C2),系统将6个数据块随机存入6个节点中。
- 读原理:系统从4个节点的不同硬盘中读取数据块(D1~D4),并通过Copy的方式将这4个数据块拼装成Data返回给用户。
以N=4、M=2、存储节点个数=5为例:
- 写原理:用户写入数据Data后被系统切分为4个数据块(D1~D4),同时通过EC编码得到2个校验码(C1-C2),系统将6个数据块随机打散存放在5个节点中。另外,5个节点中的Node3存放了2个数据块,故障1个节点硬盘池的业务仍可正常运行。
- 读原理:系统从3个节点的不同硬盘中读取数据块(D1~D4),并通过Copy的方式将这4个数据块拼装成Data返回给用户。扩容后,当存储节点数量≥N+M时,系统会通过后台自动均衡将N+M:1展开为N+M。
场景2:故障场景时EC读写原理
- 当故障后的剩余存储节点数量≥N+M,系统会重新分配一个新节点组成N+M冗余,保证数据冗余不降低。
- 当故障后的剩余存储节点数量<N+M时,在故障恢复前系统会将新写入的数据缩列为(N-1)+M配比(最小可缩列为N/2+M),保证IO不中断的同时可靠性级别不降低,故障恢复后,系统冗余配比恢复为N+M。
以N=4、M=2、存储节点个数=6为例,数据Data1在以4+2的冗余配比写入过程中,EC成员节点突然故障,此时为了保证可靠性不变,系统将新写入的数据Data2缩列为3+2冗余配比。
故障场景写原理(N+M:1冗余配比):当故障1个节点或M块硬盘后,系统仍然将N+M个数据块和校验块写入所有正常节点中。
数据读取原理:当EC成员节点或成员盘故障时,系统会读取任意N个数据(不管是数据分片还是校验分片),通过EC解码恢复数据。
以N=4、M=2为例:
- 冗余配比N+M:Node6和Node5发生故障,无法读取该节点的数据块D2和校验块C1,系统会从其他正常节点读取4个数据D1、D3、D4和C2,并通过解码获取Data返回给用户。
- 冗余配比N+M:1:Node3发生故障,无法读取该节点的数据块D2、D3,系统会从其他正常节点读取4个数据D4、D1、C1和C2,并通过解码获取Data返回给用户。
场景3:故障场景时EC数据重构原理
当系统的EC成员盘或成员节点发生故障后,将读取其他正常盘的N个数据,通过解码的方式获取故障盘的数据块并将其存放至其他正常盘中。
根据不同的故障场景,会采取不同的重构策略:
- 当硬盘发生故障时,硬盘池等待15分钟后启动数据重构。
- 当节点发生故障时,硬盘池还存在冗余保护时,延迟7天启动数据重构;当硬盘池不存在冗余保护时,延迟24小时启动数据重构。
例如,6节点场景,EC冗余配比4+2,当故障1个节点,7天后启动数据重构;故障2个节点,24小时后启动数据重构。
多副本
多副本机制的原理是将同一份数据复制保存为2~3个副本。针对系统中的每1个卷,默认按照1MB进行分片,分片后的数据按照DHT算法保存集群节点上。
例如,对于节点Server1的磁盘Disk1上的数据块P1,它的数据备份为节点Server2的磁盘Disk2上的P1’,P1和P1’构成了同一个数据块的两个副本。
当P1所在的硬盘故障时,P1’可以继续提供存储服务。
总结
特性 | EC | 多副本 |
---|---|---|
空间利用率 | 2+2可达91.6% | 2副本可达50% |
灵活性 | 按需扩展 | 比较固定 |
读写性能 | 劣 | 优 |
成本 | 优 | 劣 |
综上所述,EC和多副本各有优缺点,选择哪种方式取决于具体的应用场景和需求。在需要高效利用存储空间且对读取性能要求不高的冷数据存储场景中,EC是更好的选择;而在需要高读写性能和可靠性的场景中,则应该考虑使用多副本架构。