乐趣区

关于程序员:Ceph-FAQ-总结

Ceph FAQ 总结

生产环境如何部署 Ceph

1. 在 kubernetes 零碎中应用 CephCSI 时,是 Fuse 好,还是 KernelMod 好?

因为容器在技术文件系统层面不存在隔离,而 kubernetes 中 pod 运行时 kubelet 组件
依赖各种 fs 相干的工具加载和检测文卷,因而 Ceph 产生零碎异样时,会影响整个工作节点。
因而举荐 CephCSI 部署是 mount 形式改为 fuse,晋升零碎稳定性。

2. CephFS 有没有必要部署为多活 (MDS) 模式,还须要做其余哪些筹备?

因为 CephFS 单活模式下,一个 MDS 服务治理整个文件系统树,局部文件出错会连累整个
文件系统,因而在条件容许的状况下尽量部署多活 (MDS) 模式。此外,倡议做好 metadata
pool 的数据备份,

3. 编排工具应用 cephadm 和 rook 哪个更好,他们之间有什么区别?

cephadm 是 ceph 我的项目自带的编排工具,部署 Ceph 这个组件时能够通过批改配置脚本的形式使得各个节点的物理资源失去更加充沛的利用,并且以后版本曾经应用 docker 容器来运行 ceph 组件,比照传统的 ansible 等运维工具更贴合现在的潮流;rook-ceph 则是第三方团队为 ceph 打造的编码工具,更贴合 kubernetes 业务,能够应用云原生的可观测组件,对容器、日志、网络等基础设施进行更好的监控,它更适应云上的编排环境,它将 ceph 组件运行在 kubernetes 的容器中,后续应用中可根据云厂商提供的富容器减少零碎的安全性和健壮性。

问题解决

1. 客户端挂载 ceph 查看的容量与理论容量不符?如何解决 osd 之间数据不平衡问题?

此问题个别是因为局部 OSD 使用率远高于其余 OSD 的使用率导致,属于数据平衡性问题的一种。
利用 osd utilization 命令优化平衡性即可。

ceph osd reweight-by-utilization

2. 如何解决 osd crash down 当前零碎中的报警?

ceph crash  archive-all

3. 如何解决 ceph 集群复原速度慢的问题?

# 仅思考数据恢复,不思考数据访问速度
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

# 复原兼容性能模式
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

# 生产环境
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. 如何修复有问题的 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')
# ...

# 修复 pg
ceph pg scrub 65.168
ceph pg deep-scrub 65.168
ceph pg repair 65.168

# 修复 pg 所对应的 osd
ceph osd repair 12
ceph osd repair 5
ceph osd repair 10

5. 如何手动挪动 pg 从 osd1 到 osd2?

ceph osd pg-upmap-items a.b 1 2

6. 如何暂停 Ceph 中正在运行的服务,进行调试或是优化?

# 备份以后配置
ceph osd set noout
kubectl get deployment rook-ceph-osd-$i -n rook-ceph > rook-ceph-osd-$i.yaml

# 服务暂停
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": []}]}}}}'

#服务复原
kubectl apply --replace -f rook-ceph-osd-$i.yaml
ceph osd unset noout

7. 如果敞开一些 ceph 集群后盾执行的工作

#
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 调用 ceph osd force-create-pg 并且通过长期期待仍无奈重建的问题?

9. 如何解决 pg 长期处于 unknown 状态?

# 重建 pg 对象
ceph osd force-create-pg a.b

# 当 force create 有效时执行上面的命令
ceph osd pg-temp a.b 1 10 14
ceph osd pg-upmap a.b 1 10 14

10. 如何显示更详尽的日志以不便调试和追踪问题

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. 如何关上和敞开本地 ceph 调试日志?

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. 批改解决因为 rook ceph operator 重置后的 monitor 集群后 secret 和 configmap 中 mon_host 不匹配的问题?

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 服务无奈进入 active 状态的问题?

# 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 呈现容量报警。

[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)

排查此问题是须要察看集群是否处于 HEALTH_OK 状态,如果是的则应用‘解决办法 1’,如果不是则须要进入问题排查流程

1. 解决办法 1:使 mon 进入数据压缩模式
ceph tell mon.* compact
2. 解决办法 2: 下乡正在产生预警的 OSD
ceph osd.* down
3. 解决办法 3: 增大报警阈值
ceph config set global mon_data_size_warn 30GiB

15.Ceph Cluster Monitor 呈现 Slow OPS 报警。

[WRN] SLOW_OPS: 10319 slow ops, oldest one blocked for 736 sec, daemons [mon.c,mon.d,mon.e,mon.h] have slow ops.

如果呈现 Monintor 处于失常工作状态中时不存在大量读写的状况,暂停正在进行数据同步的客户端,顺次排查其余组件是否呈现报警或者频繁的重启及上电。

16.Ceph 呈现 Operator 批改了 Mon 列表如何解决。

批改 ConfigMap rook-ceph-csi-config rook-ceph-mon-endpoints
批改 Secret rook-ceph-config

17.CephFS 如何进行 Metadata 数据修复

# 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 的执行进度
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 配置额定的备份?

# 首先,应该删除现有的文件系统(如果还没有删除的话),以避免对数据池的进一步批改。卸载所有客户端,而后标记文件系统失败:
ceph fs fail <fs_name>

# 接下来,创立一个复原文件系统,咱们将在其中填充由原始数据池反对的新元数据池。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


# 复原文件系统从一个 MDS 秩开始,它将用一些元数据初始化新的元数据池。# 这对于疏导复原是必要的。然而,当初咱们将敞开 MDS,因为咱们不心愿它与元数据池进一步交互。ceph fs fail cephfs_recovery

# 接下来,咱们将重置 MDS 创立的初始元数据:
cephfs-table-tool cephfs_recovery:all reset session
cephfs-table-tool cephfs_recovery:all reset snap
cephfs-table-tool cephfs_recovery:all reset inode


# 当初从数据池中复原元数据池:
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

# 复原后,局部复原目录的统计信息会不正确。确保参数 mds_verify_scatter 
# 和 mds_debug_scatterstat 设置为 false(默认值),避免 MDS 查看统计信息:
ceph config rm mds mds_verify_scatter
ceph config rm mds mds_debug_scatterstat

# (留神,配置也能够是全局设置的,也能够是通过 ceph.conf 文件设置的。)当初,容许 MDS 退出复原文件系统:
ceph fs set cephfs_recovery joinable true

# 最初,运行前向革除以修复统计信息。确保您有一个 MDS 正在运行并收回:
ceph fs status # get active MDS
ceph tell mds.<id> scrub start / recursive repair

更多技术分享浏览我的博客:

https://thierryzhou.github.io

本文由 mdnice 多平台公布

退出移动版