RAID5f: SPDK RAID5实现介绍

科技   2024-07-17 12:03   美国  

RAID5是一种流行的RAID级别,与RAID1(mirroring)功能类似,它可以保护阵列和单机多Disk部署中的数据免受单个Disk故障的影响,并且可以通过并行读取多个Disk来提高读取性能。它通常比RAID1更受欢迎,因为它“浪费”的存储容量更少 ---- 阵列可以有许多成员Disk,但总可用容量始终只会减少一个成员Disk的大小。因为RAID1通常只暴露一个成员Disk的容量。在最常见的2个成员Disk的RAID1情况下,这个比例为50%,它提供与RAID5相同的保护级别,即防止一个Disk发生故障。

RAID5的最大缺点一直是写入性能。每次写入阵列都会导致写入至少两个成员Disk,因为除了实际数据之外,还必须更新奇偶校验。奇偶校验是允许在Disk发生故障后恢复的冗余数据。它必须与其他Disk上的数据保持同步。但问题不在于额外的写入。毕竟,RAID1也必须复制写入。计算奇偶校验确实会增加一些开销,但仍然比访问存储快得多。真正的性能影响发生在写入导致读取-修改-写入循环时 ---- 要计算更新的奇偶校验,需要先从至少一个成员Disk读取一些数据。当RAID条带部分更新时会发生这种情况。

这里讲的RAID条带,把数据和奇偶校验在各个成员Disk之间分散存储。条带中包含在一个成员上的数据大小是可配置的,称为条带(又称块)strip_size大小。单个条带可以容纳的数据量等于strip_size * (n - 1),其中n是阵列中成员Disk的数量。下图显示了一个由4个Disk组成的阵列的示例布局,条带大小设置为 4 个块,因此条带大小(或宽度)为12个块:

写入小于条带大小的数据会导致读取-修改-写入,对性能不利,甚至在非正常关机和Disk故障的情况下导致静默数据损坏,这种现象称为RAID写入漏洞。出于这些原因,建议优化工作负载以避免部分条带写入,并尽可能使用完整条带写入。

使用SPDK RAID5f,我们不仅推荐全条带写入,而且直接要求接收到的IO。这就是RAID5f末尾的“f”所代表的含义:全条带写入,以区别于标准RAID5。无需支持部分条带更新,代码可以更简单,甚至可能更快。条带大小设置为Bdev的写入单元大小,并由Bdev层强制执行。可以使用API调用检索此值spdk_bdev_get_write_unit_size()。如果对RAID5f Bdev的写入未与条带对齐或不是条带的倍数,则 I/O 将失败。读取处理正常,没有此类限制。

显然,仅使用完整条带写入的要求会给应用程序带来额外的负担。在某些情况下,这可能不是问题,但在其他情况下,则需要进行重大更改。一个有趣的选择,也是 RAID5f 最初的主要动机,是将其与SPDK FTL Bdev[1]相结合。它可以在RAID5f之上工作,并且除其他优点外,由于其逻辑到物理 (L2P) 块映射,消除了在完整条带中发出写入的要求。

如果您想尝试RAID5f,请使用选项配置SPDK: ./configure --with-raid5f。您至少需要 3个任何类型的Bdev,但具有相同的块大小和元数据格式。它们的大小不必相等,数组成员大小将限制为最小的基本Bdev。创建 RAID5f Bdev 的示例命令是:

$ scripts/rpc.py bdev_raid_create -n raid_bdev0 -z 128 -r 5f -b "malloc0 malloc1 malloc2"

这将创建一个名为raid_bdev0的RAID5f SPDK Bdev,成员Disk是malloc0 malloc1 malloc2三个Malloc Bdev,其条带大小设置为128KiB,写入单元大小设置为256KiB。

SPDK RAID模块仍在积极开发中。一些重要功能(如重建和超级块支持)最近已合并,并在 SPDK 版本 24.01及后续版本中提供。未来还会有更多功能,我们鼓励您查看、分享反馈并提交您的更改!

参考文章:

[1]: SPDK FTL Bdev: https://spdk.io/doc/ftl.html 




转载须知

DPDK与SPDK开源社区公众号文章转载声明



推荐阅读

基于Fork实现SPDK nvmf_tgt的热升级
网易游戏采用英特尔®VROC优化RAID系统,实现降本增效



往期阅读

基于SPDK的Ublk和Vduse的用户空间块服务





DPDK与SPDK开源社区
最权威,最贴近DPDK/SPDK技术专家的社区。
 最新文章