RAID概念
磁盤陣列(Redundant Arrays of Independent Disks,RAID),有“獨立磁盤構成的具有冗余能力的陣列”之意。 磁盤陣列是由很多價格較便宜的磁盤,以硬件(RAID卡)或軟件(MDADM)形式組合成一個容量巨大的磁盤組,利用多個磁盤組合在一起,提升整個磁盤系統效能。利用這項技術,將數據切割成許多區段,分別存放在各個硬盤上。 磁盤陣列還能利用同位檢查(Parity Check)的觀念,在數組中任意一個硬盤故障時,仍可讀出數據,在數據。
注:RAID可以預防數據丟失,但是它並不能完全保證你的數據不會丟失,所以大家使用RAID的同時還是注意備份重要的數據
RAID的創建有兩種方式:軟RAID(通過操作系統軟件來實現)和硬RAID(使用硬件陣列卡);了解raid1、raid5和raid10。不過隨着雲的高速發展,供應商一般可以把硬件問題解決掉。
RAID幾種常見的類型
RAID類型 |
最低磁盤個數 |
空間利用率 |
各自的優缺點 |
|
級 別 |
說 明 |
|||
RAID0 |
條帶卷 |
2+ |
100% |
讀寫速度快,不容錯 |
RAID1 |
鏡像卷 |
2 |
50% |
讀寫速度一般,容錯 |
RAID5 |
帶奇偶校驗的條帶卷 |
3+ |
(n-1)/n |
讀寫速度快,容錯,允許壞一塊盤 |
RAID10 |
RAID1的安全+RAID0的高速 |
4 |
50% |
讀寫速度快,容錯 |
RAID基本思想:把好幾塊硬盤通過一定組合方式把它組合起來,成為一個新的硬盤陣列組,從而使它能夠達到高性能硬盤的要求
RAID有三個關鍵技術:
鏡像:提供了數據的安全性;
條帶(塊大小也可以說是條帶的粒度),它的存在的就是提供了數據並發性
數據的校驗:提供了數據的安全
Raid相對於單個磁盤優點:
RAID-0的工作原理
條帶 (strping),也是我們最早出現的RAID模式
需磁盤數量:2塊以上(大小最好相同),是組建磁盤陣列中最簡單的一種形式,只需要2塊以上的硬盤即可.
特點:成本低,可以提高整個磁盤的性能。RAID 0沒有提供冗余或錯誤修復能力,速度快.
任何一個磁盤的損壞將損壞全部數據;磁盤利用率為100%。
RAID-1
mirroring(鏡像卷),需要磁盤兩塊以上
原理:是把一個磁盤的數據鏡像到另一個磁盤上,也就是說數據在寫入一塊磁盤的同時,會在另一塊閑置的磁盤上生成鏡像文件,(同步)
RAID 1 mirroring(鏡像卷),至少需要兩塊硬盤
磁盤利用率為50%,即2塊100G的磁盤構成RAID1只能提供100G的可用空間。如下圖
RAID-5
需要三塊或以上硬盤,可以提供熱備盤實現故障的恢復;只損壞一塊,沒有問題。但如果同時損壞兩塊磁盤,則數據將都會損壞。 空間利用率: (n-1)/n 2/3 如下圖所示
奇偶校驗信息的作用:
當RAID5的一個磁盤數據發生損壞后,利用剩下的數據和相應的奇偶校驗信息去恢復被損壞的數據。
擴展:異或運算
所謂的“奇偶校驗”可以簡單理解為二進制運算中的“異或運算”,通常用 xor 標識。
最左邊的是原始數據,右邊分別是三塊硬盤,假設第二塊硬盤出了故障,通過第一塊硬盤上的 1 和第三塊硬盤上的 1 xor 2,就能夠還原出 2。同理可以還原出 3 和 8。至於 5 xor 6 則更簡單了,直接用 5 和 6 運算出來即可。
一句話解釋 raid 5 的數據恢復原理就是:都是用公式算出來的。
嵌套RAID級別
RAID-10鏡像+條帶
RAID 10是將鏡像和條帶進行兩級組合的RAID級別,第一級是RAID1鏡像對,第二級為RAID 0。比如我們有8塊盤,它是先兩兩做鏡像,形成了新的4塊盤,然后對這4塊盤做RAID0;當RAID10有一個硬盤受損其余硬盤會繼續工作,這個時候受影響的硬盤只有2塊
RAID硬盤失效處理
一般兩種處理方法:熱備和熱插拔
熱備:HotSpare
定義:當冗余的RAID組中某個硬盤失效時,在不干擾當前RAID系統的正常使用的情況下,用RAID系統中另外一個正常的備用硬盤自動頂替失效硬盤,及時保證RAID系統的冗余性
全局式:備用硬盤為系統中所有的冗余RAID組共享
專用式:備用硬盤為系統中某一組冗余RAID組專用
如下圖所示:是一個全局熱備的示例,該熱備盤由系統中兩個RAID組共享,可自動頂替任何一個RAID中的一個失效硬盤
熱插拔:HotSwap
定義:在不影響系統正常運轉的情況下,用正常的物理硬盤替換RAID系統中失效硬盤。
RAID-0-1-5-10搭建及使用-刪除RAID及注意事項
RAID的實現方式
面試題:我們做硬件RAID,是在裝系統前還是之后?
答:先做陣列才裝系統 ,一般服務器啟動時,有顯示進入配置Riad的提示。
硬RAID:需要RAID卡,我們的磁盤是接在RAID卡的,由它統一管理和控制。數據也由它來進行分配和維護;它有自己的cpu,處理速度快
軟RAID:通過操作系統實現
Mdadm命令詳解
Linux內核中有一個md(multiple devices)模塊在底層管理RAID設備,它會在應用層給我們提供一個應用程序的工具mdadm ,mdadm是linux下用於創建和管理軟件RAID的命令。
mdadm命令常見參數解釋:
參數 |
作用 |
-a |
檢測設備名稱 添加磁盤 |
-n |
指定設備數量 |
-l |
指定RAID級別 |
-C |
創建 |
-v |
顯示過程 |
-f |
模擬設備損壞 |
-r |
移除設備 |
-Q |
查看摘要信息 |
-D |
查看詳細信息 |
-S |
停止RAID磁盤陣列 |
互動: raid5需要3塊硬盤。 那么使用4塊硬盤,可以做raid5嗎?
可以的
實戰搭建raid10陣列
新添加4塊硬盤
第一步:查看磁盤
[root@ken ~]# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
第二步:下載mdadm
[root@ken ~]# yum install mdadm -y
第三步:創建raid10陣列
[root@ken ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e} mdadm: layout defaults to n2 mdadm: layout defaults to n2 mdadm: chunk size defaults to 512K mdadm: size set to 20954112K mdadm: Fail create md0 when using /sys/module/md_mod/parameters/new_array mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
第四步:格式磁盤陣列為ext4
[root@ken ~]# mkfs.ext4 /dev/md0 mapper/ mcelog md0 mem midi mqueue/ [root@ken ~]# mkfs.ext4 /dev/md0 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 2621440 inodes, 10477056 blocks 523852 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2157969408 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
第五步:掛載
[root@ken ~]# mkdir /raid10 [root@ken ~]# mount /dev/md0 /raid10 [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 224M 0 224M 0% /dev tmpfs 236M 0 236M 0% /dev/shm tmpfs 236M 5.6M 230M 3% /run tmpfs 236M 0 236M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 48M 0 48M 0% /run/user/0 /dev/md0 40G 49M 38G 1% /raid10
第六步:查看/dev/md0的詳細信息
[root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:11:41 2019 State : clean, resyncing Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Resync Status : 96% complete Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 26 Number Major Minor RaidDevice State 0 8 16 0 active sync set-A /dev/sdb 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde
第七步:寫入到配置文件中
[root@ken ~]# echo "/dev/md0 /raid10 ext4 defaults 0 0" >> /etc/fstab
損壞磁盤陣列及修復
之所以在生產環境中部署RAID 10磁盤陣列,是為了提高硬盤存儲設備的讀寫速度及數據的安全性,但由於我們的硬盤設備是在虛擬機中模擬出來的,因此對讀寫速度的改善可能並不直觀。
在確認有一塊物理硬盤設備出現損壞而不能繼續正常使用后,應該使用mdadm命令將其移除,然后查看RAID磁盤陣列的狀態,可以發現狀態已經改變。
第一步:模擬設備損壞
[root@ken ~]# mdadm /dev/md0 -f /dev/sdb mdadm: set /dev/sdb faulty in /dev/md0 [root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:15:59 2019 State : clean, degraded Active Devices : 3 Working Devices : 3 Failed Devices : 1 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 30 Number Major Minor RaidDevice State - 0 0 0 removed 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde 0 8 16 - faulty /dev/sdb
第二步:添加新的磁盤
在RAID 10級別的磁盤陣列中,當RAID 1磁盤陣列中存在一個故障盤時並不影響RAID 10磁盤陣列的使用。當購買了新的硬盤設備后再使用mdadm命令來予以替換即可,在此期間我們可以在/RAID目錄中正常地創建或刪除文件。由於我們是在虛擬機中模擬硬盤,所以先重啟系統,然后再把新的硬盤添加到RAID磁盤陣列中。
[root@ken ~]# reboot [root@ken ~]# umount /raid10 [root@ken ~]# mdadm /dev/md0 -a /dev/sdb mdadm: added /dev/sdb [root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:19:14 2019 State : clean, degraded, recovering Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Rebuild Status : 7% complete #這里顯示重建進度 Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 35 Number Major Minor RaidDevice State 4 8 16 0 spare rebuilding /dev/sdb #rebuilding重建中 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde
再次查看發現已經構建完畢
[root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:08:25 2019 Raid Level : raid10 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:20:52 2019 State : clean Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : near=2 Chunk Size : 512K Consistency Policy : resync Name : ken:0 (local to host ken) UUID : c5df1175:a6b1ad23:f3d7e80b:6b56fe98 Events : 51 Number Major Minor RaidDevice State 4 8 16 0 active sync set-A /dev/sdb 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-A /dev/sdd 3 8 64 3 active sync set-B /dev/sde
實戰搭建raid5陣列+備份盤
為了避免多個實驗之間相互發生沖突,我們需要保證每個實驗的相對獨立性,為此需要大家自行將虛擬機還原到初始狀態。另外,由於剛才已經演示了RAID 10磁盤陣列的部署方法,我們現在來看一下RAID 5的部署效果。部署RAID 5磁盤陣列時,至少需要用到3塊硬盤,還需要再加一塊備份硬盤,所以總計需要在虛擬機中模擬4塊硬盤設備。
第一步:查看磁盤
[root@ken ~]# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
第二步:創建RAID5陣列
[root@ken ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 /dev/sd{b,c,d,e} mdadm: layout defaults to left-symmetric mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 512K mdadm: size set to 20954112K mdadm: Fail create md0 when using /sys/module/md_mod/parameters/new_array mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
第三步:格式化為ext4
[root@ken ~]# mkfs.ext4 /dev/md0 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 2621440 inodes, 10477056 blocks 523852 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2157969408 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
第四步:掛載
[root@ken ~]# mount /dev/md0 /raid5 [root@ken ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.2G 16G 7% / devtmpfs 476M 0 476M 0% /dev tmpfs 488M 0 488M 0% /dev/shm tmpfs 488M 7.7M 480M 2% /run tmpfs 488M 0 488M 0% /sys/fs/cgroup /dev/sda1 1014M 130M 885M 13% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/md0 40G 49M 38G 1% /raid5
第五步:查看陣列信息
可以發現有一個備份盤/dev/sde
[root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:35:10 2019 Raid Level : raid5 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:37:11 2019 State : active Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Consistency Policy : resync Name : ken:0 (local to host ken) UUID : b693fe72:4452bd3f:4d995779:ee33bc77 Events : 76 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 4 8 48 2 active sync /dev/sdd 3 8 64 - spare /dev/sde
第六步:模擬/dev/sdb磁盤損壞
可以發現/dev/sde備份盤立即開始構建
[root@ken ~]# mdadm /dev/md0 -f /dev/sdb mdadm: set /dev/sdb faulty in /dev/md0 [root@ken ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu Feb 28 19:35:10 2019 Raid Level : raid5 Array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 3 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu Feb 28 19:38:41 2019 State : active, degraded, recovering Active Devices : 2 Working Devices : 3 Failed Devices : 1 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Consistency Policy : resync Rebuild Status : 2% complete Name : ken:0 (local to host ken) UUID : b693fe72:4452bd3f:4d995779:ee33bc77 Events : 91 Number Major Minor RaidDevice State 3 8 64 0 spare rebuilding /dev/sde 1 8 32 1 active sync /dev/sdc 4 8 48 2 active sync /dev/sdd 0 8 16 - faulty /dev/sdb
centos7系統啟動過程及相關配置文件
1.uefi或BIOS初始化,開始post(power on self test)開機自檢
這個過程是開機后,BIOS或UEFI進行硬件檢查的階段。
2.加載MBR到內存
自檢硬件沒有問題時候,這里以BIOS為例,BIOS將會直接找硬盤的第一個扇區,找到前446字節,將MBR加載到內存中,MBR將告訴程序下一階段去哪里找系統的grub引導。此階段屬於grub第一階段。grub還有1.5階段和2階段。
3.GRUB階段
grub第1.5和第2階段,信息默認存放在扇區中,如果使用grub-install生成的第2階段的文件是存放在/boot分區中的。
為了加載內核系統,不得不加載/boot分區,而加載/boot分區,要有/boot分區的驅動,/boot分區驅動是放在/boot分區中的啊,我們好像進入死循環了,Linux是怎么解決的呢?就是靠放在1.5階段中的數據,放在第一個扇區后的后續扇區中,第1.5階段和2階段總共27個扇區。
第1.5階段:mbr之后的扇區,識別stage2所在的分區上的文件系統。
第2階段:開機啟動的時候看到Grub選項、信息,還有修改GRUB背景等功能都是stage2提供的,stage2會去讀入/boot/grub/grub.conf或者menu.lst等配置文件。
4.加載內核和initramfs模塊
加載內核,核心開始解壓,啟動一些最核心的程序。
為了讓內核足夠的輕小,硬件驅動並沒放在內核文件里面。
5.內核開始初始化,使用systemd來代替centos6以前的init程序
(1)執行initrd.target
包括掛載/etc/fstab文件中的系統,此時掛載后,就可以切換到根目錄了
(2)從initramfs根文件系統切換到磁盤根目錄
(3)systemd執行默認target配置
centos7表面是有“運行級別”這個概念,實際上是為了兼容以前的系統,每個所謂的“運行級別”都有對應的軟連接指向,默認的啟動級別時/etc/systemd/system/default.target,根據它的指向可以找到系統要進入哪個模式
模式:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
(4)systemd執行sysinit.target
有沒有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系統及basic.target准備操作系統
(5)systemd啟動multi-user.target下的本機與服務器服務
(6)systemd執行multi-user.target下的/etc/rc.d/rc.local
6.Systemd執行multi-user.target下的getty.target及登錄服務
getty.target我們也眼熟,它是啟動終端的systemd對象。如果到此步驟,系統沒有被指定啟動圖形桌面,到此就可以結束了,如果要啟動圖形界面,需要在此基礎上啟動桌面程序
7.systemd執行graphical需要的服務
CentOS6,7啟動區別
系統啟動和服務器守護進程管理器,它不同於centos5的Sysv init,centos6的Upstart(Ubuntu制作出來),systemd是由Redhat的一個員工首先提出來的,它在內核啟動后,服務什么的全都被systemd接管,kernel只是用來管理硬件資源,相當於內核被架空了,因此linus很不滿意Redhat這種做法。