利用軟 RAID 實現系統盤高可用

原文地址: https://www.tony-yin.site/201...html

HA RAID

一套完善的系統理論上是不該該存在任何的單點故障,可是系統盤每每被人所忽略,而系統盤又偏偏是最重要的一個點。本文主要講解如何利用軟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

系統盤軟 RAID 配置

進入引導頁面,選擇UEFI安裝方式,由於傳統的BIOS方式在容量和分區上都存在限制,具體請閱讀【聊聊 BIOS、UEFI、MBR、GPT、GRUB……】ios

<center>load uefi</center>ubuntu

配置軟raid階段,UEFI存在一個ESPEFI system partition), 即/boot/efi分區,RAID等級設置爲raid1centos

<center>uefi partition</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 /

換盤流程

以系統盤爲sdasdb,而且sdb爲更換的硬盤爲例。工具

拔盤 & 插盤

由於全部掛載點都是RAID1,軟RAID中擁有數據冗餘的陣列是容許其中一塊盤丟失的,因此不會存在磁盤佔用的問題,進而不會致使磁盤亂序的問題。因此能夠直接熱插拔換盤。ui

克隆磁盤分區表信息

新插入的sdb理論上是沒有分區的,須要將sda上面的分區完徹底全的克隆過來。gpt磁盤分區表的磁盤應該採用partedsgdisk工具。

# 將sda的分區信息克隆到sdb上
sgdisk -R /dev/sdb /dev/sda
sleep 5

最好sleep幾秒,由於它克隆後底層同步工做並無當即完成。

生成新的GUID

克隆分區信息後,爲sdb生成新的GUID,不然會由於克隆分區表致使sdbsdaGUID同樣。

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工具獲取磁盤健康狀態,不一樣型號的磁盤獲取到的健康信息可能會不一致,若是磁盤狀態健康,通常會返回PASSEDOK,若是狀態不健康,直接調用郵件接口便可。

[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的機制,編寫addremove兩個actionrules文件便可監聽磁盤拔出或插入的事件,而後調用告警接口便可。

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

Refer

  1. How To Copy a GPT Partition Table to Another Disk using sgdisk
  2. SuSE的軟Raid中一塊硬盤壞掉後的修復方法
  3. How to install Ubuntu 14.04/16.04 64-bit with a dual-boot RAID 1 partition on an UEFI/GPT system?
  4. mdadm: device or resource busy
  5. Linux硬盤盤符分配
  6. UEFI via software RAID with mdadm in Ubuntu 16.04
  7. What's the difference between creating mdadm array using partitions or the whole disks directly
  8. XenServer 6.2 with Software RAID
  9. UEFI boot fails when cloning image to new machine
  10. How to correctly install GRUB on a soft RAID 1?
  11. How to boot after RAID failure (software RAID)?
  12. mdadm raid 1 grub only on sda
  13. Can the EFI system partition be RAIDed?
  14. Partitioning EFI machine with two SSD disks in mirror
相關文章
相關標籤/搜索