做运维这些年,凡是遇到"这台机器能不能不上硬卡"的问题,我基本都会先问一句:你的业务能接受多长时间的停机,以及预算里有没有一块独立阵列卡的位置。绝大多数中小规模的自建服务器、测试环境、边缘节点、备份归档机,答案都是"没必要上硬卡"。这时候软RAID磁盘阵列就是最划算的方案——用几块普通SATA盘或者SAS盘,靠操作系统内核里的md驱动把多块物理磁盘拼成一块逻辑盘,既能扩容又能冗余,还不用额外花钱买卡。我前后在生产环境里跑过十几个软RAID阵列,最久的一个RAID5跑了四年多,中间换过两次盘,业务没中断过一次。
这篇文章我不打算写成手册翻译,而是把我自己从零搭建一套软RAID磁盘阵列的完整过程、命令参数怎么定、容量和条带怎么算、出了故障怎么救,全部摊开来写。不管你是刚接手机房的新人,还是想给家里NAS升级存储的老玩家,只要对Linux命令行不陌生,跟着做一遍就能复现。文中涉及的分区对齐、chunk大小、热备盘、扩容、掉盘恢复,都是实打实踩过坑之后总结出来的东西,不是纸上谈兵。
1. 为什么我优先推荐软RAID而不是硬RAID
1.1 软RAID和硬RAID的本质差别在哪
硬RAID是把计算和调度放在阵列卡上的独立处理器里,操作系统看到的已经是一块逻辑盘,卡上通常带缓存和电池备份单元。软RAID则是把这一层逻辑交给CPU和内核md模块来做,操作系统能直接看到每块成员盘的真实状态。这两种路线的取舍,本质上是"把复杂度放在硬件还是放在系统里"。
硬RAID的优势在于对上层透明,卡上有缓存可以扛住突发写入,电池单元能保证掉电时缓存数据不丢,重建速度也快。但代价是卡本身要钱,而且卡一旦坏了,你往往得找同型号卡才能读出数据,这在中小规模场景里是个不小的负担。软RAID没有这个问题,成员盘的数据格式是明确定义的,任何一台装了mdadm的Linux机器都能把盘插上去重新组装,跨机器迁移非常省心。
我自己的判断标准很直接:数据量大、写入压力高、对延迟敏感的核心数据库,上硬卡;文件服务、备份、日志归档、虚拟化镜像库、个人NAS这些场景,软RAID完全够用,而且省下的钱可以多买两块盘做热备。
1.2 什么场景下软RAID才是正解
先说结论:单盘容量不超过十几TB、盘位数在4到12块之间、写入模式以顺序和中等随机为主,这几个条件下软RAID的性价比几乎没有对手。我在一台双路服务器上跑过8块4TB盘的RAID6,满载顺序写能稳定跑到1.2GB/s以上,CPU占用还不到一个核,说明现代CPU处理RAID5/6的校验运算已经绰绰有余。
反过来,有些情况我会明确劝退软RAID。比如你要跑对写延迟极其敏感的OLTP数据库,RAID5的写惩罚会让每次写都要读旧数据、算校验、写数据、写校验四次IO,延迟上去了;再比如你只有两块盘,那直接做RAID1或者干脆用LVM镜像即可,没必要引入md。还有一种情况是主板只有两个SATA口但你想要大容量冗余,那更该考虑的是换平台而不是硬凑。
需要提醒的是,软RAID5/6有一个著名隐患叫写漏洞:在阵列降级状态下突然掉电,可能导致数据和校验不一致,重建后出现静默损坏。生产环境里我一般这么处理:要么给RAID5配UPS,要么直接上RAID6,要么用RAID10牺牲容量换安全。RAID10在软RAID下重建速度也快得多,因为只需要从镜像盘复制数据,不用算校验。
1.3 RAID级别怎么选,一张表说清楚
选级别前先想清楚两件事:你要的是容量、速度还是安全。这三者永远只能取其二。下面这张表是我按实际使用体验整理的对比,容量以4块4TB盘为例:
| 级别 | 最少盘数 | 可用容量 | 容错能力 | 顺序读 | 顺序写 | 我的使用场景 |
|---|---|---|---|---|---|---|
| RAID0 | 2 | 16TB | 无 | 极高 | 极高 | 临时缓存、可重建数据 |
| RAID1 | 2 | 4TB | 坏1块 | 高 | 中 | 系统盘、小容量关键数据 |
| RAID5 | 3 | 12TB | 坏1块 | 高 | 中偏低 | 文件服务、归档 |
| RAID6 | 4 | 8TB | 坏2块 | 高 | 低 | 大容量冷数据、备份库 |
| RAID10 | 4 | 8TB | 每组坏1块 | 极高 | 高 | 数据库、虚拟机镜像 |
从这张表能看出来,4块盘的RAID5容量最诱人,但写入性能和容错都只是及格线;RAID6多丢一块盘的容错,代价是少4TB容量和更慢的写;RAID10读写都强,但只有一半容量。我个人的经验是,盘数在6块以内、数据可以接受偶尔重建,选RAID5;盘数8块以上,一律RAID6,因为大阵列重建时间长,重建期间再坏一块盘的概率显著上升;至于RAID10,只要业务对写延迟敏感,闭着眼睛选它。
2. 动手之前必须确认的几件事
2.1 硬件环境和系统版本先摸清楚
开工前第一件事是把家底摸清。我见过太多人上来就敲mdadm命令,结果发现盘根本没识别全,或者系统自带的是老版本工具。先确认三样东西:磁盘是否全部被内核识别、内核是否加载了md模块、mdadm版本是否够新。
查看磁盘列表我会用这两条命令,第一条看块设备概览,第二条看每块盘的详细信息包括型号和序列号:
lsblk -d -o NAME,SIZE,TYPE,ROTA,MODEL lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTROTA这一列很关键,1表示机械盘,0表示固态,做阵列时最好同类盘混用,机械盘和固态盘混在一个阵列里,性能会被最慢的那块拖死。确认md模块和工具版本:
lsmod | grep raid mdadm --version cat /proc/mdstat如果/proc/mdstat显示Personalities : [raid0] [raid1] [raid5] [raid6]这类信息,说明内核md驱动正常。mdadm版本建议3.3以上,老版本在处理大于2TB的盘和GPT分区时会有坑。系统盘符漂移的问题也要提前防,后面会专门讲怎么用by-id方式绑定磁盘。
注意:如果是虚拟机做实验,记得每块虚拟盘要挂到不同的SCSI控制器上,否则所有盘共享一条通道,阵列性能测出来会很难看,而且一块盘超时可能把整条通道的其他盘一起拖掉线。
2.2 分区对齐和容量怎么算才不浪费
这一节是我踩坑最多的地方,值得单独拎出来讲。所谓分区对齐,就是让文件系统的块边界和底层磁盘的物理扇区边界对齐。早期的机械盘物理扇区是512字节,现在几乎都是4K物理扇区(叫4Kn或512e),如果你的分区起点没对齐到4K边界,每次写操作都会触发读改写,性能直接掉一半,而且盘寿命也会受影响。
现在的新盘基本不用手动对齐了,因为parted默认就是从1MiB开始分区,这个值天然满足所有常见对齐要求。如果你非要用fdisk,记得把起始扇区设成2048的倍数,也就是从1MiB(2048×512)开始。查看当前分区是否对齐:
parted /dev/sdb align-check optimal 1输出1 aligned就说明对齐了。关于容量计算,RAID5的可用容量公式是(N-1) × 单盘容量,RAID6是(N-2) × 单盘容量,RAID10是N/2 × 单盘容量。但注意实际可用容量会比理论值小一些,因为文件系统元数据、保留块、以及md超级块都会占掉一点。
还有一个经常被忽略的参数是chunk大小,也就是条带中每块盘上连续存储的数据块大小。默认是512K,这个值对性能影响很大。大文件顺序读写为主,chunk设大一点比如512K到1M;小文件随机读写为主,chunk设小一点比如64K到128K。我做过测试,同样的8盘RAID6,chunk从512K改成64K,随机小文件IOPS能提升约30%,但大文件顺序带宽会下降一点,所以必须按实际负载来定。
2.3 必备的监控和告警工具提前装
软RAID最怕的是盘坏了没人知道。硬RAID卡通常会滴滴叫或者有管理软件告警,软RAID默认是静默的,盘掉了系统照跑,直到你哪天发现数据不对才追悔莫及。所以一开始就要把监控链路搭好。
至少要做三件事。第一,mdadm本身支持监控模式,可以配置让它定期扫描阵列状态并在异常时发邮件:
mdadm --monitor --scan --daemonise --mail=ops@example.com --delay=300第二,把关键状态文件纳入常规巡检,包括/proc/mdstat、mdadm --detail /dev/md0的输出、以及/sys/block/md0/md/sync_action。第三,如果你有Prometheus这类监控,装个node_exporter,它自带md相关指标,能直接看每个阵列的降级状态和重建进度。
提示:邮件告警依赖本机有可用的发信通道,小环境里如果没配邮件服务,可以退而求其次写个脚本定时检查
/proc/mdstat里有没有_开头(表示盘缺失)的设备,发现异常就往企业微信或钉钉的机器人接口推消息。我一般用cron每5分钟跑一次。
3. 用mdadm从零构build一个RAID5阵列
3.1 清盘和确认盘符,防止重启后阵列认错盘
正式开始前,先确保每块成员盘上没有残留的文件系统、分区表和旧的md超级块。我见过因为旧超级块导致系统启动时自动组装出一个错误阵列的案例,非常难排查。清理命令如下,对每块将加入阵列的盘执行:
wipefs -a /dev/sdb mdadm --zero-superblock /dev/sdb blkid /dev/sdb # 应该没有任何输出wipefs -a会擦除磁盘上的文件系统签名,mdadm --zero-superblock专门清md超级块。做完之后用blkid确认没输出,说明盘是干净的。
接下来解决盘符漂移。/dev/sdb、/dev/sdc这些名字在重启或者插拔硬盘后可能变化,直接用盘符创建阵列,重启后可能组装不起来。正确做法是用/dev/disk/by-id/下的稳定链接,它基于磁盘的序列号,永远不变。查看方式:
ls -l /dev/disk/by-id/ | grep -E "sdb|sdc|sdd|sde"你会看到类似ata-HGST_HUS724040ALA640_PN12345678这样的名字。创建阵列时就用这些by-id路径,一劳永逸。
3.2 创建阵列的命令和参数逐个拆解
假设我们用4块4TB盘做RAID5,盘符是sdb到sde。创建命令是核心中的核心,我把每个参数都拆开讲:
mdadm --create /dev/md0 \ --level=5 \ --raid-devices=4 \ --chunk=512K \ --bitmap=internal \ --assume-clean \ /dev/disk/by-id/ata-HGST_HUS724040ALA640_PN12345678 \ /dev/disk/by-id/ata-HGST_HUS724040ALA640_PN12345679 \ /dev/disk/by-id/ata-HGST_HUS724040ALA640_PN12345680 \ /dev/disk/by-id/ata-HGST_HUS724040ALA640_PN12345681--level=5指定RAID5;--raid-devices=4表示成员盘数量4块;--chunk=512K指定条带大小为512K,这个值我按大文件顺序读写的场景选的;--bitmap=internal写入内部位图,这个很关键,作用是在阵列异常后只重建变化过的区域而不是全盘重建,能大幅缩短重建时间;--assume-clean表示创建时不立即做全盘同步,新盘本来就是空的,同步纯属浪费时间,但生产环境我一般不用这个参数,宁可让它同步一遍确保一致性。
命令执行后会立刻开始初始化同步,可以用watch cat /proc/mdstat观察进度。输出里的[===>........]就是同步进度条,resync表示正在同步。同步速度可以调节:
cat /proc/sys/dev/raid/speed_limit_max echo 200000 > /proc/sys/dev/raid/speed_limit_maxspeed_limit_max默认一般在200000(单位是KB/s,即约200MB/s),如果同步太慢可以临时调高,但注意同步会占用磁盘带宽,别把业务盘拖垮。我更常用的做法是调低speed_limit_min放宽下限,让它在业务空闲时加速、忙时自动降速。
3.3 文件系统的选择和格式化参数
阵列建好后/dev/md0就相当于一块大硬盘,接下来要格式化。文件系统我推荐XFS或者ext4,两者都经过生产验证。XFS在大文件和高并发场景下表现更好,而且支持在线扩容;ext4兼容性最广,工具链最成熟。这里以XFS为例,讲一下格式化参数怎么跟阵列条带对齐。
关键参数是su和sw。su是条带单元大小,填chunk值;sw是条带宽度,对于RAID5是成员盘数-1,对于RAID6是成员盘数-2,对于RAID10是镜像组数乘以每组的数据盘数。前面4盘RAID5、chunk为512K的情况:
mkfs.xfs -f -d su=512k,sw=3 -L data /dev/md0这里su=512k对应chunk,sw=3是因为4块盘的RAID5有3块数据盘。为什么这两个参数重要?因为它们告诉文件系统数据在底层是怎么分布的,XFS分配块时就会沿着条带边界走,读写时能同时命中所有数据盘,带宽才能打满。如果不对齐,一次读写可能只落在单块盘上,性能就废了。
格式化完成后挂载:
mkdir -p /data mount /dev/md0 /data df -hT /data想要开机自动挂载,千万别在/etc/fstab里写/dev/md0,因为设备名也可能变化。先用blkid /dev/md0拿到UUID,然后写进fstab:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults,noatime 0 0noatime选项能减少元数据写入,对SSD和机械盘都有好处,除非你有程序强依赖文件访问时间。
3.4 保存配置让阵列开机自动组装
这是新手最容易漏的一步。mdadm启动时会读配置文件来组装阵列,如果不保存配置,重启后阵列可能处于"未组装"状态,你还能手动mdadm --assemble救回来,但生产环境显然不能靠人工。执行:
mdadm --detail --scan >> /etc/mdadm/mdadm.confDebian/Ubuntu系的配置文件路径是/etc/mdadm/mdadm.conf,RHEL/CentOS系是/etc/mdadm.conf,具体看你系统里有哪个目录。追加进去的内容长这样:
ARRAY /dev/md0 metadata=1.2 name=node1:0 UUID=abcdef01:23456789:...保存后建议执行update-initramfs -u(Debian系)或dracut -f(RHEL系)把配置打进initramfs,否则系统在早期启动阶段可能读不到配置文件。做完这些,reboot一次验证阵列能否自动组装挂载,这一步千万别省。
注意:如果一个阵列曾被组装过,
/etc/mdadm/mdadm.conf里可能留有旧条目,重复追加会导致多个ARRAY行。整理时用mdadm --detail --scan的输出整体替换,而不是无脑追加,能避免很多诡异的组装失败。
4. 阵列状态怎么看,性能怎么测
4.1 读懂/proc/mdstat和detail输出
阵列建好之后,最重要的技能是看懂状态。/proc/mdstat是最快的入口:
Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sde[3] sdd[2] sdc[1] sdb[0] 11718755328 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] bitmap: 0/30 pages [0KB], 65536KB chunk逐行解读。第二行active raid5说明阵列正常工作中;sde[3]里的方括号是这块盘在阵列里的槽位号,顺序重要,别乱;第三行[4/4]表示期望4块盘、当前有4块在线;[UUUU]是每块盘的健康状态,U代表up正常,如果显示_就代表这块盘掉了,比如[UU_U]说明第三块盘离线;第四行的bitmap信息告诉你位图用了多少,是新盘刚建好时是满的,同步完会变成0。
看详细状态用:
mdadm --detail /dev/md0重点看几个字段:State应该是clean或active,如果是degraded就说明有盘掉了;Active Devices和Working Devices数量是否等于Total Devices;Failed Devices应该为0;Resync Status或Rebuild Status会显示重建进度。我平时会把这两条命令的输出做成一个巡检脚本,每天早上跑一遍看变化趋势。
4.2 实际读写性能测试和我的参考数据
阵列建完一定要测性能,不然你不知道有没有配好。测试工具我推荐fio,比dd专业得多,能同时压带宽和IOPS。顺序读测试:
fio --name=seqread --rw=read --bs=1M --numjobs=4 --iodepth=32 \ --filename=/data/testfile --size=10G --runtime=60 --time_based --group_reporting顺序写类似,把--rw=read改成--rw=write。随机读写用--rw=randread、--rw=randwrite,--bs=4k。这套参数能比较真实地反映阵列能力。
我这边4块4TB机械盘RAID5的实测参考值(仅供参考,不同盘差异很大):顺序读约550MB/s,顺序写约400MB/s,4K随机读IOPS在800左右,4K随机写IOPS约300。同样是这4块盘做RAID10,顺序读写都能到700MB/s以上,4K随机写IOPS能翻到1000以上。这组数据印证了前面的结论:RAID5写性能确实吃亏,RAID10读写都强。
测试时有个坑要注意,fio的文件最好用--direct=1绕过页缓存,否则测出来的是内存速度,不是磁盘速度。另外测试前记得确认阵列没有在后台resync,不然测出的数据会被同步任务干扰。查看是否有后台任务就看/proc/mdstat里有没有resync或recovery字样。
4.3 巡检脚本和告警怎么落地
光会看还不够,得让它自动发现问题。我写过一个很简单的巡检脚本,思路是每5分钟检查一次所有md设备的状态,发现降级或者重建异常就推消息:
#!/bin/bash for md in /dev/md*; do state=$(mdadm --detail "$md" | awk -F: '/State :/{print $2}' | xargs) case "$state" in *degraded*|*recovering*) echo "阵列异常: $md 状态 $state" | mail -s "RAID告警" ops@example.com ;; esac done配合cron每5分钟执行,基本够用。更规范的做法是接入现成的监控体系,node_exporter暴露的node_md_disks_required、node_md_disks、node_md_blocks这些指标能直接做告警规则,比如"required与当前磁盘数不相等"就报警。我自己是把这两种都留着,脚本兜底,监控做趋势。
实操心得:告警邮件很容易被忽略,我在环境里加了第二层保护——把阵列降级信息和重建进度也写进一个日志文件,每月做一次人工复盘,这样即使告警通道出了问题,也不会完全漏掉。
5. 故障模拟和恢复演练,这才是软RAID的价值
5.1 手动模拟磁盘掉线看系统反应
阵列建好不是终点,能不能恢复才是关键。我强烈建议每个软RAID在正式上线前都做一轮故障演练,别等真出事才第一次接触恢复流程。模拟掉盘分两种,一种是模拟硬件彻底失败(fail),一种是模拟临时拔出再插回(remove)。
模拟某块盘故障:
mdadm /dev/md0 --fail /dev/sdc执行后立刻看/proc/mdstat,会看到状态从[UUUU]变成[UU_U],State变成degraded。如果配置了热备盘,md会自动开始重建,把热备盘顶上去。如果没配热备盘,阵列就处于降级运行状态,此时任何一块盘再坏,数据就全没了,必须马上换盘。
换盘的流程是先把故障盘从阵列里移除:
mdadm /dev/md0 --remove /dev/sdc然后物理更换磁盘,再添加新盘:
mdadm /dev/md0 --add /dev/sdc添加后不需要手动触发,md会自动开始重建,/proc/mdstat里会显示recovery进度。4TB盘的重建时间通常在几小时到十几小时,取决于盘速和负载。
5.2 热备盘的配置和自动顶替
热备盘是软RAID里性价比极高的一个设计。它平时不参与读写,一旦有成员盘掉线,md自动把它拉进来重建,不需要人工干预,能把数据风险窗口压缩到最短。配置方法很简单,在创建阵列时用--spare-devices参数,或者事后添加:
mdadm /dev/md0 --add /dev/sdf被添加后如果阵列是健康的,这块盘会以spare身份待命;一旦有盘掉线,它立刻转正。查看热备盘状态:
mdadm --detail /dev/md0 | grep -A2 Spare热备盘的数量按阵列规模配,4到6块的阵列配1块,8块以上建议配2块,因为大阵列重建期间再坏一块的概率不低。热备盘不用买特别好的,容量必须大于等于阵列里最小的成员盘,否则顶上去会组装失败,这个坑我踩过,一块容量略小的备盘添加进去后一直显示spare rebuilding却永远完不成。
5.3 在线扩容,加盘不丢数据的正确姿势
阵列用着用着容量不够了,加盘扩容是常见需求。RAID5/6支持在线扩容,但步骤有固定顺序,顺序错了会出大问题。假设原来4盘RAID5,要扩成5盘,新盘sdf已接上并清理干净:
mdadm /dev/md0 --add /dev/sdf mdadm --grow /dev/md0 --raid-devices=5第一条命令把新盘加入阵列作为spare,第二条命令改变阵列的成员盘数量,md会自动开始reshape,把数据重新分布到5块盘上。这个过程很慢,4TB级阵列reshape可能要一两天,期间性能会明显下降,建议放在业务低谷期做。放宽reshape速度上限:
echo 200000 > /proc/sys/dev/raid/speed_limit_maxreshape完成后,阵列设备大小变大了,但文件系统还没跟上,需要扩容文件系统。XFS用:
xfs_growfs /dataext4用resize2fs /dev/md0。这两个命令都能在线执行,不中断挂载。扩容前一定要确认备份,reshape过程中如果某块盘坏了,恢复会非常麻烦。
注意:reshape和正常的重建是两码事,reshape期间不要重启,也不要在此时做其他阵列变更操作。我在一次扩容中因为重启过一次,导致reshape中断,最后靠
mdadm --assemble --force才勉强找回阵列,教训很深。
6. 常见问题速查和我的避坑清单
6.1 典型报错对照表
下面这张表是我这些年遇到过的软RAID问题汇总,按现象查原因:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 开机阵列不自动组装 | mdadm.conf未保存或未更新initramfs | 重建配置文件并update-initramfs -u |
mdadm --assemble提示找不到盘 | 盘符漂移,配置里用的是/dev/sdX | 改用by-id路径重新创建或手工assemble |
| 阵列显示degraded | 成员盘掉线或故障 | 查看--detail定位故障盘并更换 |
| 重建进度一直不动 | 备盘容量小于成员盘,或磁盘有I/O错误 | 换容量足够的盘,检查dmesg内核日志 |
| 文件系统报I/O错误 | 阵列降级或底层盘坏道 | 立即备份,评估是否进入恢复流程 |
| reshape卡住 | 重启中断或磁盘错误 | 尝试--assemble --force,必要时重建 |
| 容量比预期小 | 比特和吉比特混淆,或超级块占用 | 用lsblk核对实际块数 |
排查问题的第一步永远是dmesg -T | tail -50看内核日志,RAID相关的事件都会记录在里面,比到处猜有效得多。
6.2 我踩过的坑,你们别再踩
第一个坑是拿不同容量的盘凑阵列。md会以最小盘容量为准,多出来的部分直接浪费。当时我用3块4TB和1块6TB做RAID5,结果只能用3×4TB=12TB,那块6TB的2TB白瞎了。所以组阵列尽量同型号同容量,实在要混用,心里有数。
第二个坑是RAID5不配UPS。有一次机房短暂断电,恢复供电后阵列虽然自动组装了,但文件系统出现大量不一致,跑了几个小时的fsck才修好,中间部分数据确实丢了。从那以后凡是我经手的RAID5,都会明确要求配UPS,或者改用RAID6。
第三个坑是重建时业务照跑。有次一块盘掉了,md开始重建,我没管,业务继续高负载跑,结果重建速度被压得很慢,原本8小时能完成拖到30多个小时,期间又掉了一块盘,直接全盘数据作废。正确做法是重建期间主动降载,或者临时调高重建优先级让重建先跑完。
第四个坑是忘记保存阵列配置就去升级内核。内核升级重启后,如果阵列配置没打进initramfs,系统可能进不了正常启动流程,得进救援模式手工组装。现在我的习惯是任何涉及重启的操作之前,先跑一遍mdadm --detail --scan确认输出正常,再确认配置文件存在。
6.3 长期维护的一些习惯
软RAID不是搭完就完事了,日常维护比搭建更重要。我固定的几个动作:每周看一次/proc/mdstat确认所有阵列是[UUUU]状态;每月跑一次mdadm --detail全量检查,记录每块盘的Error Count,这个值如果是0说明盘还很健康,开始增长就要留意;每季度做一次阵列健康度评估,结合SMART数据判断是否需要预防性更换磁盘。
查看SMART的命令是smartctl -a /dev/sdb,重点关注Reallocated_Sector_Ct、Current_Pending_Sector、UDMA_CRC_Error_Count这三个值,任何一个非0都值得警惕。另外阵列里的每块盘最好都保持固件更新,厂商偶尔会发布修复特定bug的固件,能避免一些莫名其妙掉盘的问题。
最后分享一个我自己的小技巧:给每块入阵列的盘贴物理标签,写上盘位、加入日期和序列号后几位,同时维护一份文本档案记录每块盘的信息。听起来很原始,但当你面对一台8盘位的机器要换盘时,这份档案能让你三秒钟定位到该拔哪一块,比在机房里翻命令行强太多。这套做法我用了好几年,每次换盘都省心不少。
6.4 从软RAID再往上走的扩展思路
如果你的数据规模继续增长,软RAID之上还能叠一层LVM。md负责冗余,LVM负责灵活的卷管理和快照,这个组合在中小规模环境里非常经典。做法是把/dev/md0做成LVM的物理卷,然后在上面建卷组和逻辑卷,好处是以后扩容、做快照、调整分区都不用动阵列本身。再往上如果是分布式存储需求,可以考虑Ceph这类方案,但那已经超出单机软RAID的范畴了,先把单机阵列玩明白再考虑。
另外还有一个常被忽略的方向是加密。阵列之上叠一层LUKS,能做全盘加密,对数据安全要求高的场景很实用,代价是CPU开销和一点性能损失,机械盘上基本感觉不出来,SSD上要测一下确认可接受。我自己的归档盘就是md RAID6 + LVM + LUKS的组合,跑了一年多很稳。
说到底,软RAID这东西门槛不高,坑却不少,真正拉开差距的不是会不会敲命令,而是有没有把监控、告警、恢复演练和日常巡检这些配套做扎实。我见过太多人搭完阵列就以为万事大吉,结果真出事的时候手忙脚乱。把上面这些流程都跑一遍,你对这套东西的掌控感会完全不一样。