在存储服务器上乃至一些服务器上,为了增加对关键、重要数据的可靠性,RAID(Redundant Array of Independent Disk)是一个经常用到的技术。RAID既可以通过硬件卡实现,也可以通过软件实现,前者性能好、速度快,后者配置灵活、成本低。
在没有RAID硬件功能的服务器上,就必须通过RAID软件来实现。在Linux系统下,
mdamd工具正是用来管理radi的系统工具,它可以创建、修复、扩展raid,也可以从/往raid中删除/增加数据盘和冗余盘。为此,熟练掌握RAID工具既能及时处理软raid常见的各种问题,又能加深我们对各种RAID的特性的直观认识。
下面和大家分享一下在双控系统上碰到Linux下软RAID md符号链接不到RAID设备节点的解决方法法,如果有不同的想法或解决方法,欢迎一起切磋。
1.复现问题出现的步骤
首先,基于四个分区创建一个RAID1:
mdadm --create -f /dev/md/sysdbase --auto=yes -l 1 -n 4 /dev/sdd2 /dev/sde2 /dev/sdf2 /dev/sdg2
也可以用下面的命令:
mdadm --create -f -v --assume-clean /dev/md/sysdbase --auto=yes -l 1 -n 4 /dev/sdd2 /dev/sde2 /dev/sdf2 /dev/sdg2
成功之后,可以看大/dev/下有新的md节点生成:
[root@localhost ~]# ls -alt /dev/md/sysdbase
lrwxrwxrwx 1 root root 8 Feb 15 11:03 /dev/md/sysdbase -> ../md127
然后用mdadm -D 查看新建立的RAID的状况:
[root@localhost dev]# mdadm -D /dev/md/sysdbase
/dev/md/sysdbase:
Version : 1.2
Creation Time : Fri Feb 3 20:17:28 2016
Raid Level : raid1
Array Size : 2095104 (2046.34 MiB 2145.39 MB)
Used Dev Size : 2095104 (2046.34 MiB 2145.39 MB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Feb 15 12:47:42 2016
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Name : localhost.localdomain:sysdbase (local to host localhost.localdomain)
UUID : 68d360a9:41db99b2:5b369ddc:f807722c
Events : 91
Number Major Minor RaidDevice State
0 8 50 0 active sync /dev/sdd2
1 8 66 1 active sync /dev/sde2
2 8 82 2 active sync /dev/sdf2
3 8 98 3 active sync /dev/sdg2
如果要重建/dev/md/sysdbase,根据下面的命令先关掉所有md array:
mdadm --stop –scan
然后重建:
mdadm --create /dev/md/sysdbase --auto=yes -l 1 -n 4 /dev/sdc2 /dev/sdd2 /dev/sde2 /dev/sdf2
接着修改之前的配置文件,相关的配置文件在/var/run/mdadm/map:
[root@localhost ~]# cat /var/run/mdadm/map
md127 1.268d360a9:41db99b2:5b369ddc:f807722c/dev/md/sysdbase
把md127换成md126:
[root@localhost ~]# cat /var/run/mdadm/map
md1261.2 68d360a9:41db99b2:5b369ddc:f807722c/dev/md/sysdbase
接着用新的盘创建/dev/md/sysdbase:
mdadm --create /dev/md/sysdbase --auto=yes -l 1 -n 2 /dev/sdc3 /dev/sdd3
可以看到,此时/dev/下有两个md节点:
[root@localhost script]# ls -lart /dev/md*
brw-rw----. 1 root disk 9, 127 Nov 10 20:47 /dev/md127
brw-rw----. 1 root disk 9, 126 Nov 10 20:48 /dev/md126
/dev/md:
total 0
lrwxrwxrwx. 1 root root 8 Nov 10 20:48 sysdbase -> ../md126
drwxr-xr-x. 22 root root 4820 Nov 10 20:48 ..
drwxr-xr-x. 2 root root 60 Nov 10 20:48 .
如果此时重启机器触发fail over,可以看到在新启动成功的机器上/dev/md/sysdbase有时候会链接到/dev/md127设备节点,有时又会链接到/dev/md126节点,而实际我们期望的读写操作都基于先产生的/dev/md27上,因此这样就会出问题。
2.尝试解决问题的方法
那么该如何保证/dev/md/sysdbase始终链接到/dev/md127上去呢?
首先尝试直接停掉停掉: /dev/md126:
mdadm --stop --scan /dev/md126.
但是重启之后或者切机之后,上面的问题还是出现了。
接着,尝试删除后面添加的/dev/md126:
dd if=/dev/zero of=/dev/sdd3 bs=1M count-1024
用dd先擦除了默认/dev/sdc3、/dev/sdd3的前面1M数据,然后去掉了一个盘:
mdadm /dev/md126 -f /dev/sdd3 -r /dev/sdd3
但是剩下的一个盘/dev/sdc3无论如何从/dev/md126中都删除不掉,这样就无法删除/dev/md126.
最后通过仔细阅读mdadm man 手册,找到了上面对config的描述,知道mdadm默认根据
/etc/mdadm.conf自动组建RAID,因此只需要根据mdadm.conf往里面添加规则就可以了,
如下所示:
[root@localhost ~]# cat /etc/mdadm.conf
DEVICE /dev/sdg2 /dev/sdd2 /dev/sde2 /dev/sdf2
ARRARY /dev/md127 level=raid1 num-devices=4 UUID=68d360a9:41db99b2:5b369ddc:f807722c devices=/dev/sdg2,/dev/sdd2,/dev/sde2,/dev/sdf2