脱敏说明:本文中出现的控制器序列号、SAS 地址、主机名等均替换为脱敏占位符;分区 UUID 为本次格式化后系统自动生成的新标识,仅用于本机内部,无历史数据残留含义。其他环境请以自己 blkid 的输出为准。

1. 背景与目标

某 Doris 分布式存储集群单节点的硬件配置:

  • 服务器:Lenovo ThinkSystem SR660
  • RAID 卡:Lenovo ThinkSystem RAID 940-8i 8GB Flash
  • 系统盘:2 × 2.2 TB SAS HDD(出厂 RAID1)
  • 数据盘:20 × 2.2 TB SAS HDD(出厂 4 个 RAID5)

Doris 的 BE 节点对数据盘的诉求是「OS 直控单盘」——不要在硬件层做 RAID0/RAID5 抽象,而是让每块 SAS 盘独立暴露给操作系统,再由 Doris 自身的多副本 / EC 机制处理副本与冗余。因此需要把数据盘从 RAID5 转为 JBOD。

操作目标:

  1. 保留 RAID1 系统盘(VD os-raid1
  2. 删除全部 4 个 RAID5 VD
  3. 把 20 块数据盘以 JBOD 形式暴露给 Linux
  4. 为每块盘建一个 ext4 文件系统并写入 /etc/fstab

2. 控制器与磁盘初始态

查看控制器总览:

./storcli64 /c0 show

关键信息:

Product Name = RAID 940-8i 8GB Flash
FW Package Build = 52.27.0-5215
FW Version = 5.270.02-3950
Driver Name = megaraid_sas
Driver Version = 07.727.03.00-rc1
Current Personality = RAID-Mode
Drive Groups = 5
Virtual Drives = 5

查看当前 RAID Personality:

./storcli64 /c0 show personality
Current Personality                RAID
Supported Personalities            JBOD
Behavior mode                      JBOD
Supported Auto Configure Behaviors NONE R0 JBOD

⚠️ 关键细节:虽然 Behavior mode = JBOD,但 Current Personality = RAIDPersonality 决定整卡运行形态,只有在「不存在任何 VD 配置」时才能切换;而 Behavior mode 跟当前差分开关有关,并非实际生效模式。

确认硬件能力:

./storcli64 /c0 show all | grep -i -E "JBOD|Personality|RAID"

输出节选:

Current Personality = RAID-Mode
Support JBOD = No                # 关键:不能 /c0 set personality=JBOD
Support Force Personality Change = Yes
Enable JBOD = No
RAID Level Supported = RAID0, RAID1(2 or more drives), RAID5, RAID6,
                     RAID00, RAID10(2 or more drives per span), RAID50, RAID60

Support JBOD = No + Enable JBOD = No 表示:在保留现有 RAID 配置的前提下,无法整卡切换到 JBOD Personality。但 RAID 940-8i 仍支持针对单盘set jbod,这就是本文采用的方式。

3. 当前阵列与磁盘清单

VD 列表(./storcli64 /c0/vall show):

DG/VD TYPE  State Access Consist Cache Cac sCC     Size Name
4/235 RAID5 Optl  RW     Yes     NRWTD -   ON  8.727 TB data-raid5
2/236 RAID5 Optl  RW     Yes     NRWTD -   ON  8.727 TB data-raid5
1/237 RAID5 Optl  RW     Yes     NRWTD -   ON  8.727 TB data-raid5
3/238 RAID5 Optl  RW     Yes     NRWTD -   ON  8.727 TB data-raid5
0/239 RAID1 Optl  RW     Yes     NRWBD -   ON  2.181 TB os-raid1

总共 5 个 VD:1 个 RAID1(VD239,系统盘,保留)+ 4 个 RAID5(VD235/236/237/238,数据盘,删除)。

磁盘拓扑节选(./storcli64 /c0/eall/sall show):

EID:Slt  DID  State  DG    Size     Model          Sp Type
251:0    24   Onln    0   2.181 TB  AL15SEB24EQ    U  -
251:1    19   Onln    0   2.181 TB  AL15SEB24EQ    U  -
251:2    25   Onln    1   2.181 TB  AL15SEB24EQ    U  -    # RAID5-1
251:3     9   Onln    1   2.181 TB  AL15SEB24EQ    U  -
...
251:21    5   Onln    4   2.181 TB  AL15SEB24EQ    U  -    # RAID5-4

Enclosure ID = 251,磁盘分布在插槽 0~21,共 22 块,统一型号 AL15SEB24EQ(2.2 TB SAS 12G HDD)。

阵列归属汇总:

VD 类型 容量 成员 Slot 处置
0/239 RAID1 2.181 TB 0, 1 保留(系统盘)
1/237 RAID5 8.727 TB 2, 3, 4, 5, 6 删除
2/236 RAID5 8.727 TB 7, 8, 9, 10, 11 删除
3/238 RAID5 8.727 TB 12, 13, 14, 15, 16 删除
4/235 RAID5 8.727 TB 17, 18, 19, 20, 21 删除

⚠️ 再次强调:v239(os-raid1)一口都不要碰。一旦把系统盘删了,宿主机直接失联。

4. 删除 4 个 RAID5

storcli 删 VD 的语法:

./storcli64 /c0/v<VD号> delete force

依次执行:

./storcli64 /c0/v235 delete force
./storcli64 /c0/v236 delete force
./storcli64 /c0/v237 delete force
./storcli64 /c0/v238 delete force

每条都会返回 Status = Success / Delete VD succeeded。删除后对应 RAID5 成员盘的状态会从 Onln 变为 UGood(Unconfigured Good),进入「未配置」状态。

☢️ 真实的坑:本次环境中 4 个 RAID5 曾经被聚合成一个 LVM 卷组 vg--es--warm01。删除 VD 时 lsblk 会显示残留 PV 映射:

text sdc → vg--es--warm01-lv--es--warm01 (34.9T) sdd → vg--es--warm01-lv--es--warm01 (34.9T)

删 VD 之前务必先处理 LVM:

  1. vgs / lvs / pvs 检查卷组与 PV 归属
  2. lvchange -an 停用 LV → vgremove 删卷组 → pvremove 清 PV 元数据
  3. 否则 LVM 元数据残留会让后续 set jbod 后部分盘仍带 LVM2_member magic,wipefs -a 才能去除

本案例数据盘 VG 在前置流程已清空,所以可直接删除 VD。

5. 删除后磁盘状态

./storcli64 /c0/eall/sall show
251:0  Onln   0   2.181 TB  ...  -    # 系统盘保留 RAID1
251:1  Onln   0   2.181 TB  ...  -
251:2  UGood  -   2.181 TB  ...  -    # UGood = 未配置
251:3  UGood  -   2.181 TB  ...  -
...
251:21 UGood  -   2.181 TB  ...  -

20 块盘全部转为 UGood,符合预期。

6. 尝试整体切换 JBOD Personality(失败)

理论上整卡切到 JBOD Personality 后,所有 UGood 盘自动以裸盘形式暴露。试一下:

./storcli64 /c0 set personality=JBOD

返回:

Status = Failure

ErrMsg: Requested operation cannot be performed because of existing configuration
ErrCd = 152

原因:RAID1 系统盘仍存活。RAID 940-8i 不允许「存在任何 VD 的同时切换 Personality」。

可行路径有两条:

  1. 整卡切 JBOD:把 RAID1 也删掉,全卡切 JBOD,再把系统盘也用 JBOD 方式跑——风险大,本环境不选
  2. 单盘 set jbod:保留 RAID1 VD,对每块 UGood 盘显式打 JBOD 标记——保系统 + 改数据,本案例采用

7. 单盘转 JBOD

storcli 对单盘设置 JBOD 的语法:

./storcli64 /c0/e<ENCLOSURE_ID>/s<SLOT> set jbod

本环境的 Enclosure ID = 251,需要对 Slot 2 ~ 21 共 20 块盘批量操作:

for slot in {2..21}; do
    state=$(./storcli64 /c0/e251/s${slot} show | grep -E "UGood|JBOD")
    echo "Slot ${slot} current: ${state}"
    ./storcli64 /c0/e251/s${slot} set jbod
done

每条会返回 Set Drive JBOD Succeeded。每块盘状态从 UGood 变为 OnlnType 列从 - 变成 JBOD,容量也从 2.181 TB 变成 2.183 TB——RAID 元数据占用的那点空间还回来了。

这是逐盘显式启用 JBOD,与「整卡 Personality = JBOD」是两条路:

  • 整卡 Personality 切换:要求配置清零,OS 视 RAID 卡为 HBA;
  • 单盘 set jbod:在 RAID Personality 下也能对 UGood 盘操作,把该盘标记为「直通」并直接暴露给 OS。

8. 验证 JBOD 与 Linux 磁盘映射

验证控制器侧:

./storcli64 /c0/eall/sall show

预期:

251:0  Onln   0   2.181 TB  ...  -      # RAID1
251:1  Onln   0   2.181 TB  ...  -
251:2  Onln   -   2.183 TB  ...  JBOD
251:3  Onln   -   2.183 TB  ...  JBOD
...
251:21 Onln   -   2.183 TB  ...  JBOD

验证 OS 侧:

lsblk

预期输出(节选):

sde  8:64    0  2.2T  0 disk          # RAID1 (os-raid1) 暴露的系统盘
├─sde1 ...
├─sde2 /boot
└─sde3 → vg_root/lv_root  /
sdf  8:80    0  2.2T  0 disk          # JBOD 盘,每块独立 /dev/sdX
sdg  8:96    0  2.2T  0 disk
sdh  8:112   0  2.2T  0 disk
...
sdy  65:128  0  2.2T  0 disk
  • sde 是 RAID1 系统盘(含 /boot 与根 LV)
  • sdf ~ sdy 共 20 块独立 JBOD 盘,每块约 2.2 TB

设备号从 8:80 递增到 65:128——主设备号从 8 翻到 65,因为单个 major 最多容纳 16 个 minor,符合预期。

9. 文件系统与 fstab 落地

接下来让 20 块盘在重启后自动挂载到 /data/hdd1 ~ /data/hdd20

单盘统一流程

  1. wipefs -a 清掉残留 magic(防 LVM/RAID 元数据误识别)
  2. parted 建 GPT + 全盘分区
  3. mkfs.ext4 格式化
  4. blkid 取 UUID
  5. 写入 /etc/fstabUUID=... /data/hddN ext4 defaults 0 2
  6. mount -a 测试

参考批量脚本(保存为 format_disk.sh,逐盘确认):

#!/bin/bash
# format_disk.sh —— 统一格式化 JBOD 盘 + 写入 fstab
set -e

# 手工列出更稳妥,避免误伤系统盘
DEVS="/dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk /dev/sdl /dev/sdm \
      /dev/sdn /dev/sdo /dev/sdp /dev/sdq /dev/sdr /dev/sds /dev/sdt /dev/sdu \
      /dev/sdv /dev/sdw /dev/sdx /dev/sdy"

echo "WARNING: The following disks will be formatted:"
echo "$DEVS" | tr ' ' '\n'
read -p "Continue? (yes/no): " ans
[ "$ans" = "yes" ] || { echo "Abort."; exit 1; }

i=1
for dev in $DEVS; do
    mnt="/data/hdd${i}"
    echo "================================"
    echo "Processing ${dev}  ->  ${mnt}"
    echo "================================"
    wipefs -a "$dev"
    parted -s "$dev" mklabel gpt
    parted -s "$dev" mkpart primary 0% 100%
    udevadm settle
    mkfs.ext4 -F "${dev}1"
    mkdir -p "$mnt"
    uuid=$(blkid -s UUID -o value "${dev}1")
    echo "UUID=${uuid} ${mnt} ext4 defaults 0 2" >> /etc/fstab
    i=$((i+1))
    sleep 1
done

echo "Mounting..."
systemctl daemon-reload
mount -a
df -Th | grep '/data/hdd'
echo "Done."

执行后 /etc/fstab 末尾追加 20 行:

UUID=9a63ead7-115c-47f5-8bda-b513d4b5196b /data/hdd1  ext4 defaults 0 2
UUID=07360e75-e58f-4e86-876a-9260e3253107 /data/hdd2  ext4 defaults 0 2
UUID=0f8f2ccf-a3b5-4789-b96b-820adc482de2 /data/hdd3  ext4 defaults 0 2
...
UUID=ccc1fb6e-8495-4db8-a3ea-a0d09a23e7ee /data/hdd20 ext4 defaults 0 2

说明:上面出现的 UUID 是本次格式化产生的全新文件系统标识,仅作示例,其他环境请以自己 blkid 的输出为准。

ext4 vs xfs 选型:Doris BE 在大并发随机写场景下与 ext4 的 delalloc + data=ordered 配合更稳定;如果偏写密集顺序大文件场景,xfs 也是合理选择。

10. 重启验证

sync
reboot

重启后确认:

lsblk
df -Th

20 块盘全部按 fstab 自动挂载到 /data/hdd1 ~ /data/hdd20。用 fio / dd 跑基准时单盘吞吐约 200~230 MB/s,2.2 TB SAS 12G HDD 的正常水平。

11. 关键经验复盘

11.1 为什么不直接 set personality=JBOD

整卡 Personality 切换要求配置清零:任何残留 VD(哪怕是系统盘 RAID1)都会触发 ErrCd 152

如果非要走整卡 JBOD 这条路:必须先把 RAID1 删掉 → 切 JBOD → 再用 JBOD 方式跑系统盘。但开机节点的系统盘走 RAID1 安全性更合适,因此保留 RAID1 + 数据盘 JBOD 才是稳妥的组合。本案例最终采用「单盘 set jbod」。

11.2 Personality 与 Drive JBOD 的差异

操作粒度 命令 前提 适用
整卡 /c0 set personality=JBOD 无任何 VD 全卡纯直通,OS 视 RAID 卡为 HBA
单盘 /c0/eE/sS set jbod 盘处于 UGood 混合模式:保留 RAID + 部分单盘直通

对 Doris 这类需要 OS 直控单盘的分布式存储,单盘 JBOD 比「整卡转 HBA」更灵活——可以同时在一张卡上既保护系统盘(RAID1),又把数据盘裸给上层使用。

11.3 数据安全 checklist

执行前必须确认:

  • [ ] 数据已备份或已迁出
  • [ ] 应用层服务已停(Doris BE 已 decommission 或停掉当前节点)
  • [ ] LVM 卷组已 vgremove(避免 VD 删除后 LVM 残留映射)
  • [ ] /etc/fstab 中老的数据盘挂载已注释或删除
  • [ ] 系统盘 RAID1 VD(本文为 v239)不会被误删

11.4 这是 Doris 推荐的部署姿势

Doris 官方对 BE 节点磁盘的建议:

  • 用 JBOD 或 HBA 模式把数据盘独立暴露给 OS
  • Doris 自身通过 storage_root_path 在 BE 内部管理多盘 + 副本
  • 不要再用 RAID0/RAID5 在硬件层做聚合——会干扰 Doris 自身负载均衡,且一次坏盘会触及整组

12. 最终架构

RAID 940-8i
├── RAID1 (VD239 os-raid1) - Slot 0,1 - 系统盘
│   └── / + /boot
└── JBOD × 20 - Slot 2 ~ 21
    ├── /dev/sdf → /data/hdd1  (ext4)
    ├── /dev/sdg → /data/hdd2  (ext4)
    │   ...
    └── /dev/sdy → /data/hdd20 (ext4)

Doris BE
└── storage_root_path = /data/hdd{1..20}
    └── Doris 自身负责副本与 EC

13. 命令速查

# 查看控制器
./storcli64 /c0 show
./storcli64 /c0 show personality
./storcli64 /c0 show all | grep -iE 'JBOD|Personality|RAID'

# 查看阵列
./storcli64 /c0/vall show
./storcli64 /c0/eall/sall show

# 删除 RAID5 VD(保留 v239!)
./storcli64 /c0/v235 delete force
./storcli64 /c0/v236 delete force
./storcli64 /c0/v237 delete force
./storcli64 /c0/v238 delete force

# 单盘转 JBOD
for slot in {2..21}; do
    ./storcli64 /c0/e251/s${slot} set jbod
done

# 验证
./storcli64 /c0/eall/sall show
lsblk
df -Th

本文基于一次真实环境改造操作整理,主机名、控制器序列号、SAS 地址均已脱敏。命令在不同 FW 版本(本文 FW Package Build 52.27.0-5215)下输出细节略有差异,执行前请对照本机 storcli64 /c0 show 实际输出。

文章作者: emporer
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Emporer-Linux
喜欢就支持一下吧