随着 SMTX ZBS 5.6 的发布,SmartX 分布式存储也引入了对纠删码(EC)机制的支持能力,帮助用户以更高效的空间利用实现数据冗余保护。在 SMTX ZBS 5.6 解读文章中,我们简单介绍了 EC 与副本的区别;本期,我们将深入解读 SMTX ZBS 5.6 中 EC 机制设计与配置方案,并提供不同场景下采用 EC 与副本机制的分布式存储性能表现,供用户参考。
EC 机制与流程
EC 通过对多个数据块(k)计算校验块(m),无需完整地存放数据副本,从而节省存储空间。在部分数据块损坏后(≤m),通过 k 个可用的数据块和校验块可以重建出损坏的数据。
相关概念
- 数据块(Data Block):原始数据块。
- 校验块(Parity Block):原始数据块通过纠删码算法计算得到的冗余数据。
- 编码块(Coded Block):数据块和校验块统称为编码块。
- 纠删码条带(Stripe):(K+M)个编码块的集合,一个条带包含多个数据块和校验块。
EC 需要搭配存储分层模式进行使用。对于新写入数据,数据块以副本的形式写入缓存层(m = 1 时 2 副本,m ≥ 2 时 3 副本),每个副本分配在不同的节点。随后系统会根据数据访问频率,针对不经常访问的数据计算校验块,并将数据块与校验块下沉至容量层,以 EC 2+1 为例,每 2 个数据块与 1 个校验块组成 1 个 EC 条带,同一条带内的编码块将被分配到不同的节点上。
在读取数据时,若数据在缓存层,系统将直接读取副本数据。若数据在容量层,系统会读取 EC 数据块。频繁被读取的编码块会被提升至读缓存层,保证数据的读取性能。
在编辑数据时,若数据在性能层,系统会直接对多个数据副本进行修改。若数据已下沉至容量层,新数据会先以副本形式写入缓存层,在下沉时更新所有/对应的数据块和校验块。
当发生故障(故障节点/物理盘数量在容错范围内),系统会使用存活的编码块重建丢失的编码块,并将其放置到不包含条带中编码块的节点上。此时数据块无法直接满足读取需求,系统会尝试随机读取条带中的 k 个数据块或校验块,通过解码得到所需的数据块。
在运维场景下,如卸载物理盘或移除节点,系统也会自动触发数据迁移,将物理盘/节点上的编码块迁移到其他物理盘或不包含条带中编码块的节点上。
EC 配置与冗余保护能力
由于 EC 并不存放完整的冗余数据块,在相同的容错能力下,与副本相比,EC 可以大大节省存储空间,但需要更多的节点数来放置编码块,并保证节点故障后,剩余节点可用于恢复编码块。在容错能力相同的情况下,EC 的数据块数量越大,空间利用率越高,需要的节点数也越多。
* EC 机制下,数据冗余配置为 k+m,空间利用率为 k/(k+m),节点数最小配置为 k+m+1,节点数推荐配置为 k+m+m。
目前 ZBS 5.6 的 EC 机制下,容错能力(m)支持设置为 1-4(推荐设置为 1 或 2),不同设置下可容忍的故障场景与集群主节点数有关,也和缓存层和容量层的冗余策略有关,具体对应情况如下:
数据块数量(k)仅支持设置为偶数,以保证较好的 I/O 拆分。例如,卷的条带大小是 256KiB,EC 块大小是 4KiB,k 为偶数可以保证卷拆分后对应多个全条带。m = 1 或 2 时,k 可设置为 2 – 22 间的偶数;m = 3 或 4 时,k 可设置为 4 – 8 间的偶数。因此,SMTX ZBS 5.6 目前支持 28 种配比方案。此外,EC 22+1 可达到 96% 的空间利用率,EC 22+2 则可达到 92%。
对于配比方案的选择,建议用户尽可能使用更加可靠的存储策略,若同时可使用多个可靠性相当的策略,可以选择空间利用率更高的配置。
在节点数的配置上,EC 机制需要的节点数最小为 k+m+1。该配置可满足 1 个节点故障后,剩余节点可将数据恢复至期望的状态;其他可容忍的故障场景下,可通过存活的编码块读取数据。当 m > 1 时,为了提升可靠性,推荐将节点数配置为 k+m+m,满足 2 个节点或 m 块数据盘故障后,剩余节点可将数据恢复至期望的状态。对于不同的节点数量,推荐的 EC 配置如下:
另外,如用户需要从主机级别的容错能力提升到机箱/机架级别的容错能力,需要将节点放置到不同的机箱/机架,这对机箱/机架数量会有更高的数量要求。
EC vs. 副本:性能表现与适用场景总结
不同的数据冗余策略对集群性能有怎样的影响?在 EC 和副本机制下,新数据的写入均以副本的形态写入写缓存,且在数据未下沉时,系统直接读取写缓存中的数据,因此在这两个情况下,两种冗余机制在存储性能方面没有明显差别。
而对于数据下沉再提升到读缓存后的读性能,由于 EC 需要跨节点读取数据,读性能会比未下沉前的读性能有所降低;而副本由于具备 I/O 本地化能力,数据下沉前与数据下沉后再提升的性能一致。
在故障场景下,两个机制下存储性能都会有所降低:副本机制下系统会直接读取存活的数据副本,因为是跨节点读取会产生性能下降;EC 机制下损坏的数据需要先通过可用的编码块计算出数据块再读取,也会有性能损失。下列图表展示了故障场景下数据在容量层(未提升到缓存之前)时的读取性能,测试环境采用 HDD 作为数据盘,此时的性能瓶颈是 HDD,纠删码机制可以利用多个节点进行读取,因此,纠删码的击穿性能优于副本。
综上,纠删码机制的写入性能及热数据的数据读取性能与副本机制相当,在少部分场景下,副本机制的读性能优于纠删码机制,对于数据库等性能敏感型应用,仍然建议采用副本机制。
总结 – 副本 vs EC 能力及适用场景
典型案例
下面,我们以一个实际的案例情况,展示副本与纠删码机制下所需的节点数量与配置情况。
项目要求
- 性能要求:8K 随机读写(r:w = 7:3)2500 IOPS / TB,每 TB 裸容量混合读写总 IOPS 至少 2500
- 容错能力:2
- 接入协议:NVMe over RDMA
- 存储协议:RDMA
- 物理盘介质:全闪 NVMe SSD
- 集群可用容量:550TB
配置方案
1. 根据系统空间占用计算单节点可用存储容量
(1)已知:
- 单节点混合读 IOPS 162.80K,混合写 IOPS 69.75K,混合读写总 IOPS 232.55K(性能与硬件配置有关,仅供参考)
- 要求单 TB IOPS > 2500
- 节点裸容量最大为 232.55K / 2500 ≈ 93TB
(2)单节点可配置 14 块 6.4TB 的 NVMe SSD,裸容量为:6.4TB * 14 = 89.6TB,单 TB 裸容量的 IOPS = 232.55K / 89.6 ≈ 2595 IOPS,满足性能要求
2. 根据系统空间占用计算单节点可用存储容量
(1)在全闪不分层模式下,每个节点至少需配置 2 块含元数据分区的数据盘,剩余盘配置为数据盘:
- 含元数据分区的数据盘,单盘系统占用 305GiB
- 数据盘,单盘系统占用 20GiB
- 单节点系统占用:305 * 2 + 20 * 12 = 850GiB = 0.83TiB = 0.91TB
- 因此,单节点可用于存储的空间为 89.6 – 0.91 = 88.69TB
(2) 在单一类型 SSD 全闪分层模式下,每个节点 10% 用作写缓存:单节点可用于存储的空间 = 88.69 * 0.9 ≈ 79.82 TB
3. 假设采用 3 副本策略,计算集群最小节点数
- 采用全闪不分层模式
- 3 副本对应的空间利用率为 33%
- 可用容量 550TB 时,最小节点数 = 550TB/0.33/88.69 ≈ 18.6,需配置 19 个节点。
4. 假设采用 EC 策略,计算集群最小节点数
- 采用单一类型 SSD 全闪分层模式
- 可用容量 550TB 时,采用不同的 EC 配比,最小需配置的节点数如下表所示,其中采用 EC 6+2 时需配置的节点数最少:
总结:与 3 副本相比,采用 EC 6+2 配置,可以在满足容量、性能和容错能力要求的同时,使用更少的节点数,与副本相比 ,可以节省 9 个节点,大幅降低硬件投入成本。
除了 EC 机制,SMTX ZBS 5.6 也新增了对于文件存储的支持能力,可作为统一的企业存储平台,为用户提供高性能、高可靠、易运维的分布式块存储与文件存储服务。欲深入了解,欢迎点击下载《SmartX 分布式存储产品组合介绍》。