CephFAQ

生产环境如何部署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的容器中,后续使用中可依据云厂商提供的富容器增加系统的安全性和健壮性。

4. 生产环境哪些配置必须要修改?

确保mgr中的balancer组件处于未激活状态。

root@host:/home/demo# ceph balancer status
{
    "last_optimize_duration": "0:00:22.402340",
    "plans": [],
    "mode": "crush-compat",
    "active": false,
    "optimize_result": "Unable to find further optimization, change balancer mode and retry might help",
    "last_optimize_started": "Tue Nov 16 18:29:38 2021"
}

激活balancer会导致只要满足自动balancer调节条件,集群就开始平衡各个OSD上的PG,一旦触发只能等待平衡完成,你无法确定影响范围有多大,评估平衡的开始结束时间。

PG自动化平衡会造成你的集群性能会持续抖动,最终造成存储吞吐量降低,网络延迟增加,以及最终客户来投诉你。

确保rgw中rgw_dynamic_resharding配置处于关闭状态

开启动态resharding机制,bucket所对应的数据分片会不断的进行调整,整个reshard过程不可控,文件数越多时间越长,并且reshard过程会对整个bucket加锁,你会发现你的写入操作会把读数据的情况给卡主,会让其他人没有遍历出文件列表,reshard操作推荐在有条件的时候单独进行。

问题处理

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集群修改状态的任务

# 设置osd容忍异常状态
ceph osd set noout
ceph osd set nocovery
ceph osd set noscrub
ceph osd set nodeep-scrub
ceph osd set nobackfill

# 执行任务
...

# 关闭异常状态容忍
#ceph osd unset noout
#ceph osd unset nocovery
#ceph osd unset noscrub
#ceph osd unset nodeep-scrub
#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)

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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...