Oepnstack之CEPH系列是根據Ceph Cookbook整理的筆記,分爲以下幾個部分:
1. 《Ceph簡介》
2. 《Ceph集羣操作》
3. 《Ceph塊設備管理與Openstack配置》
4. 《深入Ceph》
5. 《ceph優化與性能測試》
**注意:此文對應ceph版本爲10.1.2**
~~~bash #ceph -v ceph version 10.1.2(4a2a6f72640d6b74a3bbd92798bb913ed380dcd4) ~~~
Ceph集羣的啓動
在Ceph集羣搭建好了後,可以在某個節點的/etc/ceph/ceph.conf中編輯好集羣配置,然後在這個節點來管理啓動與停止。Cookbook中寫了兩種方式,加上我自己一個常用的,算是三種吧~
1、Sysvint的方式:
~~~bash 將整個集羣啓動或停止 # /etc/init.d/ceph -a start|stop 啓動本節點的monitor進程 # /etc/init.d/ceph start mon 啓動所有節點的monitor進程。 # /etc/init.d/ceph -a start mon 類似還有: # /etc/init.d/ceph [-a] start|stop <osd|mds|ceph-radosgw> -a 代表啓動ceph.conf中所有主機 還可以單獨啓動或停止某一個守護進程的實例: 起停ceph-host1上mon進程 # /etc/init.d/ceph start|stop mon.ceph-host1 起停osd.1的守護進程,如果osd.1不在本機則需要加-a參數,其他同理。 # /etc/init.d/ceph start|stop osd.1 ~~~
2、Linux service命令方式:
其實沒什麼特別的,只是把"/etc/init.d/ceph" 換成了"service ceph",後面的都一樣。
3、命令方式:
我目前在用的,使用"/usr/bin/ceph-mon"、"/usr/bin/ceph-osd"。
~~~bash #/usr/bin/ceph-mon -i a|b|c #/usr/bin/ceph-osd -i 0|1|2|3.... #a、b、c對應mon中的id,0、1、2、3對應osd中的id ~~~
使用命令來啓動守護進程,這樣做的後果是要在每臺機都手動執行,我的方法是寫在/etc/rc.local裏面,暫時還沒研究和前面兩種有什麼區別,從啓動的進程來看,service啓動是"/usr/bin/python /usr/sbin/ceph-create-keys --cluster ceph -i a",而命令啓動則很簡單"/usr/bin/ceph-mon -i a"。
Ceph集羣擴展與縮小
傳統的向上擴展(Scale-up)採用的是堆加硬盤的方式,到了一定規模的存儲容量後,會受到自身的控制器,計算性能無法提升等影響。而ceph採用的橫向擴展(Scale-out)方式,會將CPU、內存等其他資源一同加入集羣,因此而線性提升性能。
PS:好久沒接觸傳統存儲了,但印象中EMC、IBM的高端存儲似乎都有橫向擴展,線性增加性能的解決方案,也都提出了軟件定義存儲的概念,這個感覺像是CEPH在吹牛啊。。
1、Ceph擴展之添加osd
書上採用ceph-deploy方式,我們繼續採用命令添加方式,操作系統識別到新硬盤後:
~~~bash 創建osd ID,會返回當前已有的osd個數+1 #ceph osd create 10 創建掛載點 #mkdir -p /var/lib/ceph/osd/ceph-10 #格式化新硬盤 # mkfs.xfs /dev/sdg 掛載硬盤 # mount -o inode64,noatime /dev/sdg /var/lib/ceph/osd/ceph-10 格式化osd # ceph-osd -i 10 --mkfs 設置該osd的位置與權重,host對應當前主機 #ceph osd crush add osd.10 root=default rack=unknowrack host=ceph-host10 啓動守護進程 # ceph-osd -i 10 查看狀態,可以看到該osd是否加入和數據同步 #ceph osd tree #ceph -w ~~~
2、Ceph擴展之添加mon
mon節點的添加比較簡單,要記住在生產環境中需要保持奇數個monitor節點,保證集羣仲裁的中立性。
~~~bash 創建掛載點 #mkdir -p /var/lib/ceph/mon/ceph-d 格式化mon ceph-mon -i d --mkfs --fsid $CLUSTER-ID cluster-id通過ceph -s查看,其實也是創建第一個mon節點時的uuid 啓動守護進程 #ceph-mon -i d 查看狀態 #ceph -s ~~~
3、Ceph縮小之移除osd
在移除osd前,先ceph -s確認集羣狀態正常,以及移除後空間是否足夠。
移除osd步驟爲:
- 將osd盤out,當osd盤爲out狀態時,該osd盤會停止提供服務,並將所存數據轉移到其他盤。
- 將osd盤down
- 將osd盤從crush中rm
- 將osd盤密鑰del
- 將osd從osd tree中rm
~~~bash 將osd.10移除集羣,使用ceph -w查看數據轉移,觀察osdmap,up數量不變,in個數-1 #ceph osd out osd.10 停止osd.10守護進程,使用ceph osd tree確認狀態 #service stop osd.10 或者 #ps -ef |grep osd,查找進程然後kill 從crush map中刪除,使用ceph -s查看osdmap,up和in的數量-1 #ceph osd crush remove osd.10 刪除驗證密鑰 # ceph auth del osd.10 刪除osd盤,使用ceph -s查看osdmap數量-1 ceph osd rm osd.10 如果該主機上osd都被清楚,也可以在crush map中移除主機信息,同上crush移除命令 ceph osd crush remove ceph-host10 ~~~
4、Ceph縮小之移除mon
移除mon的前提是保證有足夠仲裁節點,步驟很簡單
~~~bash 停止Monitor守護進程 #ps -ef |grep mon # kill -9 $PID 刪除對應目錄,或是備份移走 #rm -rf /var/lib/ceph/mon/mon-d 檢查仲裁狀態,檢查monitor狀態 # ceph quorum_status --format json-pretty # ceph mon stat ~~~
Ceph集羣故障維護
Ceph集羣的維護分爲兩個部分,OSD故障處理,設置集羣狀態標誌位
OSD故障磁盤處理
場景:當ceph集羣中某塊硬盤出現故障時,修要進行替換與修復。
1、發現故障
~~~bash 硬盤故障,osd盤會報down。 #ceph osd tree ~~~
注意:<span style="color:red">當一個osd盤處於down的狀態時,集羣數據不會立即發生變化,默認情況下,會等待5分鐘判斷osd是否不再up,從而標記該盤爲out,然後開始數據同步。可以根據需要手動設置等待時間。</span>
2、找到出現down的盤,確認已發生故障,可以等待5分鐘自動out也可以手動out此osd
~~~bash #ceph osd out osd.5 ~~~
3、接下來的步驟與上述刪除osd相同,crush rm、osd rm等等。刪除osd後,觀察ceph -s,等待HEALTH_OK,集羣數據同步完成。
<br>
4、拔出服務器故障硬盤,插入新硬盤,接下來步驟與添加osd盤相同。
集羣維護標誌位
在我們上述的Ceph集羣操作過程,Ceph對外的服務一直都沒有中斷,但在數據同步的過程不免有性能損失,因此在生產環境中做變更實施時,Ceph提供一些方法來維持當前運行狀態,如設置標誌位,然後在業務非高峯期取消標誌位讓其數據同步。
1、標誌位設置
~~~bash #ceph osd set|unset <flag_name> ~~~
ceph提供的標誌位列表:
noout:無論當前osd狀態如何,ceph集羣不會將任何osd標記爲out
nodown:無論當前osd狀態如何,ceph集羣不會將任何osd標記爲down
noup:ceph集羣不會將任何已經DOWN的osd標記爲UP狀態
noin:ceph集羣不允許新的osd加入集羣,在一次添加多個osd而不想讓其自動加入集羣非常游泳
norecover: ceph集羣不做集羣恢復(cluster recovery)
nobackfill:ceph集羣不做數據回填(backfilling)
norebalance:ceph集羣不做集羣再平衡(cluster rebalancing)
noscrub :ceph集羣不做osd清理(scrubbing)
nodeep-scrub:ceph集羣不做osd深度清理(deep-scrubbing)
notieragent:禁用緩存分層代理(cache pool tiering agent)
除了以上標誌位,還有ceph命令來修復osd和pg
~~~bash #ceph osd repair:修復特定osd #ceph pg repair :修復特定PG,謹慎使用 #ceph pg scrub : 清理指定PG #ceph deep-scrub:指定PG深度清理 ~~~