原文地址: 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
實現系統盤高可用,在其中一塊系統盤損壞後如何換盤並數據同步作了詳細描述,同時也對監控告警作了講解。整體來講,整個流水線基本上覆蓋到了,具體細節部分還需多實踐。