有關Ceph的一些使用經驗

Thomas是本人在Ceph中國社區的筆名,該文同步發表在Ceph中國社區,現轉載到本博客,方便大家查閱

本文由 Ceph中國社區-Thomas翻譯,小猴子校稿 。

英文出處:Some Ceph experiments 歡迎加入 翻譯小組

有時候,驗證理論是有趣的,只是爲了獲得“哦,好!它像我們期望的那樣工作”的快感。這也是今天我要與大家分享兩個特別的標誌:nooutnodown的原因。由於 Ceph 良好的設計,文章中描述的現象都已爲大家所熟知,所以不要對我大聲吼道:‘請告訴些我們不知道的!’,僅僅把本文看作是證明 Ceph 某些內部功能的一個練習吧:-)。

I. 它們的作用?

標誌定義:

  • noout:一個 OSD 被標記爲out表明該 OSD 可能還在運行但不再接受數據請求,因爲它已經不屬於 CRUSH Map(這與被標記爲in相反)。因此,這個選項用來阻止 OSDs 被標記爲out
  • nodown:一個 OSD 被標記爲down表明該 OSD 不再響應夥伴 OSD 的心跳檢查,因此其權重被設置爲 0 並且不再接受數據請求,這將阻止客戶端向其寫入數據。然而需要注意的是該 OSD 仍然是 CRUSH Map 的一部分。使用nodown選項後,會強制保持所有 OSD 的權重爲 1(或者其他的值,但是 Ceph 一定不會改變該值)。

II. 試驗

II.1. 在運行集羣上設置noout

查看 PG 的行爲是有趣的。一個編號爲 3.4 的 PG 示例如下:

$ ceph pg dump | egrep ^3.4
3.4 0 0 0 0 0 0 0 active+clean  2013-03-27 18:20:33.847308  0'0 57'10 [1,4] [1,4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

可以看到編號爲 3.4 的 PG 的主 OSD 是osd.1,因爲active是 [1,4] ,其中第一個 OSD 便是主 OSD。

然後設置noout標記:

$ ceph osd set noout
set noout 

從命令行界面你會得到通知:

$ ceph -s
    health HEALTH_WARN noout flag(s) set
    monmap e3: 3 mons at {0=192.168.252.10:6789/0,1=192.168.252.11:6789/0,2=192.168.252.12:6789/0}, election epoch 14, quorum 0,1,2 0,1,2
    osdmap e63: 6 osds: 6 up, 6 in
    pgmap v285: 200 pgs: 200 active+clean; 20480 KB data, 391 MB used, 23452 MB / 23844 MB avail
    mdsmap e1: 0/0/1 up

回想一下,基於不同的對象,OSD 可能處於不同的狀態:

  • 主 OSD:它負責

    • 拷貝副本到副本 OSDs
    • 數據再平衡
    • 故障恢復
    • 數據一致性(scrubbing 操作)
  • 副本 OSD:

    • 作爲主 OSD 從屬並接受來自主 OSD 的請求

然後停止主 OSD:

$ sudo service ceph stop osd.1
$ ceph pg dump | egrep ^3.4
3.4 0 0 0 0 20971520  595 595 active+degraded 2013-03-27 18:29:52.215491  61'5  60'20 [4] [4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

現在只有 OSD 4 是活動的並且成爲了該 PG 的主 OSD,它會接受所有的 IO 操作。在正常情況下(因爲初始化腳本就是這麼做的),OSD 會自動被標記爲 out 。然後選出一個新的副本 OSD 。

創建一個對象並通過 RADOS 寫入 Ceph 集羣:

$ dd if=/dev/zero of=seb bs=10M count=2
2+0 records in
2+0 records out
20971520 bytes (21 MB) copied, 0.0386746 s, 542 MB/s

$ sync

$ rados put seb seb

是的,正如期望的那樣,數據寫到了 osd.4 中:

$ sudo ls /var/lib/ceph/osd/osd.4/current/3.4_head/seb__head_3E715054__3

很顯然,你不會在之前的主 OSD(1)上找到任何信息。當然,pg dump 證明只有一個對象(第二個字段):

$ ceph pg dump | egrep ^3.4
3.4 1 0 1 0 20971520  595 595 active+degraded 2013-03-27 18:29:52.215491  61'5  60'20 [4] [4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

現在,我們重啓 OSD 進程並且重置noout值:

$ sudo service ceph start osd.1

$ ceph osd unset noout
unset noout

OSD 1 重新被提升爲主 OSD,而 OSD 4 變成副本 OSD, 同時對象從 osd.4 拷貝到 osd.1。pg dump可以證實這一情況:

$ ceph pg dump | egrep ^3.4
3.4 1 0 0 0 20971520  595 595 active+clean  2013-03-27 18:41:50.970358  61'5  62'20 [1,4] [1,4] 0'0 2013-03-27 18:20:33.847246  0'0 2013-03-27 18:20:33.847246

停下來思考下,那好,我們從這個練習中學到了什麼?你可能已經猜到了,這個選項是運維時的一個理想選擇。是的,對象副本數無法滿足但只是一個臨時過程,這也正是 Ceph 具有的靈活性。現在讓我們轉到nodown選項,它會是個完全不同的故事。

II.2. 在運行集羣中設置nodown

設置標誌:

$ ceph osd set nodown
set nodown

$ ceph -s
health HEALTH_WARN nodown flag(s) set
monmap e3: 3 mons at {0=192.168.252.10:6789/0,1=192.168.252.11:6789/0,2=192.168.252.12:6789/0}, election epoch 14, quorum 0,1,2 0,1,2
osdmap e66: 6 osds: 6 up, 6 in
pgmap v294: 200 pgs: 200 active+clean; 20480 KB data, 395 MB used, 23448 MB / 23844 MB avail
mdsmap e1: 0/0/1 up

創建一個對象並通過 RADOS 寫入 Ceph 集羣:

$ dd if=/dev/zero of=baba bs=10M count=2
2+0 records in
2+0 records out
20971520 bytes (21 MB) copied, 0.0428323 s, 490 MB/s

$ sync

$ rados put baba baba

喔!!!Ceph 集羣掛起了,掛起了, 掛起了…!!!

僅僅因爲這樣那樣的同步及寫請求的原子性得不到滿足。或者主 OSD 或者副本 OSD 仍然保持權重使得它能夠接受客戶端數據。

最後你會看到如下的告警日誌:

osd.4 [WRN] 1 slow requests, 1 included below; oldest blocked for > 30.211296 secs
osd.4 [WRN] slow request 30.211296 seconds old, received at 2013-03-27 19:01:58.127010: osd_op(client.4757.0:1 baba [writefull 0~4194304] 3.f9c3dd2e) v4 currently waiting for subops from [1]
osd.4 [WRN] 1 slow requests, 1 included below; oldest blocked for > 60.235452 secs
osd.4 [WRN] slow request 60.235452 seconds old, received at 2013-03-27 19:01:58.127010: osd_op(client.4757.0:1 baba [writefull 0~4194304] 3.f9c3dd2e) v4 currently waiting for subops from [1]

這是正常的因爲 OSD 掛掉了卻顯示還活着,因此客戶端嘗試向它寫入數據…

然而,有趣的是,條帶模式很容易被發現。在這裏,主 OSD 是 osd.4,所以第一個 4M 寫入時是 ok 的:

-rw-r--r--  1 root root 4.0M Mar 27 19:10 baba__head_F9C3DD2E__3

從這裏,能很容易的確定對象是如何寫入的。Ceph 按照 4M 的塊寫入,看看下面的過程:

--> first 4M osd.primary journal --> osd.primary --> osd.secondary journal --> osd.secondary --> second 4M osd.primary journal --> osd.primary --> and so on...

下面的命令將會按 8M 的塊寫入:

$ rados -b 8388608 put baba baba

停下來想想,那好,我們從這個練習中學到了什麼?恩,也許我遺漏了某些東西,如果有 Inktank 的同事在身邊,我會很開心的想要了解這個選項背後的想法,因爲我還未能想到一個合適的場景來使用這個選項。

結論:

我希望你能從這些練習中得到快樂(學到東西)。這篇文章的中心點是通過使用noout選項,使你能很容易的在降級模式下進行操作。更有深度的技術文檔請看 Ceph documentation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章