有一次,我被叫去处理一台机架式存储服务器的问题。现场工程师很笃定地跟我解释:JBOD嘛,就是把两块盘串起来,RAID 0是并着跑,串着跑能变大,并着跑才提速。这话听起来好像没毛病,但真正从底层一看,问题远没有那么简单。RAID 0的条带化和JBOD的串联,虽然经常被放在一起比较,甚至在部分阵列界面里只有一字之差,但它们的数据布局、性能特征、故障爆炸半径完全是两套逻辑。这台机器最后的处理方案也让我意识到,很多人对这两个词的误解,远比想象中深。
这篇文章就从我实际排查和部署存储的经历出发,把条带化与串联这两条技术路线的本质差异讲透。我不打算给你背教科书定义,而是直接从数据在磁盘上怎么摆、请求下来后控制器怎么切、盘坏了之后你能救回什么东西这几个角度聊,顺便把选型时容易被忽略的坑也排一排。
1. 先澄清概念:JBOD 所谓的“串联”,物理链路上根本不存在
1.1 我在一次故障排查中听过的离谱说法
那次故障其实不算复杂,机器上原本有两块 4TB SAS 盘,客户想扩一个视频存储卷,新加了两块 8TB 盘。实施同事在 RAID 卡 BIOS 里看到两个选项,一个 RAID 0,一个 JBOD,他犹豫了一下选了 JBOD,理由是“JBOD 就是把盘串起来,容量可以变大,RAID 0 也是把两个盘当一块用,似乎差不多”。
结果视频服务跑起来后,新卷的写入速度始终只有单盘水平,客户质疑硬件有问题。我去现场后先做了两件事:第一,看 RAID 卡里虚拟磁盘的拓扑;第二,查系统层识别到的磁盘设备。结果发现,这块 RAID 卡上的“JBOD”并不是把两块盘拼成一个卷,而是把两块盘分别透传给操作系统,系统层看到的是 /dev/sdb 和 /dev/sdc 两块独立盘,根本没有组成一个跨盘设备。同事做的“扩容”只是在 Linux 里把第二块盘单独格式化、挂载到另一个目录,跟原来的存储池毫无关系。
这个案例非常典型,因为它暴露了 JBOD 这个词在行业里的混乱用法:一部分设备管 JBOD 叫“多块盘组合成一个大线性卷”,另一部分设备管 JBOD 叫“把物理盘直接透传给操作系统”。两种语义完全不同,做出来的效果也完全不同。
1.2 JBOD 在不同厂商实现下的两种面孔
从字面上看,JBOD 是 Just a Bunch Of Disks,意思就是“一堆盘”。传统存储阵列和直通 HBA 卡场景里,JBOD 通常指每块物理盘被独立识别,操作系统直接拿到原生的块设备,盘上的 SMART 信息、扇区重映射数据都直通给系统。这种模式下,控制器不做条带、不做校验、不合并容量,RAID 卡本质上退化成一个端口扩展器。
另一类实现出现在很多 NAS 和部分入门级阵列上。你在群晖、威联通或者某些国产存储设备里建立存储池时,如果选“JBOD”,系统实际做的是把多块物理盘按顺序拼接成一个逻辑卷。现代 Linux 里对应的概念是 md 驱动的 linear mode,Windows 磁盘管理里叫“跨区卷”。注意,这里所有盘被绑定成一个块设备,操作系统看不到单盘,只能看到一个总容量叠加的大卷。
搞清楚这两种面孔之后,你才能理解为什么大家总把 JBOD 和“串联”混在一起说。实际上,物理链路上没有任何一场“串联”。SATA/SAS 盘都接在背板的端口上,控制器通过端口选择器分时访问每一块盘,电学意义上这些盘是并联在总线上的。所谓串联,只是逻辑卷层面的“数据线性拼接”:第一块盘满了才写第二块。
1.3 RAID 0 的条带化到底怎么工作
RAID 0 虽然名字里有 RAID,但它完全没有冗余,这一点人尽皆知。它的核心是条带化(striping),控制器把连续的逻辑地址空间切成长度相等的块,然后轮流写到阵列里的每一块物理盘上。举个例子,两块盘做 RAID 0,条带深度设为 256KB,那么逻辑地址 0~256KB 落在盘 A,256KB~512KB 落在盘 B,512KB~768KB 又回到盘 A,依次类推。
这种交叉排列带来的直接效果是:当上层应用发起一个较大的连续读或写请求时,控制器可以把请求拆分到多块盘并行处理。机械盘时代,单盘顺序读可能只有 200MB/s,两块盘 RAID 0 可以跑到接近 400MB/s;到了 SSD 时代,虽然单盘性能已经很高,但多盘 RAID 0 的队列深度叠加依然有效,尤其是多线程随机读场景。
到这里,你已经能看出条带
