Ceph FAQ 總結(jié)
生產(chǎn)環(huán)境如何部署Ceph
1. 在kubernetes系統(tǒng)中使用CephCSI時(shí),是Fuse好棚放,還是KernelMod好?
由于容器在技術(shù)文件系統(tǒng)層面不存在隔離馅闽,而kubernetes中pod運(yùn)行時(shí)kubelet組件
依賴(lài)各種fs相關(guān)的工具加載和檢測(cè)文卷飘蚯,因此Ceph產(chǎn)生系統(tǒng)異常時(shí),會(huì)影響整個(gè)工作節(jié)點(diǎn)福也。
因此推薦CephCSI部署是mount方式改為fuse局骤,提升系統(tǒng)穩(wěn)定性。
2. CephFS有沒(méi)有必要部署為多活(MDS)模式暴凑,還需要做其他哪些準(zhǔn)備峦甩?
由于CephFS單活模式下,一個(gè)MDS服務(wù)管理整個(gè)文件系統(tǒng)樹(shù)现喳,部分文件出錯(cuò)會(huì)拖累整個(gè)
文件系統(tǒng)凯傲,因此在條件允許的情況下盡量部署多活(MDS)模式。此外嗦篱,建議做好metadata
pool的數(shù)據(jù)備份冰单,
3. 編排工具使用cephadm和rook哪個(gè)更好,他們之間有什么區(qū)別灸促?
cephadm是ceph項(xiàng)目自帶的編排工具诫欠,部署Ceph這個(gè)組件時(shí)可以通過(guò)修改配置腳本的方式使得各個(gè)節(jié)點(diǎn)的物理資源得到更加充分的利用,并且當(dāng)前版本已經(jīng)使用docker容器來(lái)運(yùn)行ceph組件浴栽,對(duì)比傳統(tǒng)的ansible等運(yùn)維工具更貼合如今的潮流荒叼;rook-ceph則是第三方團(tuán)隊(duì)為ceph打造的編碼工具,更貼合kubernetes業(yè)務(wù)典鸡,可以使用云原生的可觀測(cè)組件被廓,對(duì)容器、日志椿每、網(wǎng)絡(luò)等基礎(chǔ)設(shè)施進(jìn)行更好的監(jiān)控伊者,它更適應(yīng)云上的編排環(huán)境,它將ceph組件運(yùn)行在kubernetes的容器中间护,后續(xù)使用中可依據(jù)云廠(chǎng)商提供的富容器增加系統(tǒng)的安全性和健壯性。
問(wèn)題處理
1.客戶(hù)端掛載ceph查看的容量與實(shí)際容量不符挖诸?如何解決osd之間數(shù)據(jù)不均衡問(wèn)題汁尺?
此問(wèn)題一般是由于部分OSD使用率遠(yuǎn)高于其他OSD的使用率導(dǎo)致,屬于數(shù)據(jù)平衡性問(wèn)題的一種多律。
利用osd utilization命令優(yōu)化平衡性即可痴突。
ceph osd reweight-by-utilization
2.如何解決osd crash down以后系統(tǒng)中的報(bào)警搂蜓?
ceph crash archive-all
3.如何解決ceph集群恢復(fù)速度慢的問(wèn)題?
# 僅考慮數(shù)據(jù)恢復(fù)辽装,不考慮數(shù)據(jù)訪(fǎng)問(wèn)速度
ceph tell 'osd.*' injectargs --osd_max_backfills 32
ceph tell 'osd.*' injectargs --osd_recovery_max_active_hdd 16
ceph tell 'osd.*' injectargs --osd_recovery_max_active_ssd 64
ceph tell 'osd.*' injectargs --osd_recovery_sleep_hdd 0
ceph tell 'osd.*' injectargs --osd_backfill_scan_min 32
# 恢復(fù)兼容性能模式
ceph tell 'osd.*' injectargs --osd_max_backfills 8
ceph tell 'osd.*' injectargs --osd_recovery_max_active_hdd 4
ceph tell 'osd.*' injectargs --osd_recovery_max_active_ssd 16
ceph tell 'osd.*' injectargs --osd_recovery_sleep_hdd 0.0001
ceph tell 'osd.*' injectargs --osd_recovery_max_single_start 8
# 生產(chǎn)環(huán)境
ceph tell 'osd.*' injectargs --osd_max_backfills 4
ceph tell 'osd.*' injectargs --osd_recovery_max_active_hdd 4
ceph tell 'osd.*' injectargs --osd_recovery_max_active_ssd 16
ceph tell 'osd.*' injectargs --osd_recovery_sleep_hdd 0.01
ceph tell 'osd.*' injectargs --osd_recovery_max_single_start 4
4.如何修復(fù)有問(wèn)題的pg帮碰?
ceph health detail
# ...
# pg 65.168 is incomplete, acting [12,5,10] (reducing pool aifs-data0 min_size from 2 may help; search ceph.com/docs for 'incomplete')
# ...
# 修復(fù)pg
ceph pg scrub 65.168
ceph pg deep-scrub 65.168
ceph pg repair 65.168
# 修復(fù)pg所對(duì)應(yīng)的osd
ceph osd repair 12
ceph osd repair 5
ceph osd repair 10
5.如何手動(dòng)移動(dòng)pg從osd1到osd2?
ceph osd pg-upmap-items a.b 1 2
6.如何暫停Ceph中正在運(yùn)行的服務(wù)拾积,進(jìn)行調(diào)試或是優(yōu)化殉挽?
# 備份當(dāng)前配置
ceph osd set noout
kubectl get deployment rook-ceph-osd-$i -n rook-ceph > rook-ceph-osd-$i.yaml
# 服務(wù)暫停
kubectl -n rook-ceph patch deployment rook-ceph-osd-$i --type='json' -p '[{"op":"remove", "path":"/spec/template/spec/containers/0/livenessProbe"}]'
kubectl -n rook-ceph patch deployment rook-ceph-osd-$i -p '{"spec": {"template": {"spec": {"containers": [{"name": "osd", "command": ["sleep", "infinity"], "args": []}]}}}}'
#服務(wù)恢復(fù)
kubectl apply --replace -f rook-ceph-osd-$i.yaml
ceph osd unset noout
7.如果關(guān)閉一些ceph集群后臺(tái)執(zhí)行的任務(wù)
#
ceph osd set noout
#ceph osd unset noout
ceph osd set nocovery
#ceph osd unset nocovery
ceph osd set noscrub
#ceph osd unset noscrub
ceph osd set nodeep-scrub
#ceph osd unset nodeep-scrub
ceph osd set nobackfill
#ceph osd unset nobackfill
8. 如何解決部分pg調(diào)用ceph osd force-create-pg并且經(jīng)過(guò)長(zhǎng)期等待仍無(wú)法重建的問(wèn)題?
9. 如何解決pg長(zhǎng)期處于unknown狀態(tài)拓巧?
# 重建pg對(duì)象
ceph osd force-create-pg a.b
# 當(dāng) force create 無(wú)效時(shí)執(zhí)行下面的命令
ceph osd pg-temp a.b 1 10 14
ceph osd pg-upmap a.b 1 10 14
10. 如何顯示更詳盡的日志以方便調(diào)試和追蹤問(wèn)題
ceph tell osd.0 injectargs --debug-osd 0/5
ceph tell mon.a injectargs --debug-osd 0/5
ceph tell mds.a injectargs --debug-osd 0/5
11.如何打開(kāi)和關(guān)閉本地ceph調(diào)試日志斯碌?
echo "module libceph +p" >/sys/kernel/debug/dynamic_debug/control
echo "module ceph +p" >/sys/kernel/debug/dynamic_debug/control
echo "module libceph -p" >/sys/kernel/debug/dynamic_debug/control
echo "module ceph -p" >/sys/kernel/debug/dynamic_debug/control
12. 修改解決因?yàn)閞ook ceph operator重置后的monitor集群后secret和configmap中mon_host不匹配的問(wèn)題?
mon_host=$(kubectl -n rook-ceph get svc rook-ceph-mon-b -o jsonpath='{.spec.clusterIP}')
kubectl -n rook-ceph patch secret rook-ceph-config -p '{"stringData": {"mon_host": "[v2:'"${mon_host}"':3300,v1:'"${mon_host"':6789]", "mon_initial_members": "'"${good_mon_id}"'"}}'
13.如何解決CephFS MDS服務(wù)無(wú)法進(jìn)入active狀態(tài)的問(wèn)題肛度?
# Session table
cephfs-table-tool cephfs:all reset session
# SnapServer
cephfs-table-tool cephfs:all reset snap
# InoTable
cephfs-table-tool cephfs:all reset inode
# Journal
cephfs-journal-tool --rank cephfs:all journal reset
# Root inodes ("/" and MDS directory)
cephfs-data-scan init --force-init
14.CephFS Monitor出現(xiàn)容量報(bào)警傻唾。
[WRN] MON_DISK_BIG: mons a,b,c,d,e are using a lot of disk space
mon.a is 18 GiB >= mon_data_size_warn (15 GiB)
mon.b is 17 GiB >= mon_data_size_warn (15 GiB)
mon.c is 18 GiB >= mon_data_size_warn (15 GiB)
mon.d is 18 GiB >= mon_data_size_warn (15 GiB)
mon.e is 18 GiB >= mon_data_size_warn (15 GiB)
排查此問(wèn)題是需要觀察集群是否處于HEALTH_OK狀態(tài),如果是的則使用‘解決辦法1’承耿,如果不是則需要進(jìn)入問(wèn)題排查流程
1.解決辦法1:使mon進(jìn)入數(shù)據(jù)壓縮模式
ceph tell mon.* compact
2.解決辦法2: 下鄉(xiāng)正在產(chǎn)生預(yù)警的OSD
ceph osd.* down
3.解決辦法3: 增大報(bào)警閾值
ceph config set global mon_data_size_warn 30GiB
15.Ceph Cluster Monitor出現(xiàn)Slow OPS報(bào)警冠骄。
[WRN] SLOW_OPS: 10319 slow ops, oldest one blocked for 736 sec, daemons [mon.c,mon.d,mon.e,mon.h] have slow ops.
如果出現(xiàn)Monintor處于正常工作狀態(tài)中時(shí)不存在大量讀寫(xiě)的情況,暫停正在進(jìn)行數(shù)據(jù)同步的客戶(hù)端加袋,依次排查其他組件是否出現(xiàn)報(bào)警或者頻繁的重啟及上電猴抹。
16.Ceph 出現(xiàn)Operator修改了Mon列表如何處理。
修改ConfigMap rook-ceph-csi-config rook-ceph-mon-endpoints
修改Secret rook-ceph-config
17.CephFS 如何進(jìn)行Metadata數(shù)據(jù)修復(fù)
# Worker 0
for i in {0..3}; do cephfs-data-scan scan_extents --worker_n $i --worker_m 16 <data pool>
# Worker 1
for i in {4..7}; do cephfs-data-scan scan_extents --worker_n $i --worker_m 16 <data pool>
# Worker 2
for i in {8..11}; do cephfs-data-scan scan_extents --worker_n $i --worker_m 16 <data pool>
# Worker 3
for i in {12..15}; do cephfs-data-scan scan_extents --worker_n $i --worker_m 16 <data pool>
# Worker 0
for i in {0..3}; do cephfs-data-scan scan_inodes --worker_n $i --worker_m 16 <data pool>
# Worker 1
for i in {4..7}; do cephfs-data-scan scan_inodes --worker_n $i --worker_m 16 <data pool>
# Worker 2
for i in {8..11}; do cephfs-data-scan scan_inodes --worker_n $i --worker_m 16 <data pool>
# Worker 3
for i in {12..15}; do cephfs-data-scan scan_inodes --worker_n $i --worker_m 16 <data pool>
# Worker 0
for i in {0..3}; do cephfs-data-scan scan_links --worker_n $i --worker_m 16
# Worker 1
for i in {4..7}; do cephfs-data-scan scan_links --worker_n $i --worker_m 16
# Worker 2
for i in {8..11}; do cephfs-data-scan scan_links --worker_n $i --worker_m 16
# Worker 3
for i in {12..15}; do cephfs-data-scan scan_links --worker_n $i --worker_m 16
# 如何在Rook命名空間下查看data scan的執(zhí)行進(jìn)度
kg po -n rook-ceph | grep rook-ceph-tools | awk '{ print $1; }' | xargs -I{} kubectl exec -ti {} -- ps aux | grep cephfs-data-scan
18. CephFS 如何為MetadataPool配置額外的備份锁荔?
# 首先蟀给,應(yīng)該刪除現(xiàn)有的文件系統(tǒng)(如果還沒(méi)有刪除的話(huà)),以防止對(duì)數(shù)據(jù)池的進(jìn)一步修改阳堕。卸載所有客戶(hù)端跋理,然后標(biāo)記文件系統(tǒng)失敗:
ceph fs fail <fs_name>
# 接下來(lái),創(chuàng)建一個(gè)恢復(fù)文件系統(tǒng)恬总,我們將在其中填充由原始數(shù)據(jù)池支持的新元數(shù)據(jù)池前普。
ceph fs flag set enable_multiple true --yes-i-really-mean-it
ceph osd pool create cephfs_recovery_meta
ceph fs new cephfs_recovery recovery <data_pool> --allow-dangerous-metadata-overlay
# 恢復(fù)文件系統(tǒng)從一個(gè)MDS秩開(kāi)始,它將用一些元數(shù)據(jù)初始化新的元數(shù)據(jù)池壹堰。
# 這對(duì)于引導(dǎo)恢復(fù)是必要的拭卿。但是,現(xiàn)在我們將關(guān)閉MDS贱纠,因?yàn)槲覀儾幌Mc元數(shù)據(jù)池進(jìn)一步交互峻厚。
ceph fs fail cephfs_recovery
# 接下來(lái),我們將重置MDS創(chuàng)建的初始元數(shù)據(jù):
cephfs-table-tool cephfs_recovery:all reset session
cephfs-table-tool cephfs_recovery:all reset snap
cephfs-table-tool cephfs_recovery:all reset inode
# 現(xiàn)在從數(shù)據(jù)池中恢復(fù)元數(shù)據(jù)池:
cephfs-data-scan init --force-init --filesystem cephfs_recovery --alternate-pool cephfs_recovery_meta
cephfs-data-scan scan_extents --alternate-pool cephfs_recovery_meta --filesystem <fs_name> <data_pool>
cephfs-data-scan scan_inodes --alternate-pool cephfs_recovery_meta --filesystem <fs_name> --force-corrupt <data_pool>
cephfs-data-scan scan_links --filesystem cephfs_recovery
# 恢復(fù)后谆焊,部分恢復(fù)目錄的統(tǒng)計(jì)信息會(huì)不正確惠桃。確保參數(shù) mds_verify_scatter
# 和 mds_debug_scatterstat 設(shè)置為false(默認(rèn)值),防止MDS檢查統(tǒng)計(jì)信息:
ceph config rm mds mds_verify_scatter
ceph config rm mds mds_debug_scatterstat
# (注意,配置也可以是全局設(shè)置的辜王,也可以是通過(guò)ceph.conf文件設(shè)置的劈狐。)現(xiàn)在,允許MDS加入恢復(fù)文件系統(tǒng):
ceph fs set cephfs_recovery joinable true
# 最后呐馆,運(yùn)行前向清除以修復(fù)統(tǒng)計(jì)信息肥缔。確保您有一個(gè)MDS正在運(yùn)行并發(fā)出:
ceph fs status # get active MDS
ceph tell mds.<id> scrub start / recursive repair