
下一步進行osd磁盤更換,更換步驟:
1. 移除故障的osd
注:如果有多個osd故障,建議每次只踢一個osd,等待數據平衡完成再踢下一個,保證數據不丟失。依次將故障osd踢出ceph集群。
1.1 檢查ceph集群狀態及副本數,集群狀態正常后再執行步驟1.2。
#ceph -s (集群狀態為OK)
#ceph osd dump | grep "replicated size" (檢查所有pool是否為3副本)
1.2 執行以下命令移除故障OSD,其中{$X}為osd id。(命令執行時確認成功后再執行下一條)
ceph osd out {$X}
systemctl stop ceph-osd@{$X} #把 OSD 踢出集群后,它可能仍在運行,就是說其狀態為 up 且 out 。刪除前要先停止 OSD 進程
ceph osd crush rm osd.{$X}
ceph auth del osd.{$X}
ceph osd rm {$X}
2.檢查ceph集群狀態
2.1 故障OSD移除后執行ceph -s檢查集群狀態是否ok;正常后再進行后續操作。
2.2 卸載原OSD掛載點信息。
#df -h #確認osd掛載點
#umount /var/lib/ceph/osd/ceph-{$X}
3.(可選:如果umount操作hang死,則需要重啟服務器,一般不需要重啟,根據實際情況判斷)
注:對於fault硬盤,執行umount后進程會hang死,需重啟服務器解決。(可通過ps -aux |grep umount查詢是否存在異常進程)
本次操作時就遇到了umount進程hang死的情況。


也無法kill掉這個進程,只能重啟物理服務器了。
3.1 重啟服務器
#注意,重啟服務器前需要設置noout,否則重啟會觸發ceph集群數據均衡。
(1)檢查ceph集群狀態是否正常,同時不存在recovery/backfill的數據。
#ceph -s (集群狀態為ok)
(2)全局設置noout
ceph osd dump |grep flags (查詢集群當前標記)
ceph osd set noout
(3)登錄需要重啟的存儲節點,執行如下命令停止節點中所有的OSD。
#systemctl stop ceph-osd.target
(4)通過ceph命令查詢集群的狀態,無recovery的數據后再進行重啟操作。
#ceph -s
#ceph osd tree (查詢osd的狀態)
#ceph osd stat > /tmp/osdmap.log (查詢當前集群中osdmap信息並記錄)
#reboot #軟重啟
注意:本次在重啟服務器,服務器在關機的時候hang住了,等了很久發現沒起來,登錄ipmi控制台查看,hang在關機步驟,決定在ipmi控制台進行硬重啟下電操作。

硬重啟后,機器仍然無法進入系統,報錯如下:

參考下面的博客解決掉了,雖然不是dell服務器,本環境是華為H2288V3服務器同樣適用,因為故障盤是做的raid0,該故障盤的緩存還在,需要手動清理下故障盤的緩存。操作步驟參考下面鏈接。
服務器更換硬盤,啟動系統報錯:there are offline or missing virtual drivers with preserved cache
ok,服務器重啟后,正常。進行下一步操作。
4. 更換故障硬盤
4.1 全局設置nodeep-scrub noout
#ceph osd set nodeep-scrub
#ceph osd set noout
#ceph health detail (查看存在noout、nodeep-scrub的flag)
4.2 對需要更換的硬盤進行拔除,並更換成新硬盤。聯系機房同事,進行磁盤更換。
4.3 登錄硬盤故障的存儲節點,對更換的新硬盤進行重組RAID0操作;下圖為RAID相關參數說明請參考。

(1 )查詢RAID卡的controller_id,例如以下查詢到controller_id為0
/opt/MegaRAID/storcli/storcli64 show
(2)查詢RAID卡是否存在RAID信息保存的緩存數據,例如以下查詢到的VD 1為殘留信息。我們剛剛已經清理過了,所以本次查看是沒有殘留信息。
/opt/MegaRAID/storcli/storcli64 /c0 show preservedcache

刪除不使用的preservedcache信息。
/opt/MegaRAID/storcli/storcli64 /c0 /v1 delete preservedcache

(3)檢查新更換硬盤的狀態是否為UGOOD,DG的標識是否為-;(UGOOD意為未進行配置的好盤)
/opt/MegaRAID/storcli/storcli64 /c0 show all |more

(4)(可選)如果檢查新更換的硬盤狀態不為UGOOD,狀態為JBOD或則Ubad可通過以下命令進行硬盤狀態的重置。
/opt/MegaRAID/storcli/storcli64 /ccontroller_id/eenclosure_id/sslot_id set good
(5)創建RAID0;
/opt/MegaRAID/storcli/storcli64 /ccontroller_id add vd r0 drives=enclosure_id:startid-endid wb
/opt/MegaRAID/storcli/storcli64 /c0 add vd r0 drives=0:11 wb
#本環境為了更好的利用到raid卡的cache,所以配置wb模式,經過測試,wb模式性能更高。但是配置wb模式前提是確定raid卡是有電池保護的。
Cache讀寫模式:
wt:當磁盤子系統接收到所有傳輸數據后,控制器將給主機返回數據傳輸完成信號。
wb:控制器Cache收到所有的傳輸數據后,將給主機返回數據傳輸完成信號。
awb:在RAID卡無電容或電容損壞的情況下,強制使用“wb”模式。
5. 添加新的OSD
注:每次只添加一個OSD,等待數據平衡完成后再添加下一個。
1. 檢查待擴容OSD節點的網絡是否正常。
#ip a |grep gl (獲取br-storagepub、br-storage網絡ip地址)
#ping {IP} (檢查與其他存儲節點br-storagepub、br-storage網絡通信是否正常)
#telnet {IP} 6800 (檢查與其他存儲節點6800端口通信是否正常)
#ovs-appctl bond/show ovs-bond0 //檢查Bond0的狀態是否正常;
#ovs-appctl bond/show ovs-bond1 //檢查Bond1的狀態是否正常;
2. 檢查ceph集群數據recovery和backfill的優先級是否修改過,默認1。
#cat /etc/ceph/ceph.conf |grep "osd_recovery_op_priority\|osd_max_backfills"
3. 查詢待擴容的OSD與日志盤對應關系可使用以下命令
#ceph-disk list
#ls -al /var/lib/ceph/osd/ceph-*/journal |awk '{print $11}' |xargs -n1 ls -al
確認本次添加的osd為node-115上的sdk,對應的journal盤是sdt1
4. 更換后的osd磁盤做分區。
ssh node-115
parted /dev/sdk mklabel gpt
parted /dev/sdk mkpart primary 2048s 100%
(1)對數據盤打標簽(本次只更換數據盤,所以操作該步驟)
#sgdisk --typecode=1:4fbd7e29-9d25-41b8-afd0-062c0ceff05d /dev/sdk
(2)日志盤打標簽(日志盤不更換的情況下無需操作)
sgdisk --typecode=1:45B0969E-9B03-4F30-B4C6-B4B80CEFF106 /dev/sdt
sgdisk --typecode=2:45B0969E-9B03-4F30-B4C6-B4B80CEFF106 /dev/sdt
sgdisk --typecode=3:45B0969E-9B03-4F30-B4C6-B4B80CEFF106 /dev/sdt
sgdisk --typecode=4:45B0969E-9B03-4F30-B4C6-B4B80CEFF106 /dev/sdt
5. ceph的mon節點添加OSD,即控制節點中添加。
#ceph-deploy --overwrite-conf osd prepare node-115:/dev/sdk1:/dev/sdt1
#ceph-deploy --overwrite-conf osd activate node-115:/dev/sdk1:/dev/sdt1
#watch ceph -s (數據平衡完畢后再擴容下一塊osd)
待所有osd擴容后需取消全局設置的noin nodeep-scrub noout。
#ceph -s (無recovery、backfill數據)
#ceph osd unset nodeep-scrub
#ceph osd unset noout
#ceph -s (集群狀態ok后擴容工作結束)
