Ceph 自動(dòng)化四大天王
每一個(gè)Ceph新手,都或多或少被文中提到的四大天(坑)王吊打過,或鋼筋鐵骨成為大神,或刪庫跑路淪為亡魂。因此有必要給大家早早普及一下這四大天王的手段,幫各位早脫苦海。本文建立在你已經(jīng)基本了解Ceph的構(gòu)架和基本原理,如果不熟悉的同學(xué)可以看下面內(nèi)容
https://docs.ceph.com/en/pacific/architecture/
1.OSD自動(dòng)化加入crush
很多新手,上來也不看基本的Crush算法原理,照著其他人的ceph.conf就是抄作業(yè),其中抄得最不走心的就是下面這條配置。
osd crush update on start = false
重啟以后或者加入新的OSD,發(fā)現(xiàn)自己的集群pg異常了,一個(gè)個(gè)OSD成了沒媽的孩子,到處都是小蝌蚪找媽媽。殊不知,默認(rèn)Crushmap中會(huì)按host為單位,自動(dòng)化將啟動(dòng)的osd加入到所在的host中,如果你開啟了這個(gè)osd crush update on start = false的配置,則會(huì)關(guān)掉自動(dòng)化分配,只能按用戶自定義的Crushmap分布規(guī)則進(jìn)行配置,而新手往往都沒有自定義的Crushmap規(guī)則,于是就遇上了一大堆的孤兒osd。所以抄作業(yè)之前,一定要搞清楚自己的環(huán)境和對(duì)方環(huán)境的差異性,盲抄作業(yè)是要吃大虧的。
每一個(gè)新手,一定要去學(xué)習(xí)的就是crush算法的基本原理,并認(rèn)真按照下面的文檔,進(jìn)行crush-map編輯操作的學(xué)習(xí)與模擬。
https://docs.ceph.com/en/pacific/rados/operations/crush-map-edits/
類似的設(shè)置還有osd class update on start = false
2.pg自動(dòng)化平衡 balancer
掌握基本的Crush算法和基本概念,會(huì)你發(fā)現(xiàn)crush的偽隨機(jī)算法并不能100%確保你的每一個(gè)OSD都能均衡的實(shí)現(xiàn)數(shù)據(jù)分布,隨著你寫入的數(shù)據(jù)增加,很多情況下會(huì)發(fā)現(xiàn)OSD磁盤的利用率非常的不均勻。于是你會(huì)遇上如何平衡OSD數(shù)據(jù)分布這一難題,好在官方也一直在努力做好這件事情,并推出了一系列自動(dòng)化工具。
The balancer can optimize the placement of PGs across OSDs in order to achieve a balanced distribution, either automatically or in a supervised fashion.
最早的時(shí)候是通過擴(kuò)展mgr模塊,實(shí)現(xiàn)了一個(gè)名為balancer的模塊,通過手工方式來調(diào)度這個(gè)模塊,實(shí)現(xiàn)OSD上面的PG分布調(diào)優(yōu)。你可以通過下面的命令查看你的ceph是否支持這個(gè)特性。
root@host:/home/demo#?ceph?mgr?module?ls
{
????"always_on_modules":?[
????????"balancer",
????????"crash",
????????"devicehealth",
????????"orchestrator_cli",
????????"progress",
????????"rbd_support",
????????"status",
????????"volumes"
????],
????"enabled_modules":?[
????????"iostat",
????????"restful"
????],
新版本已經(jīng)不支持手動(dòng)關(guān)閉。
root@host:/home/demo#?ceph?mgr?module?disable?balancer
Error?EINVAL:?module?'balancer'?cannot?be?disabled?(always-on)
你可以通過下面的命令查看當(dāng)前該模塊的開啟狀態(tài)
root@host:/home/demo#?ceph?balancer?status
{
????"last_optimize_duration":?"0:00:22.402340",
????"plans":?[],
????"mode":?"crush-compat",
????"active":?false,
????"optimize_result":?"Unable?to?find?further?optimization,?change?balancer?mode?and?retry?might?help",
????"last_optimize_started":?"Tue?Nov?16?18:29:38?2021"
}
一旦balancer的active=true,那么這里的坑就挖好了,之后隨著你集群的用量變化,一旦滿足自動(dòng)balancer調(diào)節(jié)條件,集群就會(huì)自動(dòng)化實(shí)現(xiàn)OSD上的PG調(diào)整。PG自動(dòng)化平衡功能是很多新手看起來很美好的事情,但是真正用起來你會(huì)發(fā)現(xiàn),集群壓力大的時(shí)候自動(dòng)化平衡一下,或者頻繁的觸發(fā)了自動(dòng)化平衡,你的集群性能會(huì)持續(xù)抖動(dòng),最終造成業(yè)務(wù)延遲增加或者卡頓,要命的是一旦觸發(fā)平衡還不能中途停止,因此只能等待平衡完成,但是平衡這種事情,很多時(shí)候是沒辦法預(yù)期什么時(shí)候開始、什么時(shí)候結(jié)束,因此集群的性能也是處于間歇性抽風(fēng)。所以生產(chǎn)上,這種策略能關(guān)閉最好,看起來的美好,更多的是給你帶來無盡煩惱。具體可以參考下面
https://docs.ceph.com/en/latest/rados/operations/balancer/#balancer
3.資源池自動(dòng)伸縮 autoscale
作為新手,你是不是還在幻想著集群擴(kuò)容,只需要簡(jiǎn)單的加機(jī)器加磁盤,然后調(diào)整一下PG數(shù)一頓操作猛如虎就行了。殘酷的現(xiàn)實(shí)就是,一旦你做了這件事情,集群性能就會(huì)因?yàn)閿?shù)據(jù)平衡而抽風(fēng),如何平衡擴(kuò)容帶來的性能影響已經(jīng)是一門Ceph維護(hù)的藝術(shù)。然鵝,官方貼心的給各位開發(fā)了一個(gè)自動(dòng)化pg擴(kuò)容模塊,根據(jù)集群的當(dāng)前規(guī)模,實(shí)現(xiàn)自動(dòng)化的pg數(shù)設(shè)定,不再讓新手煩惱。好在默認(rèn)是開啟的warn模式,只是在特定情況下會(huì)告警,但是不做執(zhí)行。如果你線上經(jīng)常性的擴(kuò)容/縮容,那么你打開這個(gè)pg_autoscale_mode=on,會(huì)體會(huì)到無與倫比的酸爽,類似女人生孩子的那種陣痛,會(huì)在你心里印象深刻。如果你想讓自己睡個(gè)好覺,就老老實(shí)實(shí)off掉這個(gè)模塊吧,不要瞎折騰才是上上策,自動(dòng)化的東西沒你看起來那么美好。
#默認(rèn)策略是warn
root@host:/home/demo#?ceph?daemon?/home/ceph/var/run/ceph-osd.10.asok?config?show|grep?scale
????"osd_pool_default_pg_autoscale_mode":?"warn",
????"rgw_rados_pool_autoscale_bias":?"4.000000",
#通過pool?set命令設(shè)置對(duì)應(yīng)策略
root@host:/home/demo#?ceph?osd?pool?set
Invalid?command:?missing?required?parameter?pool()
osd?pool?set??size|min_size|pg_num|pgp_num|pgp_num_actual|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|min_read_recency_for_promote|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio??{--yes-i-really-mean-it}?:??set?pool?parameter??to?
root@host:/home/demo#?ceph?osd?pool?get?.rgw.root?pg_autoscale_mode
pg_autoscale_mode:?warn
具體的設(shè)置參考這里
https://docs.ceph.com/en/latest/rados/operations/placement-groups/#autoscaling-placement-groups
4.RGW自動(dòng)化Shard重分配
最后一個(gè)可能只有部分RGW用戶會(huì)遇到,當(dāng)單個(gè)Bucket內(nèi)的文件數(shù)量不斷增長(zhǎng),其底層的數(shù)據(jù)庫分片會(huì)不斷的進(jìn)行ReShard,整個(gè)reshard過程不可控,文件數(shù)越多時(shí)間越長(zhǎng),reshard過程中因?yàn)橐渔i,因此會(huì)導(dǎo)致業(yè)務(wù)卡IO,直接造成服務(wù)不可用。所以這個(gè)特性在官方推出的時(shí)候,我第一時(shí)間就是進(jìn)行了rgw_dynamic_resharding = false關(guān)閉,前面也有很多文章介紹過shard的基本原理和機(jī)制,這里就不再贅述了,感興趣的同學(xué)去看之前的文章內(nèi)容吧。
https://docs.ceph.com/en/latest/radosgw/dynamicresharding/
總結(jié)
無論新手還是老司機(jī),凡是Ceph分布式系統(tǒng)里面的自動(dòng)化機(jī)制,都要盡可能了解其背后邏輯與機(jī)制,謹(jǐn)慎開啟。很多時(shí)候自動(dòng)化/傻瓜化的設(shè)定,只是開發(fā)人員的一廂情愿,他們不會(huì)了解運(yùn)維、生產(chǎn)環(huán)境的復(fù)雜度,很難做到100%適配你的業(yè)務(wù)場(chǎng)景,因此要想不被帶進(jìn)溝里,先得開啟對(duì)這些基礎(chǔ)知識(shí)的深入探索和學(xué)習(xí),在實(shí)踐中去驗(yàn)證這些功能的有效性,而不是一開始就把一切都寄托在官方的默認(rèn)設(shè)定上。
