Ceph分佈式存儲平常運維管理手冊


做者:過眼風
來源:https://www.cnblogs.com/yuezhiminode

常見問題

nearfull osd(s) or pool(s) nearfull 此時說明部分osd的存儲已經超過閾值,mon會監控ceph集羣中OSD空間使用狀況。若是要消除WARN,能夠修改這兩個參數,提升閾值,可是經過實踐發現並不能解決問題,能夠經過觀察osd的數據分佈狀況來分析緣由。算法

配置文件設置閾值
"mon_osd_full_ratio":"0.95",
"mon_osd_nearfull_ratio":"0.85"

處理方式app

#自動處理
ceph osd reweight-by-utilization
ceph osd reweight-by-pg 105 cephfs_data(pool_name)

#手動處理
ceph osd reweight osd.20.8

#全局處理
ceph mgr module ls
ceph mgr module enable balancer
ceph balancer on
ceph balancer mode crush-compat
ceph config-key set"mgr/balancer/max_misplaced":"0.01"

PG 故障狀態

PG狀態概述 一個PG在它的生命週期的不一樣時刻可能會處於如下幾種狀態中:spa

  • Creating(建立中) 在建立POOL時,須要指定PG的數量,此時PG的狀態便處於creating,意思是Ceph正在建立PG。
  • Peering(互聯中) peering的做用主要是在PG及其副本所在的OSD之間創建互聯,並使得OSD之間就這些PG中的object及其元數據達成一致。
  • Active(活躍的) 處於該狀態意味着數據已經無缺的保存到了主PG及副本PG中,而且Ceph已經完成了peering工做。
  • Clean(整潔的) 當某個PG處於clean狀態時,則說明對應的主OSD及副本OSD已經成功互聯,而且沒有偏離的PG。也意味着Ceph已經將該PG中的對象按照規定的副本數進行了複製操做。
  • Degraded(降級的) 當某個PG的副本數未達到規定個數時,該PG便處於degraded狀態,例如:
  • 在客戶端向主OSD寫入object的過程,object的副本是由主OSD負責向副本OSD寫入的,直到副本OSD在建立object副本完成,並向主OSD發出完成信息前,該PG的狀態都會一直處於degraded狀態。又或者是某個OSD的狀態變成了down,那麼該OSD上的全部PG都會被標記爲degraded。當Ceph由於某些緣由沒法找到某個PG內的一個或多個object時,該PG也會被標記爲degraded狀態。此時客戶端不能讀寫找不到的對象,可是仍然能訪問位於該PG內的其餘object。
  • Recovering(恢復中) 當某個OSD由於某些緣由down了,該OSD內PG的object會落後於它所對應的PG副本。而在該OSD從新up以後,該OSD中的內容必須更新到當前狀態,處於此過程當中的PG狀態即是recovering。
  • Backfilling(回填) 當有新的OSD加入集羣時,CRUSH會把現有集羣內的部分PG分配給它。這些被從新分配到新OSD的PG狀態便處於backfilling。
  • Remapped(重映射) 當負責維護某個PG的acting set變動時,PG須要從原來的acting set遷移至新的acting set。這個過程須要一段時間,因此在此期間,相關PG的狀態便會標記爲remapped。
  • Stale(陳舊的) 默認狀況下,OSD守護進程每半秒鐘便會向Monitor報告其PG等相關狀態,若是某個PG的主OSD所在acting set沒能向Monitor發送報告,或者其餘的Monitor已經報告該OSD爲down時,該PG便會被標記爲stale。

OSD狀態

單個OSD有兩組狀態須要關注,其中一組使用in/out標記該OSD是否在集羣內,另外一組使用up/down標記該OSD是否處於運行中狀態。兩組狀態之間並不互斥,換句話說,當一個OSD處於「in」狀態時,它仍然能夠處於up或down的狀態。命令行

  • OSD狀態爲in且up 這是一個OSD正常的狀態,說明該OSD處於集羣內,而且運行正常。
  • OSD狀態爲in且down 此時該OSD尚處於集羣中,可是守護進程狀態已經不正常,默認在300秒後會被踢出集羣,狀態進而變爲out且down,以後處於該OSD上的PG會遷移至其它OSD。
  • OSD狀態爲out且up 這種狀態通常會出如今新增OSD時,意味着該OSD守護進程正常,可是還沒有加入集羣。
  • OSD狀態爲out且down 在該狀態下的OSD不在集羣內,而且守護進程運行不正常,CRUSH不會再分配PG到該OSD上。

集羣監控管理

集羣總體運行狀態debug

# ceph -s   
cluster:  
 id:8230a918-a0de-4784-9ab8-cd2a2b8671d0  
 health: HEALTH_WARN  
 application not enabled on 1 pool(s)  
  
 services:  
 mon:3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 27h)  
 mgr: cephnode01(active, since 53m), standbys: cephnode03, cephnode02  
 osd:4 osds:4 up (since 27h),4in(since 19h)  
 rgw:1 daemon active (cephnode01)  
  
 data:  
 pools:6 pools,96 pgs  
 objects:235 objects,3.6KiB  
 usage:4.0GiB used,56GiB/60GiB avail  
 pgs:96 active+clean
  • id:集羣ID
  • health:集羣運行狀態,這裏有一個警告,說明是有問題,意思是pg數大於pgp數,一般此數值相等。
  • mon:Monitors運行狀態。
  • osd:OSDs運行狀態。
  • mgr:Managers運行狀態。
  • mds:Metadatas運行狀態。
  • pools:存儲池與PGs的數量。
  • objects:存儲對象的數量。
  • usage:存儲的理論用量。
  • pgs:PGs的運行狀態
~]$ ceph -w  
~]$ ceph health detail  
#pg狀態  
~]$ ceph pg dump  
~]$ ceph pg stat  
  
#pool狀態  
~]$ ceph osd pool stats  
~]$ ceph osd pool stats   
  
#osd狀態  
~]$ ceph osd stat  
~]$ ceph osd dump  
~]$ ceph osd tree  
~]$ ceph osd df  
  
#Monitor狀態和查看仲裁狀態  
~]$ ceph mon stat  
~]$ ceph mon dump  
~]$ ceph quorum_status  
  
#集羣空間用量  
~]$ ceph df  
~]$ ceph df detail

集羣配置管理(臨時和全局,服務平滑重啓)

有時候須要更改服務的配置,但不想重啓服務,或者是臨時修改。這時候就可使用tell和daemon子命令來完成此需求。code

查看運行配置命令格式:
# ceph daemon {daemon-type}.{id} config show 
命令舉例:
# ceph daemon osd.0 config show

tell子命令格式

使用 tell 的方式適合對整個集羣進行設置,使用 * 號進行匹配,就能夠對整個集羣的角色進行設置。而出現節點異常沒法設置時候,只會在命令行當中進行報錯,不太便於查找。對象

命令格式:
# 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:爲要操做的對象類型如osd、mon、mds等。
  • daemon id:該對象的名稱,osd一般爲0、1等,mon爲ceph -s顯示的名稱,這裏能夠輸入*表示所有。
  • injectargs:表示參數注入,後面必須跟一個參數,也能夠跟多個

daemon子命令

使用 daemon 進行設置的方式就是一個個的去設置,這樣能夠比較好的反饋,此方法是須要在設置的角色所在的主機上進行設置。blog

命令格式:
# ceph daemon {daemon-type}.{id} config set {name}={value}
命令舉例:
# ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false

集羣操做

一、啓動全部守護進程
# systemctl start ceph.target
二、按類型啓動守護進程
# 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

#添加  
一、格式化磁盤  
ceph-volume lvm zap /dev/sd<id>  
二、進入到ceph-deploy執行目錄/my-cluster,添加OSD  
# ceph-deploy osd create --data /dev/sd<id> $hostname  
  
#刪除  
一、調整osd的crush weight爲0  
ceph osd crush reweight osd.<ID>0.0  
二、將osd進程stop  
systemctl stop ceph-osd@<ID>  
三、將osd設置out  
ceph osd out<ID>  
四、當即執行刪除OSD中數據  
ceph osd purge osd.<ID>--yes-i-really-mean-it  
五、卸載磁盤  
umount /var/lib/ceph/osd/ceph-?

擴容PG

ceph osd pool set{pool-name} pg_num 128
ceph osd pool set{pool-name} pgp_num 128 

注:一、擴容大小取跟它接近的2的N次方。二、在更改pool的PG數量時,需同時更改PGP的數量。PGP是爲了管理placement而存在的專門的PG,它和PG的數量應該保持一致。若是你增長pool的pg_num,就須要同時增長pgp_num,保持它們大小一致,這樣集羣才能正常rebalancing。生命週期

Pool操做

#列出存儲池  
ceph osd lspools  
  
#建立存儲池  
命令格式:  
# ceph osd pool create {pool-name} {pg-num} [{pgp-num}]  
命令舉例:  
# ceph osd pool create rbd  32 32  
  
#設置存儲池配額  
命令格式:  
# ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]  
命令舉例:  
# ceph osd pool set-quota rbd max_objects 10000  
  
#刪除存儲池  
ceph osd pool delete{pool-name}[{pool-name}--yes-i-really-really-mean-it]  
  
#重命名存儲池  
ceph osd pool rename {current-pool-name}{new-pool-name}  
  
#查看存儲池統計信息  
rados df  
  
#給存儲池作快照  
ceph osd pool mksnap {pool-name}{snap-name}  
  
#刪除存儲池的快照  
ceph osd pool rmsnap {pool-name}{snap-name}  
  
#獲取存儲池選項值  
ceph osd pool get{pool-name}{key}  
  
#調整存儲池選項值  
ceph osd pool set{pool-name}{key}{value}  
size:#設置存儲池中的對象副本數,詳情參見設置對象副本數。僅適用於副本存儲池。  
min_size:#設置 I/O 須要的最小副本數,詳情參見設置對象副本數。僅適用於副本存儲池。  
pg_num:#計算數據分佈時的有效 PG 數。只能大於當前 PG 數。  
pgp_num:#計算數據分佈時使用的有效 PGP 數量。小於等於存儲池的 PG 數。  
hashpspool:#給指定存儲池設置/取消 HASHPSPOOL 標誌。  
target_max_bytes:#達到 max_bytes 閥值時會觸發Ceph沖洗或驅逐對象。  
target_max_objects:#達到 max_objects 閥值時會觸發Ceph沖洗或驅逐對象。  
scrub_min_interval:#在負載低時,洗刷存儲池的最小間隔秒數。若是是0,就按照配置文件裏的 osd_scrub_min_interval 。  
scrub_max_interval:#無論集羣負載如何,都要洗刷存儲池的最大間隔秒數。若是是0,就按照配置文件裏的 osd_scrub_max_interval 。  
deep_scrub_interval:#「深度」洗刷存儲池的間隔秒數。若是是0,就按照配置文件裏的 osd_deep_scrub_interval 。  
  
#獲取對象副本數  
ceph osd dump| grep 'replicated size'

用戶管理

Ceph 把數據以對象的形式存於各存儲池中。Ceph 用戶必須具備訪問存儲池的權限纔可以讀寫數據。另外,Ceph 用戶必須具備執行權限纔可以使用 Ceph 的管理命令。

查看用戶信息  
  
查看全部用戶信息  
# ceph auth list  
  
獲取全部用戶的key與權限相關信息  
# ceph auth get client.admin  
  
若是隻須要某個用戶的key信息,可使用pring-key子命令  
# ceph auth print-key client.admin   
  
添加用戶  
# 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  
  
修改用戶權限  
# 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 ' '  
  
刪除用戶  
# ceph auth del {TYPE}.{ID}  
其中, {TYPE} 是 client,osd,mon 或 mds 的其中一種。{ID} 是用戶的名字或守護進程的 ID 。

增長和刪除Monitor

一個集羣能夠只有一個 monitor,推薦生產環境至少部署 3 個。Ceph 使用 Paxos 算法的一個變種對各類 map 、以及其它對集羣來講相當重要的信息達成共識。建議(但不是強制)部署奇數個 monitor 。Ceph 須要 mon 中的大多數在運行並可以互相通訊,好比單個 mon,或 2 箇中的 2 個,3 箇中的 2 個,4 箇中的 3 個等。初始部署時,建議部署 3 個 monitor。後續若是要增長,請一次增長 2 個。

#新增一個monitor
# ceph-deploy mon create $hostname
注意:執行ceph-deploy以前要進入以前安裝時候配置的目錄。/my-cluster

#刪除monitor
# ceph-deploy mon destroy $hostname
注意:確保你刪除某個Mon後,其他Mon仍能達成一致。若是不可能,刪除它以前可能須要先增長一個。

jishuroad.jpg

相關文章
相關標籤/搜索