问题:ceph多 mds机制下,重启mds有个cephfs出现degraded的状态,而且备份的mds一直在rejoin。
分析:
-
原因一:在某些mds备用不够的情况下,这个问题也可能会出现,应该是集群存储压力过大,osd有pg出现stuck的情况,一旦mds重启,元数据无法恢复,自然新备用的mds会一直是rejoin的状态。
-
原因二:看rejoin的mds日志发现
2020-04-17 17:03:45.966 7f35f0cf3700 0 mds.beacon.shnode181 Skipping beacon heartbeat to monitors (last acked 37.75s ago); MDS internal heartbeat is not healthy!
此时经查阅资料问题出现在如下关键点:
The fix for this should be part of a broader fix to make the MDS only shrink its cache gradually (e.g. if the operator reduces mds_cache_memory_limit).
-原因三:
当cephfs 存储有大量数据的时候,多个主节点要同步状并进行数据交换,mds 节点有消息监测,默认设置的是15秒超时,如果15没有收到消息,就将节点踢出集群。默认的超时时间较短,会导致压力大,返回数据慢的节点异常,被反复踢出集群,刚被踢出集群,心跳又发现节点是活着的,又会将节点加入集群,加入集群后一会又被踢出,如此反复。此时ceph集群会报“mds cluster is degraded”。服务日志报“heartbeat_map is_healthy 'MDSRank' had timed out after 15”
natilus新版本这个问题比较突出,之前在luminous版本里并不会出现这个问题,standby的mds始终在rejoin状态
解决:
针对原因一:
- 此次情况比较特殊,ceph health detail命令竟然看不到stuck的osd,解决如下:
- 把 使用率比较高的osd降权重,手动触发osd的数据迁移。
- 重新ceph health detail命令,此时会发现stuck的osd,重启相应的osd,mds状态恢复。
针对原因二(收效甚微):
- 调小mds mds_cache_memory_limit到40G 以下
- # ceph tell mds.\* injectargs '--mds_cache_memory_limit=40000000000
- 在/etc/ceph/ceph.conf修改,传到所有ceph节点
针对原因三(主要原因):
-
方法一 mds多活热备调低敏感度,有两个操作:
-
调高mds_beacon_grace=300,调高超时时间。
写到/etc/ceph/ceph.conf里,传到所有mds节点,然后重启mds
-
mds采用热备模式,替换原来冷备模式,加快mds加入速度。
ceph fs set <fs name> allow_standby_replay true
-
-
方法二 mds多活热备静态目录方法,即给目录划分不同的mds
命令:
setfattr -n ceph.dir.pin -v 2 path/to/dir
mkdir -p a/b
# “a” and “a/b” both start without an export pin set
setfattr -n ceph.dir.pin -v 1 a/
# a and b are now pinned to rank 1
setfattr -n ceph.dir.pin -v 0 a/b
# a/b is now pinned to rank 0 and a/ and the rest of its children are still pinned to rank 1