簡介
首先需要說明的是,ceph的osd是不建議做成raid10或者raid5的,一般建議單盤跑。在我們的環境中,為了充分利用raid卡的緩存,即使是單盤,我們還是將其掛在raid卡下做成raid0。
這樣不可避免的問題就是磁盤的損壞,需要在ceph當中做一些摘除動作,同時還需要重建raid。
在更換完磁盤重建raid之后,需要重新添加osd。新的osd加入到集群后,ceph還會自動進行數據恢復和回填的過程。我們還需要通過調整一些數據恢復和回填的參數來控制其恢復速度。
下面是詳細的說明。
更換OSD操作步驟
1. 故障磁盤定位
一般來講,通過硬件監控,我們能感知到磁盤故障。但是故障的磁盤對應於系統中的哪一個盤符卻沒法知道。
我們可以通過檢查dmesg日志來確認:
[4814427.336053] print_req_error: 5 callbacks suppressed[]
[4814427.336055] print_req_error: I/O error, dev sdj, sector 0
[4814427.337422] sd 0:2:5:0: [sdj] tag#0 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[4814427.337432] sd 0:2:5:0: [sdj] tag#0 CDB: Read(10) 28 00 00 00 00 00 00 00 08 00
[4814427.337434] print_req_error: I/O error, dev sdj, sector 0
[4814427.338901] buffer_io_error: 4 callbacks suppressed
[4814427.338904] Buffer I/O error on dev sdj, logical block 0, async page read
[4814749.780689] sd 0:2:5:0: [sdj] tag#0 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[4814749.780694] sd 0:2:5:0: [sdj] tag#0 CDB: Read(10) 28 00 00 00 00 00 00 00 08 00
[4814749.780697] print_req_error: I/O error, dev sdj, sector 0
[4814749.781903] sd 0:2:5:0: [sdj] tag#0 FAILED Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
[4814749.781905] sd 0:2:5:0: [sdj] tag#0 CDB: Read(10) 28 00 00 00 00 00 00 00 08 00
[4814749.781906] print_req_error: I/O error, dev sdj, sector 0
[4814749.783105] Buffer I/O error on dev sdj, logical block 0, async page read
在我們的日志當中,可以看到,故障盤是/dev/sdj
接着,我們需要確認/dev/sdj對應的osd,在ceph L版本中,默認使用了bluestore,掛載變成了如下方式:
root@ctnr:~# df -hT
Filesystem Type Size Used Avail Use% Mounted on
...
tmpfs tmpfs 63G 48K 63G 1% /var/lib/ceph/osd/ceph-2
tmpfs tmpfs 63G 48K 63G 1% /var/lib/ceph/osd/ceph-3
tmpfs tmpfs 63G 48K 63G 1% /var/lib/ceph/osd/ceph-5
tmpfs tmpfs 63G 48K 63G 1% /var/lib/ceph/osd/ceph-6
tmpfs tmpfs 63G 48K 63G 1% /var/lib/ceph/osd/ceph-7
tmpfs tmpfs 63G 48K 63G 1% /var/lib/ceph/osd/ceph-8
所以沒有辦法通過這種方式直接查看到某個osd對應的磁盤。
可通過如下操作查看每塊磁盤對應的lvm:
root@ctnr:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdf 8:80 0 1.8T 0 disk
└─ceph--295361e9--45ed--4f85--be6a--a3eb06ba8341-osd--block--e2e485b7--65c0--49ad--a37c--24eaefbc3343 253:4 0 1.8T 0 lvm
sdd 8:48 0 1.8T 0 disk
└─ceph--20b494d7--bcd0--4f60--bee0--900edd843b26-osd--block--620cf64c--e76a--44d4--b308--87a0e78970cb 253:2 0 1.8T 0 lvm
sdb 8:16 0 1.8T 0 disk
└─ceph--1c9e3474--e080--478c--aa50--d9e2cc9900e1-osd--block--33dccd23--a7c4--416d--8a22--1787f98c243f 253:0 0 1.8T 0 lvm
sdk 8:160 0 476.4G 0 disk
└─ceph--a3f4913b--d3e1--4c51--9d4d--87340e1d4271-osd--block--f9d7958b--8a66--41e4--8964--8e5cb95e6d09 253:9 0 476.4G 0 lvm
sdg 8:96 0 1.8T 0 disk
└─ceph--36092d1e--4e85--49a1--8378--14b432d1c3d0-osd--block--9da0cba0--0a12--4e32--bed6--438f4db71e69 253:5 0 1.8T 0 lvm
sde 8:64 0 1.8T 0 disk
└─ceph--a21e1b26--0c40--4a36--b6ad--39a2b9920fe7-osd--block--b55e0ccd--cd1e--4067--9299--bb709e64765b 253:3 0 1.8T 0 lvm
sdc 8:32 0 1.8T 0 disk
└─ceph--5ac4fc0f--e517--4a0b--ba50--586707f582b4-osd--block--ab1cb37e--6612--4d18--a045--c2375af9012c 253:1 0 1.8T 0 lvm
sda 8:0 0 3.7T 0 disk
├─sda2 8:2 0 279.4G 0 part /
├─sda3 8:3 0 3.4T 0 part /home
└─sda1 8:1 0 1M 0 part
sdj 8:144 0 476.4G 0 disk
└─ceph--9c93296c--ff24--4ed7--8227--eae40dda38fc-osd--block--5ea3c735--3770--4b42--87aa--12bbe9885bdb 253:8 0 476.4G 0 lvm
然后通過如下操作查看所有osd對應的lvm:
root@ctnr:~# ll /var/lib/ceph/osd/ceph-*/block
lrwxrwxrwx 1 ceph ceph 93 Jun 18 18:49 /var/lib/ceph/osd/ceph-10/block -> /dev/ceph-a3f4913b-d3e1-4c51-9d4d-87340e1d4271/osd-block-f9d7958b-8a66-41e4-8964-8e5cb95e6d09
lrwxrwxrwx 1 ceph ceph 93 Mar 18 18:18 /var/lib/ceph/osd/ceph-2/block -> /dev/ceph-1c9e3474-e080-478c-aa50-d9e2cc9900e1/osd-block-33dccd23-a7c4-416d-8a22-1787f98c243f
lrwxrwxrwx 1 ceph ceph 93 Mar 18 18:19 /var/lib/ceph/osd/ceph-3/block -> /dev/ceph-5ac4fc0f-e517-4a0b-ba50-586707f582b4/osd-block-ab1cb37e-6612-4d18-a045-c2375af9012c
lrwxrwxrwx 1 ceph ceph 93 Mar 18 18:19 /var/lib/ceph/osd/ceph-5/block -> /dev/ceph-20b494d7-bcd0-4f60-bee0-900edd843b26/osd-block-620cf64c-e76a-44d4-b308-87a0e78970cb
lrwxrwxrwx 1 ceph ceph 93 Mar 18 18:20 /var/lib/ceph/osd/ceph-6/block -> /dev/ceph-a21e1b26-0c40-4a36-b6ad-39a2b9920fe7/osd-block-b55e0ccd-cd1e-4067-9299-bb709e64765b
lrwxrwxrwx 1 ceph ceph 93 Mar 18 18:20 /var/lib/ceph/osd/ceph-7/block -> /dev/ceph-295361e9-45ed-4f85-be6a-a3eb06ba8341/osd-block-e2e485b7-65c0-49ad-a37c-24eaefbc3343
lrwxrwxrwx 1 ceph ceph 93 Mar 18 18:21 /var/lib/ceph/osd/ceph-8/block -> /dev/ceph-36092d1e-4e85-49a1-8378-14b432d1c3d0/osd-block-9da0cba0-0a12-4e32-bed6-438f4db71e69
lrwxrwxrwx 1 ceph ceph 93 Jun 18 18:49 /var/lib/ceph/osd/ceph-9/block -> /dev/ceph-9c93296c-ff24-4ed7-8227-eae40dda38fc/osd-block-5ea3c735-3770-4b42-87aa-12bbe9885bdb
通過對比lvm的名稱,即可確定故障磁盤對應的osd
2. 摘除故障磁盤
通過上面的方法確認故障磁盤及其對應的osd后,我們需要執行相應的摘除操作:
- 從ceph中刪除相應的osd
# 在monitor上操作
ceph osd out osd.9
# 在相應的節點機上停止服務
ceph stop ceph-osd@9
# 在monitory上操作
ceph osd crush remove osd.9
ceph auth del osd.9
ceph osd rm osd.9
- 卸載磁盤
umount /var/lib/ceph/osd/ceph-9
3. 重建raid0
重建raid需要依賴mega工具包,下面是ubuntu上安裝的示例:
wget -O - http://hwraid.le-vert.net/debian/hwraid.le-vert.net.gpg.key | sudo apt-key add -
echo "deb http://hwraid.le-vert.net/ubuntu precise main" >> /etc/apt/sources.list
apt-get update
apt-get install megacli megactl megaraid-status
查看raid狀態:
megacli -PDList -aALL | egrep 'Adapter|Enclosure|Slot|Inquiry|Firmware'
Adapter #0
...
Enclosure Device ID: 32
Slot Number: 9
Enclosure position: 1
Firmware state: Online, Spun Up
Device Firmware Level: GS0F
Inquiry Data: SEAGATE ST2000NM0023 GS0FZ1X2Q5P6
Enclosure Device ID: 32
Slot Number: 10
Enclosure position: 1
Firmware state: Unconfigured(good), Spun Up
Device Firmware Level: 004C
Inquiry Data: PHLA914001Y6512DGN INTEL SSDSC2KW512G8 LHF004C
相關說明:
- Adapter:代表raid控制器編號
- Enclosure Device ID:硬盤盒id
- Slot Number:插槽編號
- Firmware state:固件的狀態。
Online, SpunUP
代表正常狀態,Unconfigured(good), Spun Up
代表非正常狀態
我們需要對非正常狀態的磁盤重建raid:
# 對硬盤盒id為32、插槽號為10的硬盤做raid0
root@ctnr:~# megacli -CfgLdAdd -r0'[32:10]' -a0
Adapter 0: Created VD 7
Adapter 0: Configured the Adapter!!
這個時候再通過fdisk -l
就可以看到新添加的磁盤了
fdisk -l
...
Disk /dev/sdj: 476.4 GiB, 511503761408 bytes, 999030784 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
4. 重建osd
ceph-deploy disk list ctnr.a1-56-14.pub.unp
ceph-deploy disk zap ctnr.a1-56-14.pub.unp /dev/sdj
ceph-deploy osd create --data /dev/sdj ctnr.a1-56-14.pub.unp
控制數據恢復及回填速度
# 將用於數據恢復操作的優先級提到最高級別
ceph tell osd.* injectargs "--osd_recovery_op_priority=63"
# 將用於client I/O操作的優先級降到3
ceph tell osd.* injectargs "--osd_client_op_priority=3"
# 將每個osd上用於回填並發操作數由默認的1調整到50
ceph tell osd.* injectargs "--osd_max_backfills=50"
# 將每個osd上用於恢復的並發操作數由默認的3調整到50
ceph tell osd.* injectargs "--osd_recovery_max_active=50"
# 將每個osd上用於執行恢復的線程數由默認的1調整到10
ceph tell osd.* injectargs "--osd_recovery_threads=10"
注意:以上所有操作都是為了盡快恢復數據,在數據恢復完成以后,需要再調整回來,如果在恢復過程中仍然需要優先保證client服務質量,可不做相關調整,保持默認值即可