Ceph常見的幾種異常狀態——運維
【報錯1】:HEALTH_WARN mds cluster is degraded!!!
解決辦法有2步,第一步啟動所有節點:
service ceph -a start
如果重啟後狀態未ok,那麼可以將ceph服務stop後再進行重啟
第二步,啟用osd節點(我這裡有2個osd節點HA-163和mysql-164,請根據自己osd節點的情況修改下面的語句):
ceph-deploy osd activate HA-163:/var/local/osd0 mysql-164:/var/local/osd1
【報錯2】:1 requests are blocked > 32 sec
原因:
有可能是在資料遷移過程中, 使用者正在對該資料塊進行訪問, 但訪問還沒有完成, 資料就遷移到別的 OSD 中, 那麼就會導致有請求被 block, 對使用者也是有影響的
解決方法
尋找 block 的請求
# ceph health detail HEALTH_WARN 1 requests are blocked > 32 sec; 1 osds have slow requests 1 ops are blocked > 33554.4 sec 1 ops are blocked > 33554.4 sec on osd.16 1 osds have slow requests
可以看到 osd.16 具有一個操作 block
查詢 osd 對應主機
# ceph osd tree
重啟 osd
# /etc/init.d/ceph stop osd.16 # /etc/init.d/ceph start osd.16
系統會對該 osd 執行 recovery 操作, recovery 過程中, 會斷開 block request, 那麼這個 request 將會重新請求 mon 節點, 並重新獲得新的 pg map, 得到最新的資料訪問位置, 從而解決上述問題
參考恢復後的狀態
[[email protected] ~]# ceph -s cluster dc4f91c1-8792-4948-b68f-2fcea75f53b9 health HEALTH_OK
【報錯3】:too few PGs per OSD (16 < min 30)
$ sudo ceph osd lspools
0 rbd,
檢視rbd pool的PGS
$ sudo ceph osd pool get rbd pg_num
pg_num: 64
pgs為64,因為是2副本的配置,所以當有8個osd的時候,每個osd上均分了64/8 *2=16個pgs,也就是出現瞭如上的錯誤小於最小配置30個
64/5*1=13《 30
解決辦法:
修改預設pool rbd的pgs
$ sudo ceph osd pool set rbd pg_num 128
set pool 0 pg_num to 128
$ sudo ceph -s
cluster 257faba1-f259-4164-a0f9-1726bd70b05a
health HEALTH_WARN
64 pgs stuck inactive
64 pgs stuck unclean
pool rbd pg_num 128 > pgp_num 64
monmap e1: 1 mons at {bdc217=192.168.13.217:6789/0}
election epoch 2, quorum 0 bdc217
osdmap e52: 8 osds: 8 up, 8 in
flags sortbitwise
pgmap v121: 128 pgs, 1 pools, 0 bytes data, 0 objects
715 MB used, 27550 GB / 29025 GB avail
64 active+clean
64 creating
發現需要把pgp_num也一併修改,預設兩個pg_num和pgp_num一樣大小均為64,此處也將兩個的值都設為128
$ sudo ceph osd pool set rbd pgp_num 128
set pool 0 pgp_num to 128
最後檢視叢集狀態,顯示為OK。
【報錯】: too many PGs per OSD (704 > max 300)
問題原因為叢集osd 數量較少,測試過程中建立了大量的pool,每個pool要咋用一些pg_num 和pgs ,ceph叢集預設每塊磁碟都有預設值,好像每個osd 為128個pgs,預設值可以調整,調整過大或者過小都會對叢集效能優影響,此為測試環境以快速解決問題為目的,解決此報錯的方法就是,調大叢集的此選項的告警閥值;方法如下,在mon節點的ceph.conf 配置檔案中新增:
[global]
.......
mon_pg_warn_max_per_osd = 1000
然後重啟服務:
/etc/init.d/ceph restart mon
臨時生效:
# ceph tell 'mon.*' injectargs "--mon_pg_warn_max_per_osd 0"
使用tell命令修改的配置只是臨時的,只要服務一重啟,配置就會回到解放前,從ceph.conf 中讀取配置。所以長久之計是把這個配置加到Ceph Mon節點的配置檔案裡,然後重啟Mon服務。
【報錯3】:若安裝部署osd失敗,怎麼處理?
# ceph-deploy disk zap compute1s:sdb
# ceph-deploy --overwrite-conf osd create compute1s:sdb
【報錯4】:狀態是HEALTH_WARN,Monitor clock skew detected
ceph叢集監控狀態是HEALTH_WARN, clock skew detected on mon.cephmon154, Monitor clock skew detected
說明2個mon之間的時間相差超過允許值了,需要做同步。
Log報錯資訊:[WRN] mon.1 10.2.180.183:6789/0 clock skew 0.207341s > max 0.05s
【解決方法】在ceph上面/etc/ceph/ceph.conf中設定monitor間的允許時鐘偏移最大值
[mon]
mon clock drift allowed = 2 #允許在mon之間差多少時間,預設為0.050秒
重啟ceph
#service ceph restart
【報錯】:root空間爆滿,導致mon節點被自動踢出叢集
# service ceph restart