radosgw的multisite元数据不同步问题分析
2022-05-09 本文已影响0人
小跑001
1 现象
在一个机房里面创建bucket之后再另外的机房一直不能同步, 命令radosgw-admin sync status 发现一直有个40 sharding behind
2 分析
1) 借助ansible工具批量调整rgw的日志级别为20/20, 观察日志并没发现有明显的元数据同步问题
2)查看两边机房的meta.log.period.40 的omapkeys, 命令为rados -p .rgw.log listomapkeys meta.log.period.40, 发现master机房有部分数据,而另外一个机房没有数据
- 查看同步的marker, radosgw-admin metadata sync status , 发现40对应的sharding marker还是很久以前的 。 ps:marker的标记实际是通过时间戳生成的,可以比较时间大小
4)翻阅代码,如下:
在这里非master zone会拉取master的mdlog.shard.40到本地,然而这里一直没触发,要么这个流程压根没进来,要么就是这些marker有异常, 不过想了很久也没发现这里的逻辑有什么问题,这里的mdlog_marker对应的是master的mdlog位置,每次都从这个位置开始拉远程数据到本地,然后本地又会从max_marker开始处理,只有等处理完了,也即mdlog_marker小于或者等于max_marker,才会再次触发去master拉取日志。
5) 开源社区也有类似问题,参考:https://tracker.ceph.com/issues/46563, 从日志分析来看,的确是second日志为空了导致max_marker为空,从而不再拉取远程日志,比较符合我这边出现的现象
- 另外一个开源分析,参考:https://tracker.ceph.com/issues/39657 ,显示的是某个数据同步失败,与这里现象不符
7)我简单的重启了所有的rgw,就恢复了,重启的时候要滚动重启,不要影响线上服务, 理解这里重启会初始化max_marker为sync_marker.marker, 满足条件,因此会去拉取远程日志
其中关于同步流程可以参考以下文章:
同步流程:https://zhuanlan.zhihu.com/p/375477532
代码讲解:https://www.youtube.com/watch?v=gaUZv3ZYLxI
协程解析:https://blog.csdn.net/jeegnchen/article/details/102509969