1 問題
一般來說,在實際執行中,ceph monitor的個數是2n+1(n>=0)個,線上上至少3個,只要正常的節點數>=n+1,ceph的paxos演算法能保證系統的正常執行。所以,對於3個節點,同時只能掛掉一個。一般來說,同時掛掉2個節點的概率比較小,但是萬一掛掉2個呢?
如果ceph的monitor節點超過半數掛掉,paxos演算法就無法正常進行仲裁(quorum),此時,ceph叢集會阻塞對叢集的操作,直到超過半數的monitor節點恢復。
If there are not enough monitors to form a quorum, the ceph command will block trying to reach the cluster. In this situation, you need to get enough ceph-mon daemons running to form a quorum before doing anything else with the cluster.
所以,
(1)如果掛掉的2個節點至少有一個可以恢復,也就是monitor的後設資料還是OK的,那麼只需要重啟ceph-mon程式即可。所以,對於monitor,最好執行在RAID的機器上。這樣,即使機器出現故障,恢復也比較容易。
(2)如果掛掉的2個節點的後設資料都損壞了呢?出現這種情況,說明人品不行,2臺機器的RAID磁碟同時損壞,這得多背?肯定是管理員嫌工資太低,把機器砸了。如何恢復呢?
2 恢復
其實,也沒有其它辦法,只能想辦法將故障的節點恢復,但後設資料已經損壞。幸好還有一個後設資料正常的節點,通過它可以恢復。
新增monitor的步驟:
$ ceph mon getmap -o /tmp/monmap # provides fsid and existing monitor addrs
$ ceph auth export mon. -o /tmp/monkey # mon. auth key
$ ceph-mon -i newname --mkfs --monmap /tmp/monmap --keyring /tmp/monkey
所以,只要得到monmap,就可以恢復monitor了。
為了模擬,考慮2個monitor節點,掛掉一個,此時通過網路訪問ceph的所有操作都會被阻塞,但monitor的本地socket還是可以通訊的。
但是,讓人蛋疼的是通過socket不能進行monmap的匯出。不過,幸好有monmaptool工具,通過它,我們可以手動生成(注意fsid):
# monmaptool --create --add vm2 172.16.213.134:6789 --add vm3 172.16.213.135:6789 --fsid eb295a51-ec22-4971-86ef-58f6d2bea3bf --clobber monmap
monmaptool: monmap file monmap
monmaptool: set fsid to eb295a51-ec22-4971-86ef-58f6d2bea3bf
monmaptool: writing epoch 0 to monmap (2 monitors)
將正常monitor節點的mon key拷貝過來:
# cat /var/lib/ceph/mon/cluster1-vm2/keyring
[mon.]
key = AQDZQ8VTAAAAABAAX9HqE0NITrUt7j1w0YadvA==
caps mon = "allow *"
然後初始化:
# ceph-mon --cluster cluster1 -i vm3 --mkfs --monmap /root/monmap --keyring /tmp/keyring
ceph-mon: set fsid to eb295a51-ec22-4971-86ef-58f6d2bea3bf
ceph-mon: created monfs at /var/lib/ceph/mon/cluster1-vm3 for mon.vm3
最後,啟動故障節點:
# ceph-mon --cluster cluster1 -i vm3 --public-addr 172.16.213.135:6789
一切OK!
主要參考
[1]RECOVERING FROM CEPH-MON FAILURE
作者:YY哥
出處:http://www.cnblogs.com/hustcat/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。