近期,松鼠哥编写的一个集群自动化巡检工具在测试集群的时候发现了几个隐患,crush中的某些host出现在了它本不该出现的root 中
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
很多时候我们在调查问题根因时总会要定位它的时间点及相关操作,确保不是操作引起的问题
问题的发现
近期,松鼠哥编写的一个集群自动化巡检工具在测试集群的时候发现了几个隐患,crush中的某些host出现在了它本不该出现的root 中
1 | -262 60.00000 root my-root1 |
根据预期,OSD-003
应该是属于my-root1
这个root的,但是不知为何它存在default中,对集群后续的数据存放有较大影响,现在的问题就是,这个host是什么时候进入到这个root中的?又或者,它本来就没有发生移动?因为很多处理是自动化的,必须要找到根本原因才能改进,同时也给定位集群问题根源提供经验。
追踪
首先想到的是通过操作记录查找。通过shell的histrory,看了下没有相关crush move的操作记录,不过能够看到osd的创建时间
1 | [twj@OSD-003 ~]$ history |
看来osd创建后,本节点没有做其他操作,那初步怀疑这个节点没有移动过,创建后就自动在default的root中。
ceph相关日志也没法入手,因为ceph日志默认是保存一个星期的,一个星期前的日志肯定是没有了。
还有一个思路就是通过osdmap导出crushmap的方式来调查。
我们知道,osdmap详细记录集群的变动,而且,osdmap是可以通过osdmaptool工具的exporter-crush功能导出一份当时的crushmap,如果这个host发生移动,cruhmap中一定有记录,所以,能不能通过导出osdmap,然后继续导出crushmap,来查到目标host发生的变化呢?
看了下,也不行,主要原因是得不到osdmap的早期版本,因为集群如果是HEALTH_OK
,集群保存的osdmap不会很多,mon会对osdmap的早期版本进行裁剪,通过对mon-003节点的调查也确认了这一点
1 | 查看当前osdmap版本 |
mon-003的db中可以看到最早的osdmap版本都在24527,而当前集群的版本是25079,没差多少,这样一来,这个思路就行不通了。
从PG入手
既然crushmap没法追查到更早的记录,思路上就要换了,不管目标host有没有发生移动,它进入default root后,这个root后面创建了存储池,那么它上面的pg的创建应该是发生在它进入这个root之后的时间,如果能够查到它的pg的创建时间,与它的osd的创建时间做比较,就能大致确定它的行为了。
说干就干,随机抽取这个host上的某个osd进行调查,终于发现了一些踪迹
1 | [twj@OSD-003 ~]$ sudo ceph pg 4.1ff9 query |more |
由这个info可以看到,这个pg的last_clean是2023-08-25 23:24:42
,也就是说至少这个时间它是在这个osd上的,换个角度想,集群因为一直都是健康的,所以clean状态一直没有改变过,那么这个时间应该就是创建完存储池后第一次clean的时间,这个时间跟创建时间应该是极其接近的(创建时间除了看日志,没法精确确定,这里只有创建的时候osdmap的版本号2702)
同时通过对/var/log/ceph/ceph-volume.log
的历史日志印证了这点
1 | [root@OSD-003 ceph]# tail -n1 ceph-volume.log-20230827 |
这台机器的最后一个osd是2023-08-25 23:24:28
创建完启动的,接下来2023-08-25 23:24:42
存储池的pg就创建好了,结合对操作的脚本程序的分析,确认是这个OSD节点在创建起来后,就没有移动到目标root,那就有可能是自动化操作中某个步骤出错导致。
总结
实际追查定位问题,很多时候要靠对集群概念、操作的深入理解,常规方式查不到,就要更加挖掘其他的任何可能性,本篇中从osdmap导出crushmap来定位操作,算是一个比较刁钻的角度,虽然没有从中找到答案,但是是一个非常有意义的突破口,osdmap中记录既有时间,也有版本,还有crushmap,非常详尽,最后的通过pg的信息定位到问题,也是极其特殊的思路,在其他问题的定位和解决思路上有很好的借鉴意义。
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2023/12/25/ceph运维大宝剑之集群操作的定位/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!