Ceph: 手动修复对象

调试擦洗错误可能很棘手,你可能不知道该如何继续。
假设你有一个类似以下的集群状态
health HEALTH_ERR 1 pgs inconsistent; 2 scrub errors
让我们来排查一下!
查找 PG ¶
一个简单的命令可以给出我们 PG
bash $ sudo ceph health detail HEALTH_ERR 1 pgs inconsistent; 2 scrub errors pg 17.1c1 is active+clean+inconsistent, acting [21,25,30] 2 scrub errors
好的,有问题的是 PG 17.1c1 并且在 OSD 21、25 和 30 上运行。
你可以随时尝试运行 ceph pg repair 17.1c1 并检查这是否会修复你的问题。 有时可以,有时不行,你需要进一步挖掘。
查找问题 ¶
为了获得根本原因,我们需要深入研究 OSD 日志文件。 一个简单的 grep -Hn 'ERR' /var/log/ceph/ceph-osd.21.log,请注意,如果日志已轮转,你可能需要使用 zgrep 代替。
这给了我们以下根本原因
log [ERR] : 17.1c1 shard 21: soid 58bcc1c1/rb.0.90213.238e1f29.00000001232d/head//17 digest 0 != known digest 3062795895
log [ERR] : 17.1c1 shard 25: soid 58bcc1c1/rb.0.90213.238e1f29.00000001232d/head//17 digest 0 != known digest 3062795895
这条日志说明了什么?
它说对象摘要应该是 3062795895,但实际上是 0。
查找对象 ¶
现在我们必须深入 OSD 21 目录,感谢我们拥有的信息,这非常简单。
我们知道什么?
- 有问题的是 PG: 17.1c1
- OSD 编号
- 对象名称: rb.0.90213.238e1f29.00000001232d
在这个阶段,我们搜索对象
bash $ sudo find /var/lib/ceph/osd/ceph-21/current/17.1c1_head/ -name 'rb.0.90213.238e1f29.00000001232d*' -ls 671193536 4096 -rw-r--r-- 1 root root 4194304 Feb 14 01:05 /var/lib/ceph/osd/ceph-21/current/17.1c1_head/DIR_1/DIR_C/DIR_1/DIR_C/rb.0.90213.238e1f29.00000001232d__head_58BCC1C1__11
现在还有一些其他你可以检查的事情
- 查看每个系统上每个对象的大小
- 查看每个系统上每个对象的 MD5
然后将它们全部比较以找到坏对象。
修复问题 ¶
只需将对象移走即可 :) 使用以下命令
- 停止负责该 PG 的错误对象的 OSD
- 刷新日志 (
ceph-osd -i <id> --flush-journal) - 将坏对象移动到另一个位置
- 再次启动 OSD
- 调用
ceph pg repair 17.1c1
删除对象看起来可能有点粗暴,但最终这是 Ceph 的工作。 当然,以上在你有 3 个副本时效果很好,这样 Ceph 就可以将两个版本进行比较。 2 个副本的情况可能有所不同,Ceph 可能无法解决此冲突,问题可能会持续存在。 因此,一个简单的技巧是将集群设置为 noout 标志,停止具有错误版本的 OSD。 等待一段时间,再次启动 OSD 并取消设置 noout 标志。 集群应该将对象的良好版本同步到具有错误版本的 OSD。