重建mdadm RAID作为DRBD后端存储时出现容量不匹配错误的技术问询
几年前我用原生Debian Linux搭建了一套存储集群,用mdadm RAID做后端存储,搭配Debian官方提供的DRBD 0.8版本。目前集群里有两个RAID6卷,分别由2TB和14TB的磁盘组成。
之后我给两个节点都新增过磁盘、替换过故障盘,也完成了多轮Debian系统版本升级。
故障排查背景
最近主节点01出现了异常高负载和大量KO超时问题,我通过iostat -x 2命令观察磁盘状态,发现有一块磁盘的平均队列长度会时不时飙升,远高于其他磁盘的数值。为了隔离故障源,我手动将从节点02切换为活动主节点,然后逐个断开DRBD的网络连接,最终定位到问题出在原主节点01的其中一个RAID卷上。
我用smartctl -t long对磁盘做了扩展健康检测,再通过smartctl -a查看检测结果,并没有发现能预示磁盘即将故障的明显异常数值。
容量不匹配问题出现
为了排除那块可疑磁盘的影响,我把目标RAID卷重建为RAID5,暂时将可疑磁盘排除在外。之后我用默认参数创建新的DRBD元数据(drbdadm create-md resname),并强制从节点02作为同步源,结果在节点02的日志里看到了如下报错:
The peer's disk size is too small! (39066455672 < 39066476152 sectors)
The new volume is 20,480 sectors too small!
对比两个节点通过mdadm --detail输出的阵列参数:
| 节点 | 阵列容量(块) | 单设备使用容量(块) |
|---|---|---|
| 01 | 19,533,834,240 | 1,953,382,400 |
| 02 | 19,533,824,000 | 1,953,383,424 |
之后我又把阵列重新创建回原来的RAID6模式,但容量差异依然存在。对比两个节点的mdadm --detail输出,diff结果如下:
--- 01 2023-01-19 13:37:48.552858896 +0100 +++ 02 2023-01-19 13:34:58.098143189 +0100 @@ -1,17 +1,17 @@ /dev/md4: Version : 1.2 - Creation Time : Thu Jan 19 13:37:11 2023 + Creation Time : Fri Nov 26 11:23:33 2021 Raid Level : raid6 - Array Size : 19533824000 (18628.91 GiB 20002.64 GB) - Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB) + Array Size : 19533834240 (18628.92 GiB 20002.65 GB) + Used Dev Size : 1953383424 (1862.89 GiB 2000.26 GB) Raid Devices : 12 Total Devices : 12 Persistence : Superblock is persistent Intent Bitmap : Internal - Update Time : Thu Jan 19 13:37:24 2023 - State : clean, resyncing + Update Time : Thu Jan 19 13:34:11 2023 + State : active Active Devices : 12 Working Devices : 12 Failed Devices : 0 @@ -22,22 +22,20 @@ Consistency Policy : bitmap - Resync Status : 0% complete - Name : 4 - UUID : 4a730173:b97ac886:8194cbed:f30861d2 - Events : 3 + UUID : d6e60c19:5b08166e:a6b78c2b:a2676f7d + Events : 4580 Number Major Minor RaidDevice State 0 8 0 0 active sync /dev/sda 1 8 16 1 active sync /dev/sdb - 2 8 64 2 active sync /dev/sde + 2 8 48 2 active sync /dev/sdd 3 8 32 3 active sync /dev/sdc - 4 8 48 4 active sync /dev/sdd - 5 8 80 5 active sync /dev/sdf - 6 8 144 6 active sync /dev/sdj - 7 8 240 7 active sync /dev/sdp - 8 8 128 8 active sync /dev/sdi - 9 65 0 9 active sync /dev/sdq - 10 8 176 10 active sync /dev/sdl + 4 8 80 4 active sync /dev/sdf + 5 8 128 5 active sync /dev/sdi + 6 8 112 6 active sync /dev/sdh + 7 8 144 7 active sync /dev/sdj + 8 8 160 8 active sync /dev/sdk + 9 8 176 9 active sync /dev/sdl + 10 8 192 10 active sync /dev/sdm 11 8 208 11 active sync /dev/sdn
当我尝试强制使用节点02的单设备容量值创建阵列时,mdadm抛出了如下错误:
mdadm: /dev/sda is smaller than given size. 1953382400K < 1953383424K + metadata
而且不止/dev/sda,多块磁盘都出现了这个提示。我很困惑,之前这个阵列明明能正常运行,现在mdadm却提示磁盘空间不足?
我的疑问
- 为什么新重建的阵列每个磁盘少用了1024块空间?我从来没使用过
mdadm -z max选项,测试发现就算加上这个参数,单设备使用容量还是停在1953382400块。 - 有没有办法通过指定mdadm的兼容性参数,强制创建出足够容量的阵列,让它能再次作为DRBD的后端存储?
备注:内容来源于stack exchange,提问作者PoC

