一、常見問題
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"
自動處理
ceph osd reweight-by-utilization ceph osd reweight-by-pg 105 cephfs_data(pool_name)
手動處理
ceph osd reweight osd.2 0.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在它的生命周期的不同時刻可能會處於以下幾種狀態中:
1.Creating(創建中) 在創建POOL時,需要指定PG的數量,此時PG的狀態便處於creating,意思是Ceph正在創建PG。
2.Peering(互聯中) peering的作用主要是在PG及其副本所在的OSD之間建立互聯,並使得OSD之間就這些PG中的object及其元數據達成一致。
3.Active(活躍的) 處於該狀態意味着數據已經完好的保存到了主PG及副本PG中,並且Ceph已經完成了peering工作。
4.Clean(整潔的) 當某個PG處於clean狀態時,則說明對應的主OSD及副本OSD已經成功互聯,並且沒有偏離的PG。也意味着Ceph已經將該PG中的對象按照規定的副本數進行了復制操作。5.Degraded(降級的) 當某個PG的副本數未達到規定個數時,該PG便處於degraded狀態。
6.在客戶端向主OSD寫入object的過程,object的副本是由主OSD負責向副本OSD寫入的,直到副本OSD在創建object副本完成,並向主OSD發出完成信息前,該PG的狀態都會一直處於degraded狀態。又或者是某個OSD的狀態變成了down,那么該OSD上的所有PG都會被標記為degraded。當Ceph因為某些原因無法找到某個PG內的一個或多個object時,該PG也會被標記為degraded狀態。此時客戶端不能讀寫找不到的對象,但是仍然能訪問位於該PG內的其他object。
7.Recovering(恢復中) 當某個OSD因為某些原因down了,該OSD內PG的object會落后於它所對應的PG副本。而在該OSD重新up之后,該OSD中的內容必須更新到當前狀態,處於此過程中的PG狀態便是recovering。
8.Backfilling(回填) 當有新的OSD加入集群時,CRUSH會把現有集群內的部分PG分配給它。這些被重新分配到新OSD的PG狀態便處於backfilling。
9.Remapped(重映射) 當負責維護某個PG的acting set變更時,PG需要從原來的acting set遷移至新的acting set。這個過程需要一段時間,所以在此期間,相關PG的狀態便會標記為remapped。10.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的狀態。
1.OSD狀態為in且up 這是一個OSD正常的狀態,說明該OSD處於集群內,並且運行正常。
2.OSD狀態為in且down 此時該OSD尚處於集群中,但是守護進程狀態已經不正常,默認在300秒后會被踢出集群,狀態進而變為out且down,之后處於該OSD上的PG會遷移至其它OSD。
3.OSD狀態為out且up 這種狀態一般會出現在新增OSD時,意味着該OSD守護進程正常,但是尚未加入集群。
4.OSD狀態為out且down 在該狀態下的OSD不在集群內,並且守護進程運行不正常,CRUSH不會再分配PG到該OSD上。
四、集群監控管理
集群整體運行狀態
# 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), 4 in (since 19h) rgw: 1 daemon active (cephnode01) data: pools: 6 pools, 96 pgs objects: 235 objects, 3.6 KiB usage: 4.0 GiB used, 56 GiB / 60 GiB 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子命令來完成此需求。
查看運行配置 命令格式: # 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 進行設置的方式就是一個個的去設置,這樣可以比較好的反饋,此方法是需要在設置的角色所在的主機上進行設置。
命令格式: # ceph daemon {daemon-type}.{id} config set {name}={value} 命令舉例: # ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false
六、集群操作
1、啟動所有守護進程 # systemctl start ceph.target 2、按類型啟動守護進程 # 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
ceph 官方開發了 ceph-mgr,主要目標實現 ceph 集群的管理,為外界提供統一的入口。(把集群的一些指標暴露給外界使用,比如用於監控)
添加和刪除osd
添加 1、格式化磁盤 ceph-volume lvm zap /dev/sd 2、進入到ceph-deploy執行目錄/my-cluster,添加OSD # ceph-deploy osd create --data /dev/sd 刪除 1、調整osd的crush weight為 0 ceph osd crush reweight osd.<ID> 0.0 2、將osd進程stop systemctl stop ceph-osd@<ID> 3、將osd設置out ceph osd out <ID> 4、立即執行刪除OSD中數據 ceph osd purge osd.<ID> --yes-i-really-mean-it 5、卸載磁盤 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 注:1、擴容大小取跟它接近的2的N次方 2、在更改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 仍能達成一致。如果不可能,刪除它之前可能需要先增加一個。
https://www.jianshu.com/p/dd572541df2e ceph優化
https://mp.weixin.qq.com/s/X59UFaP1UnOb5h21z1aFdA
http://docs.ceph.org.cn/ 中文社區
七、ceph的版本
https://docs.ceph.com/en/latest/releases/general/ 官網版本介紹
第一個 Ceph 版本是 0.1 ,要回溯到 2008 年 1 月。多年來,版本號方案一直沒變,直到 2015 年 4 月 0.94.1 ( Hammer 的第一個修正版)發布后,為了避免 0.99 (以及 0.100 或 1.00 ?),我們制定了新策略。
-
x.0.z - 開發版(給早期測試者和勇士們)
-
x.1.z - 候選版(用於測試集群、高手們)
-
x.2.z - 穩定、修正版(給用戶們)
x 將從 9 算起,它代表 Infernalis ( I 是第九個字母),這樣我們第九個發布周期的第一個開發版就是 9.0.0 ;后續的開發版依次是 9.0.1 、 9.0.2 等等。
https://blog.csdn.net/qq_37242520/article/details/108101126 ceph的dashboard
https://www.bookstack.cn/read/ceph-handbook/Operation-operate_cluster.md ceph運維手冊
https://yq.aliyun.com/articles/606731 ceph調優