原文地址: https://www.tony-yin.site/201...html
一套完善的系统理论上是不该该存在任何的单点故障,可是系统盘每每被人所忽略,而系统盘又偏偏是最重要的一个点。本文主要讲解如何利用软RAID
实现系统盘高可用,而且实现自动换盘、自动告警和自动恢复。python
全部挂载点所有采用RAID1
方式保证数据冗余,即便其中一块盘损坏,也不会影响操做系统的正常运行,只须要替换一块新盘,便可从新进行数据同步。linux
Mount Point | Raid | Size |
---|---|---|
/ | Raid1 | 100 GB |
/boot | Raid1 | 512 MB |
/boot/efi | Raid1 | 200 MB |
swap | Raid1 | 50 GB |
/var/log | Raid1 | 50 GB |
进入引导页面,选择UEFI
安装方式,由于传统的BIOS
方式在容量和分区上都存在限制,具体请阅读【聊聊 BIOS、UEFI、MBR、GPT、GRUB……】。ios
<center></center>ubuntu
配置软raid
阶段,UEFI
存在一个ESP
(EFI system partition
), 即/boot/efi
分区,RAID
等级设置为raid1
。centos
<center></center>python2.7
其余的挂载点也都选择RAID1
便可。ide
sda 8:0 0 447.1G 0 disk ├─sda4 8:4 0 201M 0 part │ └─md123 9:123 0 201M 0 raid1 /boot/efi ├─sda2 8:2 0 50.1G 0 part │ └─md127 9:127 0 50.1G 0 raid1 [SWAP] ├─sda5 8:5 0 50G 0 part │ └─md124 9:124 0 50G 0 raid1 /var/log ├─sda3 8:3 0 513M 0 part │ └─md126 9:126 0 512.4M 0 raid1 /boot ├─sda1 8:1 0 100.1G 0 part └─md125 9:125 0 100G 0 raid1 / sdb 8:0 0 447.1G 0 disk ├─sdb4 8:4 0 201M 0 part │ └─md123 9:123 0 201M 0 raid1 /boot/efi ├─sdb2 8:2 0 50.1G 0 part │ └─md127 9:127 0 50.1G 0 raid1 [SWAP] ├─sdb5 8:5 0 50G 0 part │ └─md124 9:124 0 50G 0 raid1 /var/log ├─sdb3 8:3 0 513M 0 part │ └─md126 9:126 0 512.4M 0 raid1 /boot ├─sdb1 8:1 0 100.1G 0 part └─md125 9:125 0 100G 0 raid1 /
以系统盘为sda
和sdb
,而且sdb
为更换的硬盘为例。工具
由于全部挂载点都是RAID1
,软RAID
中拥有数据冗余的阵列是容许其中一块盘丢失的,因此不会存在磁盘占用的问题,进而不会致使磁盘乱序的问题。因此能够直接热插拔换盘。ui
新插入的sdb
理论上是没有分区的,须要将sda
上面的分区完彻底全的克隆过来。gpt
磁盘分区表的磁盘应该采用parted
或sgdisk
工具。
# 将sda的分区信息克隆到sdb上 sgdisk -R /dev/sdb /dev/sda sleep 5
最好sleep
几秒,由于它克隆后底层同步工做并无当即完成。
克隆分区信息后,为sdb
生成新的GUID
,不然会由于克隆分区表致使sdb
和sda
的GUID
同样。
sgdisk -G /dev/sdb
partprobe /dev/sdb
注意:
这一步很是关键,能够说这是全部流程中最关键而且最容易忽略的一个步骤。由于软RAID数据冗余,并不会对操做系统引导程序有效,即RAID1不会对BIOS中的MBR作冗余,也不会对UEFI中的ESP分区作冗余。这里说的不冗余是指软RAID不会对其作数据冗余,须要另外作冗余。
若是引导方式是传统的bios
,则须要复制MBR
,即硬盘的前512
字节。
[root@ ~]# dd if=/dev/sda of=/dev/sdb bs=512 count=1
须要注意的是,咱们这里采用了UEFI
的引导方式,跟BIOS
是彻底不同的,因此若是一样拷贝硬盘的前512
字节是不会生效的。UEFI
的引导程序在ESP
中,须要复制整个ESP
分区。
[root@ ~]# dd if=/dev/sda of=/dev/sdb
你觉得这就结束了吗?
UEFI
引导方式仅仅复制ESP
分区还不够,还须要将系统盘添加到启动项中。由于当一块磁盘拔了再插上后,原先这块盘就会从启动项中移除,插盘后须要将新盘再添加到启动项中。
[root@ ~]# efibootmgr -c -g -d /dev/sdb -p 1 -L "Centos #2" -l '\EFI\centos\grubx64.efi'
想对efibootmgr
有更深刻了解,能够阅读:
将替换的磁盘的分区对应加入RAID1
中,这样就能够将sda
中的数据同步至sdb
中,同步完成后,全部阵列又将拥有数据冗余的效果。
[root@ ~]# mdadm /dev/md123 -a /dev/sdb4 [root@ ~]# mdadm /dev/md124 -a /dev/sdb5 [root@ ~]# mdadm /dev/md125 -a /dev/sdb1 [root@ ~]# mdadm /dev/md126 -a /dev/sdb3 [root@ ~]# mdadm /dev/md127 -a /dev/sdb2
每次修改软RAID
后,都要实时更新配置文件,方便查看RAID
配置或利用配置文件从新组装阵列。
[root@ ~]# mdadm -Ds > /etc/mdadm.conf
经过查看/proc/mdstat
查看RAID
当前信息,若是存在数据同步,会有recovery
的字样,而且[1/2]
表示还未同步,[_U]
表示前面一个设备不是活跃状态,后一个设备为活跃状态。因此recovery
同行的进度值并非总体RAID
同步进度值,只是当前的RAID
的进度,全部阵列的同步进度值能够经过 Finish Blocks / All Blocks
来计算。
[root@ ~]# cat /proc/mdstat Personalities : [raid0] [raid1] md123 : active raid1 sdb4[1] sda4[0] 205760 blocks super 1.0 [1/2] [_U] bitmap: 0/1 pages [0KB], 65536KB chunk md124 : active raid1 sda5[0] sdb5[1] 20971520 blocks super 1.2 [1/2] [_U] bitmap: 1/1 pages [4KB], 65536KB chunk md125 : active raid1 sda1[0] sdb1[1] 83886080 blocks 64K chunks 2 near-copies [1/2] [_U] [=======>........] recovery = 35.6% (29863444/83886080) finish=0.1min speed=93472K/sec bitmap: 1/1 pages [4KB], 65536KB chunk md126 : active raid1 sdb3[1] sda3[0] 524736 blocks super 1.2 [1/2] [_U] bitmap: 0/1 pages [0KB], 65536KB chunk md127 : active raid1 sda2[0] sdb2[1] 104923136 blocks super 1.2 [1/2] [_U] bitmap: 1/1 pages [4KB], 65536KB chunk unused devices: <none>
要达到对系统盘更好的维护,监控和告警是必不可少的。
能够经过smartctl
工具获取磁盘健康状态,不一样型号的磁盘获取到的健康信息可能会不一致,若是磁盘状态健康,通常会返回PASSED
或OK
,若是状态不健康,直接调用邮件接口便可。
[root@ ~]# smartctl -H /dev/sda smartctl 6.2 2017-02-27 r4394 [x86_64-linux-4.14.78-201.1.el7.x86_64] (local build) Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART STATUS RETURN: incomplete response, ATA output registers missing SMART overall-health self-assessment test result: PASSED Warning: This result is based on an Attribute check.
经过udev
的机制,编写add
和remove
两个action
的rules
文件便可监听磁盘拔出或插入的事件,而后调用告警接口便可。
[root@ ~]# cat /etc/udev/rules.d/50-ssd-monitor.rules KERNEL=="sd[a-z]+$", ACTION=="remove", SUBSYSTEM=="block", RUN+="/usr/bin/python /usr/lib/python2.7/site-packages/disk_watcher/os_disk.py %k pullout" KERNEL=="sd[a-z]+$", ACTION=="add", SUBSYSTEM=="block", RUN+="/usr/bin/python /usr/lib/python2.7/site-packages/disk_watcher/os_disk.py %k insert"
本文主要介绍了如何利用软RAID
实现系统盘高可用,在其中一块系统盘损坏后如何换盘并数据同步作了详细描述,同时也对监控告警作了讲解。整体来讲,整个流水线基本上覆盖到了,具体细节部分还需多实践。