一彤避、如果出現(xiàn) osd啟動(dòng)報(bào)try_get_map錯(cuò)誤撒强,可以從正常的osd去導(dǎo)出對(duì)應(yīng)版本的epoch评疗,然后導(dǎo)回就可以了
1冻晤、如何導(dǎo)出導(dǎo)入osdmap
1.1先停掉壞的osd,以及一個(gè)好的osd(因?yàn)閏eph-objectstore-tool執(zhí)行時(shí)需要停止osd),然后執(zhí)行導(dǎo)出導(dǎo)入即可
命令例子:其中84是好的osd,85是有問題的osd
ceph-objectstore-tool --op get-osdmap --epoch 145039 --data-path /data1/ceph-osd/ --journal-path /var/log/ceph/ceph-84/journal --type filestore --file osdmap145039
ceph-objectstore-tool --op set-osdmap --epoch 145039 --data-path /data2/ceph-osd/ --journal-path /var/log/ceph/ceph-85/journal --type filestore --file osdmap145039
PS:其中145039為對(duì)應(yīng)的版本號(hào)漱办,data-path與journal-path填寫自己osd對(duì)應(yīng)的路徑
2这刷、找到正確的epoch版本
這個(gè)要通過報(bào)錯(cuò)的osd日志查看,在啟動(dòng)的時(shí)候娩井,osd會(huì)加載一個(gè)epoch版本A暇屋,這個(gè)版本是它正在執(zhí)行的,缺少的epoch版本在它之前洞辣。然后在 dump of recent events中發(fā)現(xiàn)已經(jīng)執(zhí)行的epoch版本B,以及ecoch版本C咐刨。將在max(B,C)到A之間的版本都導(dǎo)入一遍(也可以導(dǎo)入一個(gè)版本,啟動(dòng)一次觀察扬霜,就是太麻煩了)所宰。我日志中A=145068,B=145011,C=145012,所以我把145013到145067之間所有的ecoph版本都導(dǎo)入進(jìn)去了畜挥,結(jié)果正常啟動(dòng)了仔粥。我的日志入下圖
二、處理wrong node的日志報(bào)錯(cuò)
1、產(chǎn)生原因:
2個(gè)osd之間的osdmap版本如果相差過大(相差可能在50左右)躯泰,會(huì)導(dǎo)致2個(gè)osd通訊的時(shí)候報(bào)wrong node谭羔。如果偶爾出現(xiàn)一次wrong node,那么問題不大麦向,因?yàn)閛sd某個(gè)操作卡主了瘟裸,然后恢復(fù)獲取了最新版本的osdmap。如果osd日志一直在報(bào)诵竭,說明有osd同步osdmap出現(xiàn)問題话告,會(huì)導(dǎo)致osd down掉,心跳超時(shí)(可能)卵慰,甚至出現(xiàn)osd大量吃內(nèi)存沙郭,導(dǎo)致服務(wù)器掛掉。日志如下:
2裳朋、查看osd的osdmap版本
通過命令查看:ceph daemon osd.xx status? ——xx標(biāo)記對(duì)應(yīng)的osd編號(hào)
命令結(jié)果例子:
{
????"cluster_fsid": "df181181-2154-4816-a2b7-d6eae79980fb",
????"osd_fsid": "d5edacd3-cee7-45eb-90df-e381d8684dfb",
????"whoami": 15,
????"state": "active",
????"oldest_map": 92570,
????"newest_map": 158146,
????"num_pgs": 2105
}
其中newest_map表示osd的最新版本號(hào)
3病线、查看集群的osdmap版本號(hào)
命令:ceph -s
這里:178170時(shí)最新版本號(hào)
4、確定osd版本是否有問題
多次間隔執(zhí)行命令ceph daemon osd.xx status 查看osd版本號(hào)鲤嫡,正確狀態(tài)如下:
4.1送挑、查詢出來的版本號(hào)一直保持跟集群版本號(hào)一致
4.2、小于集群版本號(hào)暖眼,但是在不停增大惕耕,最終會(huì)達(dá)到集群版本號(hào)
5、出現(xiàn)osd不更新osdmap解決辦法
到目前為止诫肠,我沒有找到osd不更新osdmap的根本原因司澎,我使用過ceph daemon osd.xx?dump_blocked_ops 查看是否有阻塞的操作并解決阻塞,但是依然不行区赵,即使返回沒有阻塞,還是不更新浪南×牛可能可以讓osd重新更新的方式:
1、將對(duì)應(yīng)的osd out出集群(osd還是up的)络凿,過一陣觀察一下版本號(hào)(我的就是這樣回復(fù)的)
2骡送、重啟osd
三、cephx:?verify_reply?couldn't?decrypt?with?error:?error?decoding?block?for?decryption報(bào)錯(cuò)
1絮记、問題日志
2摔踱、解決方式:
1、檢查服務(wù)器時(shí)間是否一致
2怨愤、檢查集群中的keyring與本地osd的keyring是否一致:
? ?使用命令:?
? ? ? ? ? ? ? ? ? ?ceph?auth?list從mon中獲取所有osd的keyring,
? ? ? ? ? ? ? ? ? ?cat /var/lib/ceph/osd/ceph-xx/keyring獲取本地osd的keyring
3派敷、去掉驗(yàn)證,重啟所有的mon、osd篮愉,修改ceph.conf中的如下參數(shù)為
? ? auth_cluster_required = none
? ? auth_service_required = none
? ? auth_client_required = none
四腐芍、heartbeat_check:no reply from xxxxx since back 報(bào)錯(cuò)
1、問題日志
2试躏、解決方式
1猪勇、查看服務(wù)器時(shí)間與服務(wù)器網(wǎng)絡(luò)(我的不是這個(gè)問題)
2、一般心跳超時(shí)是其他問題引起的颠蕴,這里可以先調(diào)大心跳超時(shí)時(shí)間(我調(diào)大了心跳超時(shí)泣刹,解決了其他問題之后,就沒有心跳超時(shí)了)犀被,修改配合文件ceph.conf的參數(shù)
? ?mon_osd_report_timeout = 1800? ??
? ? filestore_op_thread_suicide_timeout = 1800
? ? filestore_op_thread_timeout = 600
? ? osd_heartbeat_grace = 600
? ? osd_op_thread_suicide_timeout=1800
? ? osd_op_thread_timeout=36000
這個(gè)配置可以先放到[global]椅您,等解決了問題,在去掉弱判,也可以根據(jù)實(shí)際情況襟沮,自己調(diào)整參數(shù)
五、osd啟動(dòng)慢問題
1.查看日志查看osd卡在哪里
日志調(diào)整級(jí)別:修改配置文件ceph.conf參數(shù)昌腰,添加debug_osd=10(15/20)开伏,數(shù)值越高,打印越多遭商。如果已經(jīng)啟動(dòng)osd,想更改日志級(jí)別固灵,可以通過命令:ceph tell osd.xx injectargs --debug-osd 5
2、根據(jù)日志信息解決問題
我是卡在了load_pgs上劫流,因?yàn)檎麄€(gè)集群狀態(tài)不對(duì)巫玻,而pg數(shù)量又很多,加載很慢祠汇,這時(shí)候需要考慮服務(wù)器壓力仍秤,可以一個(gè)一個(gè)慢慢啟動(dòng),不要一下子啟動(dòng)完可很。
六诗力、PG狀態(tài)為incomplete
1、問題原因
incomplete狀態(tài)表示:Peering過程中由于無法選出權(quán)威日志或者通過choos_acting選出的acting不足以完成數(shù)據(jù)恢復(fù)我抠,(例如針對(duì)糾刪碼苇本,存活的副本數(shù)小于k值)等,導(dǎo)致Peering無法正常完成菜拓。即pg元數(shù)據(jù)丟失瓣窄,無法恢復(fù)pg狀態(tài)
2、解決問題
1纳鼎、使用ceph-objectstore-tool工具將incomplete狀態(tài)的pg標(biāo)記為complete
2俺夕、操作步驟:
? ??操作前提:設(shè)置集群flag:noout nodown noup noin? PS:這里的目的是為了不讓pg分布變化裳凸,我因?yàn)閛sd都起來了,只設(shè)置了noout nodown
? ?第一步:通過命令ceph pg dump_stuck |grepincomplete >incomplete.txt 從集群中導(dǎo)出incomplete狀態(tài)的所有pg
? ? 第二步:通過第一步知道了pg所在的2個(gè)osd在哪里啥么,stop這2個(gè)osd
? ? 第三步:對(duì)這2個(gè)osd上的pg通過命令做標(biāo)記登舞,命令如下
? ? ceph-objectstore-tool --data-path /data4/ceph-osd/ --journal-path /var/log/ceph/ceph-15/journal --type filestore --pgid 9.ea8 --op mark-complete
? ? ceph-objectstore-tool --data-path /data8/ceph-osd/ --journal-path /var/log/ceph/ceph-91/journal --type filestore --pgid 9.ea8 --op mark-complete
? ? 第四步:?jiǎn)?dòng)這2個(gè)osd(啟動(dòng)順序沒有關(guān)系)
? ? 第五步:觀察集群中incomplete是否少了
? ? 第六步:重復(fù)第二步以及之后的操作,直到incomplete沒有
3悬荣、特別說明
3.1菠秒、標(biāo)記complete的過程,可能給導(dǎo)致集群degraded氯迂、misplaced增加践叠,這是正常的
3.2、原因:因?yàn)槲以跇?biāo)記的過程中嚼蚀,缺少了導(dǎo)入導(dǎo)出pg步驟禁灼。我這里沒操作導(dǎo)入導(dǎo)出是因?yàn)閜g數(shù)量有點(diǎn)多,而且pg比較大轿曙,導(dǎo)入導(dǎo)出會(huì)讓2個(gè)osd停太久了弄捕,而且我覺得讓集群自己恢復(fù)比較好
3.3、導(dǎo)入導(dǎo)出pg命令:
ceph-objectstore-tool --data-path /data3/ceph-osd/ --journal-path /var/log/ceph/ceph-2/journal --type filestore --pgid 4.15d5 --op export --file /data10/55/pg4.15d5
ceph-objectstore-tool --data-path /data8/ceph-osd/ --journal-path /var/log/ceph/ceph-5/journal --type filestore --pgid?4.15d5--op import --file /data10/55/pg4.15d5
選擇一個(gè)osd為主导帝,另一個(gè)為副守谓,將一個(gè)導(dǎo)入到另外一個(gè)pg,導(dǎo)入導(dǎo)出需要停止osd您单。以上是將osd.2中的4.15d5導(dǎo)入到osd.5中
七斋荞、PG狀態(tài)為down
1、如果能重啟對(duì)應(yīng)pg的osd,那是最好的虐秦,問題自然解決
2平酿、如果osd對(duì)應(yīng)的數(shù)據(jù)盤損毀或者其他原因無法啟動(dòng)這個(gè)osd
? ??第一步:將這個(gè)osd刪除,命令
? ? ? ? ? ? ? ? ? ?ceph osd crush reweight osd.xx 0
? ? ? ? ? ? ? ? ? ?ceph osd out osd.xx
? ? ? ? ? ? ? ? ? ?ceph osd crush remove osd.xx
? ? ? ? ? ? ? ? ? ?ceph osd rm osd.xx
? ? ? ? ? ? ? ? ? ?ceph auth del osd.xx
? ? ?第二步:清理當(dāng)前osd的硬盤或者新加一個(gè)硬盤
? ??第三步:新啟動(dòng)一個(gè)編號(hào)相同的osd
? ? ?第四部:重復(fù)上面的操作悦陋,處理掉所有有問題的osd蜈彼,如果還有down,沒事俺驶,等集群自己恢復(fù)處理(我就是啟動(dòng)了一個(gè)新的osd,有pg處理incomlepte+down幸逆,我標(biāo)記完了incomlepte,down就自己消失了)
八痒钝、PG狀態(tài)為stale
1秉颗、原因
這個(gè)狀態(tài)的PG沒有被?ceph-osd?更新痢毒,表明存儲(chǔ)這個(gè) PG 的所有節(jié)點(diǎn)可能都?down?了送矩。擁有 PG 拷貝的 OSD 可能會(huì)全部失敗,這種情況下哪替,那一部分的對(duì)象存儲(chǔ)不可用栋荸, monitor 也就不會(huì)收到那些 PG 的狀態(tài)更新了,這些pg就被標(biāo)記為stale
2、解決方法
? ?第一種:osd down了之后能正常起來晌块,那只要啟動(dòng)
? ? 第二種:
? ? ? ? ? ? ? ? 1.使用命令ceph pg dump |grep stale找出stale的pg
? ? ? ? ? ? ? ? 2.使用命令ceph pg force_create_pg $pg_id,這時(shí)pg狀態(tài)變?yōu)閏reating
? ? ? ? ? ? ? ? 3.重啟集群中所有的osd
3爱沟、特殊說明
? ? ?我當(dāng)時(shí)是第二種情況,然后我按上面的步驟操作了匆背。結(jié)果所有的osd啟動(dòng)都卡主了呼伸。我猜測(cè)可能原因:當(dāng)時(shí)我force_create_pg的數(shù)量有3000個(gè),這個(gè)數(shù)量有點(diǎn)多钝尸,所以osd就大量卡住了括享,很久很久才能啟動(dòng),可能有幾個(gè)小時(shí)珍促。所以這個(gè)操作要慎重铃辖,建議如下
1、這個(gè)stale的pg最后處理
2猪叙、一次不要force_create_pg太多娇斩,osd重啟時(shí),一個(gè)重啟成功之后穴翩,在重啟另一個(gè)
九犬第、PG狀態(tài)為inconsistent
這個(gè)比較簡(jiǎn)單,直接執(zhí)行命令:ceph pg repair $pg_id 修復(fù)
十、PG狀態(tài)一直有peering和activating
說明集群中osd有問題藏否,需要解決osd問題瓶殃,我就是有3個(gè)osd問題,我out了這3個(gè)osd副签,這2個(gè)狀態(tài)就很快消失了
十一遥椿、mon出現(xiàn) store is getting too big
1、問題發(fā)現(xiàn):ceph -s 或者mon進(jìn)程死掉看到日志
2淆储、產(chǎn)生原因
產(chǎn)生了大量的epoch冠场,導(dǎo)致mon的store.db的數(shù)據(jù)極速膨脹。這個(gè)是我集群出現(xiàn)問題之后才出現(xiàn)的本砰。我之前集群正常時(shí)沒有這個(gè)現(xiàn)象碴裙。不知道等集群正常之后,會(huì)不會(huì)自己恢復(fù)正常点额。
3舔株、解決方法
第一種:對(duì)數(shù)據(jù)進(jìn)行壓縮,使用命令?ceph tell mon.ceph163 compact? (ceph163是我mon的名稱) 还棱。
第二種:使用ceph-mon?-i?HOST?--compact進(jìn)行壓縮啟動(dòng) 载慈,這里的host我使用的是ceph163,主機(jī)名稱
說明:不管使用哪一種珍手,都要注意一點(diǎn):操作壓縮時(shí)办铡,硬盤都會(huì)先擴(kuò)大然后再縮小的辞做,所以要留足空間。第二種的優(yōu)勢(shì)在于可以使修改ceph.conf中的參數(shù)mon_data=/data10/ceph153路徑生效寡具。我后來的mon數(shù)據(jù)太大了秤茅,我就更新路徑到了數(shù)據(jù)盤:只要把對(duì)應(yīng)的mon數(shù)據(jù)存數(shù)據(jù)mv到其他目錄即可
第三種:等集群正常了,修改mon的配置參數(shù)試試(未驗(yàn)證童叠,參數(shù)可以調(diào)小一些)
? ??mon_min_osdmap_epochs=500
? ? mon_max_pgmap_epochs=500
? ? mon_max_mdsmap_epochs=500
4框喳、特別注意:
? ? ?默認(rèn)當(dāng)mon所在存儲(chǔ)應(yīng)硬盤剩余5%空閑時(shí),mon進(jìn)程會(huì)自殺厦坛。
十二帖努、osd節(jié)點(diǎn)正常移除
將對(duì)應(yīng)osd節(jié)點(diǎn)設(shè)置為out即可(osd進(jìn)程依然存在),它會(huì)自動(dòng)移除數(shù)據(jù)并把對(duì)應(yīng)數(shù)據(jù)盤的數(shù)據(jù)刪除粪般,等到數(shù)據(jù)移除完畢拼余,正常關(guān)閉刪除osd即可
命令:ceph osd out osd.xx
十三、集群整體暫時(shí)關(guān)閉(比如要遷移機(jī)房)
當(dāng)需要遷移服務(wù)器亩歹,需要關(guān)閉集群時(shí)匙监,先設(shè)置ceph osd set nodown?ceph osd set noup?ceph osd set noout?ceph osd set nobackfill?ceph osd set norecover 保持集群不變,然后關(guān)閉各個(gè)osd,關(guān)閉mon,關(guān)閉rgw小作。
十四亭姥、集群出現(xiàn)問題時(shí),常規(guī)操作命令
ceph osd set norebalance
? ? ? ? ——禁止集群pg做從均衡顾稀,當(dāng)出現(xiàn)問題時(shí)达罗,可以設(shè)置,用于排查問題
ceph osd set nobackfill? ?
? ? ? ? ——禁止修復(fù)數(shù)據(jù) backfill静秆,當(dāng)出現(xiàn)問題時(shí),我們暫時(shí)不想修復(fù)數(shù)據(jù)粮揉,可以使用,配合nobackfill 一起使用
ceph osd set norecover??
? ? ? ? ——禁止修復(fù)數(shù)據(jù) recover抚笔,當(dāng)出現(xiàn)問題時(shí),我們暫時(shí)不想修復(fù)數(shù)據(jù)扶认,可以使用,配合nobackfill? ?一起使用
ceph osd set nodown? ?
? ? ? ? ——當(dāng)集群出現(xiàn)問題殊橙,osd一會(huì)兒up辐宾,一個(gè)down的時(shí)候,可以使用這個(gè)命令膨蛮,禁止osd down
ceph osd set noup? ? ??
? ? ? ? ?——當(dāng)集群出現(xiàn)問題叠纹,osd一會(huì)兒up,一個(gè)down的時(shí)候敞葛,可以使用這個(gè)命令誉察,禁止osd up
ceph osd set noout? ? ?
? ? ? ? ——禁止集群中的osd自動(dòng)因?yàn)殚L(zhǎng)時(shí)間down,而out?
ceph osd set nodeeep-scrub??
? ? ? ? ——不做深度處理取消使用對(duì)應(yīng)的unset即可制肮,比如ceph osd unset noout
ceph osd out osd.xx? 設(shè)置單個(gè)osd的狀態(tài)為out
ceph osd in osd.xx? ??設(shè)置單個(gè)osd的狀態(tài)為in
ceph osd down osd.xx??設(shè)置單個(gè)osd的狀態(tài)為down
ceph tell osd.xx injectargs?--debug-osd 20? ? 實(shí)時(shí)修改osd.xx的日志級(jí)別冒窍,不需要重啟osd
ceph tell?mon.xx injectargs?--debug-mon?20? 實(shí)時(shí)修改mon的日志級(jí)別,不需要重啟mon
ceph?tell?osd.*?injectargs?--osd_recovery_sleep?1? 單位秒豺鼻,剛開始設(shè)置為1综液,怕服務(wù)器有壓力,觀察之后可以去掉設(shè)置為0
ceph?tell?osd.*?injectargs?--osd_max_backfills?1? 調(diào)整恢復(fù)線程數(shù)儒飒,可以根據(jù)實(shí)際情況調(diào)整
ceph?tell?osd.*?injectargs?--osd_recovery_op_priority?60? 調(diào)整恢復(fù)線程的級(jí)別
ceph daemon osd.xx status? 查看osd.xx的狀態(tài)谬莹,主要看osdmap版本號(hào)
ceph pg dump 查看所有的pg信息
ceph pg dump_stuck stale 查看pg狀態(tài)為stale的數(shù)據(jù)
ceph pg dump_stuck inactive查看pg狀態(tài)為inactive的數(shù)據(jù)
ceph pg dump_stuck unclean查看pg狀態(tài)為unclean的數(shù)據(jù)
ceph -s 查看集群情況
ceph osd tree 查看osd狀態(tài)樹
ceph health detail 查看集群健康詳情
ceph pg pg_id query 查看某個(gè)pg信息
ceph osd getmap -o osdmap.bin查看osdmap圖
ceph-dencoder?type?OSDMap?import?osdmap_197?decode?dump_json 將osdmap導(dǎo)出成json格式