Ceph分布式存儲(chǔ)日常運(yùn)維管理
作者:過(guò)眼風(fēng)來(lái)源:https://www.cnblogs.com/yuezhimi

常見(jiàn)問(wèn)題
nearfull osd(s) or pool(s) nearfull 此時(shí)說(shuō)明部分osd的存儲(chǔ)已經(jīng)超過(guò)閾值,mon會(huì)監(jiān)控ceph集群中OSD空間使用情況。如果要消除WARN,可以修改這兩個(gè)參數(shù),提高閾值,但是通過(guò)實(shí)踐發(fā)現(xiàn)并不能解決問(wèn)題,可以通過(guò)觀察osd的數(shù)據(jù)分布情況來(lái)分析原因。
配置文件設(shè)置閾值
"mon_osd_full_ratio":"0.95","mon_osd_nearfull_ratio":"0.85"
自動(dòng)處理
ceph osd reweight-by-utilizationceph osd reweight-by-pg 105 cephfs_data(pool_name)
手動(dòng)處理
ceph osd reweight osd.20.8全局處理
ceph mgr module lsceph mgr module enable balancerceph balancer onceph balancer mode crush-compatceph config-key set"mgr/balancer/max_misplaced":"0.01"
PG 故障狀態(tài)
PG狀態(tài)概述 一個(gè)PG在它的生命周期的不同時(shí)刻可能會(huì)處于以下幾種狀態(tài)中:
Creating(創(chuàng)建中) 在創(chuàng)建POOL時(shí),需要指定PG的數(shù)量,此時(shí)PG的狀態(tài)便處于creating,意思是Ceph正在創(chuàng)建PG。
Peering(互聯(lián)中) peering的作用主要是在PG及其副本所在的OSD之間建立互聯(lián),并使得OSD之間就這些PG中的object及其元數(shù)據(jù)達(dá)成一致。
Active(活躍的) 處于該狀態(tài)意味著數(shù)據(jù)已經(jīng)完好的保存到了主PG及副本PG中,并且Ceph已經(jīng)完成了peering工作。
Clean(整潔的) 當(dāng)某個(gè)PG處于clean狀態(tài)時(shí),則說(shuō)明對(duì)應(yīng)的主OSD及副本OSD已經(jīng)成功互聯(lián),并且沒(méi)有偏離的PG。也意味著Ceph已經(jīng)將該P(yáng)G中的對(duì)象按照規(guī)定的副本數(shù)進(jìn)行了復(fù)制操作。
Degraded(降級(jí)的) 當(dāng)某個(gè)PG的副本數(shù)未達(dá)到規(guī)定個(gè)數(shù)時(shí),該P(yáng)G便處于degraded狀態(tài),例如:
在客戶(hù)端向主OSD寫(xiě)入object的過(guò)程,object的副本是由主OSD負(fù)責(zé)向副本OSD寫(xiě)入的,直到副本OSD在創(chuàng)建object副本完成,并向主OSD發(fā)出完成信息前,該P(yáng)G的狀態(tài)都會(huì)一直處于degraded狀態(tài)。又或者是某個(gè)OSD的狀態(tài)變成了down,那么該OSD上的所有PG都會(huì)被標(biāo)記為degraded。當(dāng)Ceph因?yàn)槟承┰驘o(wú)法找到某個(gè)PG內(nèi)的一個(gè)或多個(gè)object時(shí),該P(yáng)G也會(huì)被標(biāo)記為degraded狀態(tài)。此時(shí)客戶(hù)端不能讀寫(xiě)找不到的對(duì)象,但是仍然能訪問(wèn)位于該P(yáng)G內(nèi)的其他object。
Recovering(恢復(fù)中) 當(dāng)某個(gè)OSD因?yàn)槟承┰騞own了,該OSD內(nèi)PG的object會(huì)落后于它所對(duì)應(yīng)的PG副本。而在該OSD重新up之后,該OSD中的內(nèi)容必須更新到當(dāng)前狀態(tài),處于此過(guò)程中的PG狀態(tài)便是recovering。
Backfilling(回填) 當(dāng)有新的OSD加入集群時(shí),CRUSH會(huì)把現(xiàn)有集群內(nèi)的部分PG分配給它。這些被重新分配到新OSD的PG狀態(tài)便處于backfilling。
Remapped(重映射) 當(dāng)負(fù)責(zé)維護(hù)某個(gè)PG的acting set變更時(shí),PG需要從原來(lái)的acting set遷移至新的acting set。這個(gè)過(guò)程需要一段時(shí)間,所以在此期間,相關(guān)PG的狀態(tài)便會(huì)標(biāo)記為remapped。
Stale(陳舊的) 默認(rèn)情況下,OSD守護(hù)進(jìn)程每半秒鐘便會(huì)向Monitor報(bào)告其PG等相關(guān)狀態(tài),如果某個(gè)PG的主OSD所在acting set沒(méi)能向Monitor發(fā)送報(bào)告,或者其他的Monitor已經(jīng)報(bào)告該OSD為down時(shí),該P(yáng)G便會(huì)被標(biāo)記為stale。
OSD狀態(tài)
單個(gè)OSD有兩組狀態(tài)需要關(guān)注,其中一組使用in/out標(biāo)記該OSD是否在集群內(nèi),另一組使用up/down標(biāo)記該OSD是否處于運(yùn)行中狀態(tài)。兩組狀態(tài)之間并不互斥,換句話說(shuō),當(dāng)一個(gè)OSD處于“in”狀態(tài)時(shí),它仍然可以處于up或down的狀態(tài)。
OSD狀態(tài)為in且up 這是一個(gè)OSD正常的狀態(tài),說(shuō)明該OSD處于集群內(nèi),并且運(yùn)行正常。
OSD狀態(tài)為in且down 此時(shí)該OSD尚處于集群中,但是守護(hù)進(jìn)程狀態(tài)已經(jīng)不正常,默認(rèn)在300秒后會(huì)被踢出集群,狀態(tài)進(jìn)而變?yōu)閛ut且down,之后處于該OSD上的PG會(huì)遷移至其它OSD。
OSD狀態(tài)為out且up 這種狀態(tài)一般會(huì)出現(xiàn)在新增OSD時(shí),意味著該OSD守護(hù)進(jìn)程正常,但是尚未加入集群。
OSD狀態(tài)為out且down 在該狀態(tài)下的OSD不在集群內(nèi),并且守護(hù)進(jìn)程運(yùn)行不正常,CRUSH不會(huì)再分配PG到該OSD上。
集群監(jiān)控管理
集群整體運(yùn)行狀態(tài)
# ceph -scluster:id:8230a918-a0de-4784-9ab8-cd2a2b8671d0health: HEALTH_WARNapplication not enabled on 1 pool(s)services:mon:3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 27h)mgr: cephnode01(active, since 53m), standbys: cephnode03, cephnode02osd:4 osds:4 up (since 27h),4in(since 19h)rgw:1 daemon active (cephnode01)data:pools:6 pools,96 pgsobjects:235 objects,3.6KiBusage:4.0GiB used,56GiB/60GiB availpgs:96 active+clean
id:集群IDhealth:集群運(yùn)行狀態(tài),這里有一個(gè)警告,說(shuō)明是有問(wèn)題,意思是pg數(shù)大于pgp數(shù),通常此數(shù)值相等。mon:Monitors運(yùn)行狀態(tài)。osd:OSDs運(yùn)行狀態(tài)。mgr:Managers運(yùn)行狀態(tài)。mds:Metadatas運(yùn)行狀態(tài)。pools:存儲(chǔ)池與PGs的數(shù)量。objects:存儲(chǔ)對(duì)象的數(shù)量。usage:存儲(chǔ)的理論用量。pgs:PGs的運(yùn)行狀態(tài)
~]$ ceph -w~]$ ceph health detail
pg狀態(tài)~]$ ceph pg dump~]$ ceph pg statpool狀態(tài)~]$ ceph osd pool stats~]$ ceph osd pool statsosd狀態(tài)~]$ ceph osd stat~]$ ceph osd dump~]$ ceph osd tree~]$ ceph osd dfMonitor狀態(tài)和查看仲裁狀態(tài)~]$ ceph mon stat~]$ ceph mon dump~]$ ceph quorum_status集群空間用量~]$ ceph df~]$ ceph df detail
集群配置管理(臨時(shí)和全局,服務(wù)平滑重啟)
有時(shí)候需要更改服務(wù)的配置,但不想重啟服務(wù),或者是臨時(shí)修改。這時(shí)候就可以使用tell和daemon子命令來(lái)完成此需求。
查看運(yùn)行配置命令格式:# ceph daemon {daemon-type}.{id} config show命令舉例:# ceph daemon osd.0 config show
tell子命令格式
使用 tell 的方式適合對(duì)整個(gè)集群進(jìn)行設(shè)置,使用 * 號(hào)進(jìn)行匹配,就可以對(duì)整個(gè)集群的角色進(jìn)行設(shè)置。而出現(xiàn)節(jié)點(diǎn)異常無(wú)法設(shè)置時(shí)候,只會(huì)在命令行當(dāng)中進(jìn)行報(bào)錯(cuò),不太便于查找。
命令格式:# ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}]命令舉例:# ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
daemon-type:為要操作的對(duì)象類(lèi)型如osd、mon、mds等。
daemon id:該對(duì)象的名稱(chēng),osd通常為0、1等,mon為ceph -s顯示的名稱(chēng),這里可以輸入*表示全部。
injectargs:表示參數(shù)注入,后面必須跟一個(gè)參數(shù),也可以跟多個(gè)
daemon子命令
使用 daemon 進(jìn)行設(shè)置的方式就是一個(gè)個(gè)的去設(shè)置,這樣可以比較好的反饋,此方法是需要在設(shè)置的角色所在的主機(jī)上進(jìn)行設(shè)置。
命令格式:# ceph daemon {daemon-type}.{id} config set {name}={value}命令舉例:# ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false
集群操作
1、啟動(dòng)所有守護(hù)進(jìn)程# systemctl start ceph.target2、按類(lèi)型啟動(dòng)守護(hù)進(jìn)程# systemctl start ceph-mgr.target# systemctl start ceph-osd@id# systemctl start ceph-mon.target# systemctl start ceph-mds.target# systemctl start ceph-radosgw.target
添加和刪除osd
添加1、格式化磁盤(pán)ceph-volume lvm zap /dev/sd2、進(jìn)入到ceph-deploy執(zhí)行目錄/my-cluster,添加OSD# ceph-deploy osd create --data /dev/sd$hostname 刪除1、調(diào)整osd的crush weight為0ceph osd crush reweight osd.<ID>0.02、將osd進(jìn)程stopsystemctl stop ceph-osd@<ID>3、將osd設(shè)置outceph osd out<ID>4、立即執(zhí)行刪除OSD中數(shù)據(jù)ceph osd purge osd.<ID>--yes-i-really-mean-it5、卸載磁盤(pán)umount /var/lib/ceph/osd/ceph-?
擴(kuò)容PG
注:1、擴(kuò)容大小取跟它接近的2的N次方。2、在更改pool的PG數(shù)量時(shí),需同時(shí)更改PGP的數(shù)量。PGP是為了管理placement而存在的專(zhuān)門(mén)的PG,它和PG的數(shù)量應(yīng)該保持一致。如果你增加pool的pg_num,就需要同時(shí)增加pgp_num,保持它們大小一致,這樣集群才能正常rebalancing。ceph osd pool set{pool-name} pg_num 128ceph osd pool set{pool-name} pgp_num 128
Pool操作
列出存儲(chǔ)池ceph osd lspools創(chuàng)建存儲(chǔ)池命令格式:# ceph osd pool create {pool-name} {pg-num} [{pgp-num}]命令舉例:# ceph osd pool create rbd 32 32設(shè)置存儲(chǔ)池配額命令格式:# ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]命令舉例:# ceph osd pool set-quota rbd max_objects 10000刪除存儲(chǔ)池ceph osd pool delete{pool-name}[{pool-name}--yes-i-really-really-mean-it]重命名存儲(chǔ)池ceph osd pool rename {current-pool-name}{new-pool-name}查看存儲(chǔ)池統(tǒng)計(jì)信息rados df給存儲(chǔ)池做快照ceph osd pool mksnap {pool-name}{snap-name}刪除存儲(chǔ)池的快照ceph osd pool rmsnap {pool-name}{snap-name}獲取存儲(chǔ)池選項(xiàng)值ceph osd pool get{pool-name}{key}調(diào)整存儲(chǔ)池選項(xiàng)值ceph osd pool set{pool-name}{key}{value}size:設(shè)置存儲(chǔ)池中的對(duì)象副本數(shù),詳情參見(jiàn)設(shè)置對(duì)象副本數(shù)。僅適用于副本存儲(chǔ)池。min_size:設(shè)置 I/O 需要的最小副本數(shù),詳情參見(jiàn)設(shè)置對(duì)象副本數(shù)。僅適用于副本存儲(chǔ)池。pg_num:計(jì)算數(shù)據(jù)分布時(shí)的有效 PG 數(shù)。只能大于當(dāng)前 PG 數(shù)。pgp_num:計(jì)算數(shù)據(jù)分布時(shí)使用的有效 PGP 數(shù)量。小于等于存儲(chǔ)池的 PG 數(shù)。hashpspool:給指定存儲(chǔ)池設(shè)置/取消 HASHPSPOOL 標(biāo)志。target_max_bytes:達(dá)到 max_bytes 閥值時(shí)會(huì)觸發(fā)Ceph沖洗或驅(qū)逐對(duì)象。target_max_objects:達(dá)到 max_objects 閥值時(shí)會(huì)觸發(fā)Ceph沖洗或驅(qū)逐對(duì)象。scrub_min_interval:在負(fù)載低時(shí),洗刷存儲(chǔ)池的最小間隔秒數(shù)。如果是0,就按照配置文件里的 osd_scrub_min_interval 。scrub_max_interval:不管集群負(fù)載如何,都要洗刷存儲(chǔ)池的最大間隔秒數(shù)。如果是0,就按照配置文件里的 osd_scrub_max_interval 。deep_scrub_interval:“深度”洗刷存儲(chǔ)池的間隔秒數(shù)。如果是0,就按照配置文件里的 osd_deep_scrub_interval 。獲取對(duì)象副本數(shù)ceph osd dump| grep 'replicated size'
用戶(hù)管理
Ceph 把數(shù)據(jù)以對(duì)象的形式存于各存儲(chǔ)池中。Ceph 用戶(hù)必須具有訪問(wèn)存儲(chǔ)池的權(quán)限才能夠讀寫(xiě)數(shù)據(jù)。另外,Ceph 用戶(hù)必須具有執(zhí)行權(quán)限才能夠使用 Ceph 的管理命令。
查看用戶(hù)信息查看所有用戶(hù)信息# ceph auth list獲取所有用戶(hù)的key與權(quán)限相關(guān)信息# ceph auth get client.admin如果只需要某個(gè)用戶(hù)的key信息,可以使用pring-key子命令# ceph auth print-key client.admin添加用戶(hù)# ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'# ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'# ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring# ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key修改用戶(hù)權(quán)限# ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'# ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'# ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'# ceph auth caps client.ringo mon ' ' osd ' '刪除用戶(hù)# ceph auth del {TYPE}.{ID}其中, {TYPE} 是 client,osd,mon 或 mds 的其中一種。{ID} 是用戶(hù)的名字或守護(hù)進(jìn)程的 ID 。
增加和刪除Monitor
一個(gè)集群可以只有一個(gè) monitor,推薦生產(chǎn)環(huán)境至少部署 3 個(gè)。Ceph 使用 Paxos 算法的一個(gè)變種對(duì)各種 map 、以及其它對(duì)集群來(lái)說(shuō)至關(guān)重要的信息達(dá)成共識(shí)。建議(但不是強(qiáng)制)部署奇數(shù)個(gè) monitor 。Ceph 需要 mon 中的大多數(shù)在運(yùn)行并能夠互相通信,比如單個(gè) mon,或 2 個(gè)中的 2 個(gè),3 個(gè)中的 2 個(gè),4 個(gè)中的 3 個(gè)等。初始部署時(shí),建議部署 3 個(gè) monitor。后續(xù)如果要增加,請(qǐng)一次增加 2 個(gè)。
新增一個(gè)monitor# ceph-deploy mon create $hostname注意:執(zhí)行ceph-deploy之前要進(jìn)入之前安裝時(shí)候配置的目錄。/my-cluster刪除monitor# ceph-deploy mon destroy $hostname注意:確保你刪除某個(gè)Mon后,其余Mon仍能達(dá)成一致。如果不可能,刪除它之前可能需要先增加一個(gè)。
- END -
精彩文章推薦:
部署一套完整的Kubernetes高可用集群(二進(jìn)制)
Nginx日志,原來(lái)其中還有這么多門(mén)道,長(zhǎng)知識(shí)了
終于搞懂了服務(wù)器為啥產(chǎn)生大量的TIME_WAIT!
10 個(gè)Linux Awk文本處理經(jīng)典案例12年老司機(jī)總結(jié)的 5 條面試忠告,終身受用點(diǎn)亮,服務(wù)器三年不宕機(jī)
