CephFS 健康消息¶
集群健康检查¶
在文件系统映射图结构(以及封闭式的 MDS 映射图)变为特定状态时, Ceph 监视器守护进程会产生健康消息。
- 消息
mds rank(s) ranks have failed
- 描述
一或多个 MDS rank 没能分给守护进程,只有可用的替补守护进程启动后集群才能恢复运转。
- 消息
mds rank(s) ranks are damaged
- 描述
一或多个 MDS rank 遇到了损伤严重的元数据,只有修复这些数据它才能再次启动。
- 消息
mds cluster is degraded
- 描述
一或多个 MDS rank 现在的状态不是 up 且未在线运行,此问题解决前客户端只能暂停元数据操作。此情形涉及失效、损坏的 rank ,另外也包括已分到 MDS 但还没进入 active 状态的 rank (如处于 replay 状态的 rank )。
- 消息
mds names are laggy
- 描述
这些 MDS 守护进程至少有
mds_beacon_grace
秒(默认为 15s )没向监视器发送信标消息( beacon message )了,它们本来应该每mds_beacon_interval
秒(默认为 4s )发送一次的,它们可能崩溃了。 Ceph 监视器会自动用灾备替换掉滞后的守护进程。
- 消息
insufficient standby daemons available
- 描述
一或多个文件系统配置的是需要一定数量的灾备守护进程(包括灾备重放 standby-replay 守护进程),但是集群内却没有足够多的守护进程。非重放的灾备进程可算进任意文件系统(即它们可重叠)。这个警告可用
ceph fs set <fs> standby_count_wanted <count>
来配置,count
配置为 0 时禁用此功能。
守护进程报告的健康检查¶
MDS 守护进程能定位各种各样不该出现的状况,并通过 ceph status
出示给操作员。这些状况附带了人类可读的消息,另外 JSON 格式的输出还有一个以 MDS_HEALTH 打头的唯一代码。
- 消息
“Behind on trimming…”
- 代码
MDS_HEALTH_TRIM
- 描述
CephFS 维护着的元数据日志是切成日志片段( log segment )的。日志的长度(按片段数量算)是用
mds_log_max_segments
选项控制的,当片段数量超过配置时, MDS 就开始写回元数据,以便删除(裁剪、 trim )最老的片段。如果回写得太慢,或者软件缺陷妨碍了裁剪,这样的健康消息就可能出现。此消息出现的阈值是片段数量达到mds_log_max_segments
的两倍。
- 消息
“Client name failing to respond to capability release”
- 代码
MDS_HEALTH_CLIENT_LATE_RELEASE, MDS_HEALTH_CLIENT_LATE_RELEASE_MANY
- 描述
CephFS 客户端收到了 MDS 发出的能力( capabilities ) ,它就像锁。有时候,比如一个客户端需要访问权, MDS 就会让别的客户端释放它们的能力,如果有客户端没响应、或者有缺陷,它就有可能没及时释放、或者根本不释放。如果某个客户端的响应时间超过了
session_timeout
(默认为 60s ),这条消息就会出现。
- 消息
“Client name failing to respond to cache pressure”
- 代码
MDS_HEALTH_CLIENT_RECALL, MDS_HEALTH_CLIENT_RECALL_MANY
- 描述
客户端有各自的元数据缓存,客户端缓存中的条目(比如索引节点)也会存在于 MDS 缓存中,所以当 MDS 需要削减其缓存时(为了使之保持在
mds_cache_size
或mds_cache_memory_limit
以下),它也会发消息给客户端让它们削减各自的缓存。如果有客户端没响应或者有缺陷,就会妨碍 MDS 将缓存保持在其限额以下, MDS 就有可能耗尽内存而后崩溃。如果某个客户端在最后一个mds_recall_warning_decay_rate
秒数内都没能释放到mds_recall_warning_threshold
(以mds_recall_max_decay_rate
为半衰期衰减)之下,这条消息就会出现。
- 消息
“Client name failing to advance its oldest client/flush tid”
- 代码
MDS_HEALTH_CLIENT_OLDEST_TID, MDS_HEALTH_CLIENT_OLDEST_TID_MANY
- 描述
CephFS 的客户端-MDS 协议有一个名为 oldest tid 的字段,可让客户端通知 MDS 哪些请求全部完成了,这样的话它就有可能被 MDS 遗忘。如果一个有缺陷的客户端未能上报这个字段,那么与之相关的 MDS 就不能擅自清理这些请求所占用的资源。如果某个客户端的请求在 MDS 端已完成、但尚未收到客户端上报的 oldest tid 值,这样的请求数量超过
max_completed_requests
(默认为 100000 )时,此消息就会出现。
- 消息
“Metadata damage detected”
- 代码
MDS_HEALTH_DAMAGE,
- 描述
从元数据存储池读取时,遇到了元数据损坏或丢失的情况。这条消息表明损坏之处已经被妥善隔离了,以使 MDS 继续运作,如此一来,若有客户端访问损坏的子树就返回 IO 错误。关于损坏的细节信息可用
damage ls
管理套接字命令获取。只要一遇到受损元数据,此消息就会立即出现。
- 消息
“MDS in read-only mode”
- 代码
MDS_HEALTH_READ_ONLY,
- 描述
MDS 已进入只读模式,任何尝试修改元数据的操作都会收到 EROFS 错误代码。在 MDS 写入元数据存储池时遇到写错误、或者管理员用 force_readonly 管理套接字命令强行设置时, MDS 会进入只读模式。
- 消息
N slow requests are blocked”
- 代码
MDS_HEALTH_SLOW_REQUEST,
- 描述
一或多个客户端请求没有及时完成,说明 MDS 要么跑得太慢、要么 RADOS 集群没及时确认日志写操作、或者软件有缺陷。可用
ops
管理套接字命令罗列未完成的元数据操作。如果有客户端请求花费的时间超过mds_op_complaint_time
(默认为 30s ),此消息就会出现。
- 消息
“Too many inodes in cache”
- 代码
MDS_HEALTH_CACHE_OVERSIZED
- 描述
MDS 没能成功削减缓存,未能降到管理员设置的上限之下。如果 MDS 缓存涨得太大,守护进程可能会耗尽内存然后崩溃。默认情况下,如果实际的缓存尺寸(按索引节点或内存计算)比
mds_cache_size
(默认为 100000 )或mds_cache_memory_limit
(默认为 1GB )大至少 50% ,这个消息就会出现。更改mds_health_cache_threshold
可设置超出的告警比率。