mds.0 is damaged

mds rank 0 is damaged

某次机房断电后,再启动ceph后,出现如下错误:

[root@k8s-node2 ~]# ceph health detail
HEALTH_ERR mds rank 0 is damaged; mds cluster is degraded
mds.0 is damaged
mds cluster is degraded

提示 mds.0 不可用。 在部署ceph时,安装了3个mds, 分别运行在3台服务器上。并且参考官方的配置,使其中一个作为 master 对外提供服务,另外两个作为 standby。来预防单点故障。(max_mds 设置为 2)

http://docs.ceph.com/docs/jewel/cephfs/standby/#examples

该错误发生后,3 个mds,均为 standby 状态。按照官网的描述来看,当所有 mds 均处于 standby 状态时,其中一个 mds 会选举称为 master.

于是挨个停止mds, 随后又逐个启动并查看/var/log/ceph/ceph-mds.xx.log。发现 mds 在称为 master 时,出现了如下错误:

...

2017-09-26 11:30:48.976326 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)
2017-09-26 11:30:48.976354 7f9ee1734700  0 mds.0.log _replay journaler got error -22, aborting
2017-09-26 11:30:49.071230 7f9ee3941700  0 mds.0.journaler(ro) _finish_read got less than expected (4194304)
2017-09-26 11:30:49.071472 7f9ee1734700 -1 log_channel(cluster) log [ERR] : Error loading MDS rank 0: (22) Invalid argument
2017-09-26 11:30:49.076129 7f9ee1734700  1 mds.k8s-node1 respawn

...

2017-09-26 11:30:49.099291 7f99e58be180  0 pidfile_write: ignore empty --pid-file
2017-09-26 11:30:49.571643 7f99dfacf700  1 mds.k8s-node1 handle_mds_map standby

提示在读取 journal 的时候出现差错,因此可以确定问题出在 mds journal 上。

通过 google 也查到过一些类似的 issue, 大致解决办法是执行:

$ ceph mds repaire 0

并重启各个 mds daemon, 但该方式并不适用此问题。最终参考官方的故障恢复部分章节得以解决:

http://docs.ceph.com/docs/jewel/cephfs/disaster-recovery/

步骤如下(译自上述文档):

1. 导出 journal

在执行有风险的操作之前,先将 journal 备份:

$ ceph-journal-tool journal export backup.bin

Note : 这个文件大小和ceph集群存储数据量成正比,会很大

2. 从 journal 恢复

当 mds 因为 journal 损坏或者其他原因无法读取,为了恢复文件元数据可以执行:

$ ceph-journal-tool event recover_dentries summary

默认会从 mds.0 中恢复, 使用 --rank=<n> 来指定其他mds

这条指令会将 journal 中所有可回收的 inodes/dentries 写到后端存储,前提是要写入的 innodes/dentries 版本比后端存储里面的要高。 如果某个区块的 journal 丢失或者损坏,那么就不会被写到后端存储中。

Note : 除了将inodes/dentries 写入之外, 这条命令还会更新每个 MDS 的 InoTables, 标明被写入的 inodes 号在使用中,在一般情况下,会让后端存储恢复正常状态。

Warning : 此操作不能保证后端存储的状态达到前后一致,而且在此之后有必要执行 MDS 在线 scrub。此命令不会更改日志内容,恢复了能恢复的部分后应该把journal截短。

Note : 然而在执行这个命令之后,集群并未恢复正常,因此还需要往下看

3. 截断日志
$ cephfs-journal-tool journal reset

Warning : 重置journal 将会造成metadata丢失,除非你提前通过诸如 recover_dentries 的方式将metadata保存。该操作可能会在数据池里面产生一些孤儿对象。这会造成已写入的inodes再次被重新分配, 权限规则可能因此被违反。

Note : 有个类似的 issue中也提到了上述步骤(link),但执行到这一步后,就没往下走了。
And mds rejoined again and everything seems to work fine now. 这点我没验证过,担心会有隐患。于是按照文档步骤继续执行了。

4. 清除 MDS 表

在 journal 被 reset 之后, 它可能不再符合MDS表的内容(包括:InoTable, SessionMap, SnapServer). 重置 SessionMap (即擦除所有Session) , 通过命令:

$ cephfs-table-tool all reset session

这条命令会在所有mds中生效, 可以将 all 替换为指定 mds 标号。

5. MDS MAP RESET

一旦文件系统底层的 RADOS 状态(即元数据存储池的内容)有所恢复,有必要更新 MDS 图以反映元数据存储池的内容。可以用下面的命令把 MDS MAP 重置到单个 MDS :

$ ceph fs reset <fs name> --yes-i-really-mean-it

运行此命令之后, MDS rank 保存在 RADOS 上的任何不为 0 的状态都会被忽略:因此这有可能导致数据丢失。

也许有人想知道 fs resetfs remove; fs new 的不同。主要区别在于,执行删除、新建操作会使 rank 0 处于 creating 状态,那样会覆盖所有根索引节点、并使所有文件变成孤儿;相反, reset 命令会使 rank 0 处于 active 状态,这样下一个要认领此 rankMDS 守护进程会继续、并使用已存在于 RADOS 中的数据。

Note : fs name 可通过 ceph fs ls 查看

6. RECOVERY FROM MISSONG METADATA OBJECT
# Session table
cephfs-table-tool 0 reset session
# SnapServer
cephfs-table-tool 0 reset snap
# InoTable
cephfs-table-tool 0 reset inode
# Journal
cephfs-journal-tool --rank=0 journal reset
# Root inodes ("/" and MDS directory)
cephfs-data-scan init

最后,会基于数据池中丢失的文件和目录来重新创建 METADATA OBJECT。分为2步。

  1. 扫描所有对象并计算出inodes 的大小和 mtime metadata

    $ cephfs-data-scan scan_extents <data pool>
    
  2. 扫描每个文件中的第一个对象来收集METADATA,随后注入到 metadata pool

    $ cephfs-data-scan scan_inodes <data pool>
    

Note : 这两个步骤太耗时了,应该考虑起多个workers来同步处理。data pool 可通过 ceph fs ls 查看

# Worker 0
cephfs-data-scan scan_extents <data pool> 0 1
# Worker 1
cephfs-data-scan scan_extents <data pool> 1 1

# Worker 0
cephfs-data-scan scan_inodes <data pool> 0 1
# Worker 1
cephfs-data-scan scan_inodes <data pool> 1 1

==Note : 一定要确保在所有 workers 完成 scan_extents 之后再进行scan_inodes操作。==

待所有操作执行完毕之后:

[root@k8s-master ~]# ceph -s
    cluster e61d687d-f43d-4f50-af66-da96e5856be9
     health HEALTH_OK
     monmap e5: 3 mons at {k8s-master=172.16.18.30:6789/0,k8s-node1=172.16.18.6:6789/0,k8s-node2=172.16.18.7:6789/0}
            election epoch 676, quorum 0,1,2 k8s-node1,k8s-node2,k8s-master
      fsmap e4970: 1/1/1 up {0=k8s-node1=up:active}, 2 up:standby
     osdmap e2914: 6 osds: 6 up, 6 in
            flags sortbitwise,require_jewel_osds
      pgmap v10110565: 256 pgs, 4 pools, 25575 MB data, 372 kobjects
            58730 MB used, 11115 GB / 11172 GB avail
                 256 active+clean

集群恢复正常!

<think>好的,用户遇到了一个Ceph的问题,错误信息是“MDS id 'mds.172.24.0.101' is invalid. MDS names may not start with a numeric digit”。我需要先理解这个错误的根本原因,然后给出解决方案。 首先,MDSCephFS的元数据服务器,它的名称必须符合一定的命名规则。根据错误信息,名称不能以数字开头。用户使用的名称是“mds.172.24.0.101”,看起来像是用IP地址命名的,但这里可能的问题在于名称的格式是否符合要求。 CephMDS名称通常遵循“mds.<identifier>”的格式,而<identifier>部分不能以数字开头。例如,有效的名称可能是“mds.node1”或“mds.hostname”,而“mds.172.24.0.101”中的“172”是数字开头,违反了命名规则。 接下来,我需要考虑用户为什么会这样命名。可能用户想用IP地址来标识MDS节点,方便管理和识别。但Ceph的命名规范不允许数字开头的标识符部分,因此需要调整。 解决方案应该是建议用户修改MDS的名称,使用不以数字开头的标识符。例如,可以添加一个字母前缀,如“mds.host-172.24.0.101”或“mds.node-172.24.0.101”。这样既保留了IP地址的信息,又符合命名规则。 此外,用户可能需要了解如何正确创建MDS服务。需要指导他们使用正确的命令,比如在部署时使用ceph-deploy或者cephadm工具时指定正确的名称,或者在配置文件中设置。如果用户是通过手动命令创建的,可能需要停止当前错误的MDS实例,删除无效的配置,然后重新创建正确的名称。 另外,需要提醒用户检查所有相关的配置文件,确保没有其他地方引用了错误的MDS名称,避免后续出现其他问题。如果用户使用的是自动化部署工具,可能需要更新相应的配置脚本或编排文件,防止再次出现类似的错误。 最后,应该强调遵循Ceph的命名规范的重要性,以确保系统的稳定性和可维护性。可能还需要引导用户查阅官方文档,确认其他潜在的命名限制,比如长度、特殊字符等,避免未来遇到类似的问题。</think>在Ceph中,**MDS(Metadata Server)的名称需遵循严格的命名规则**。你遇到的错误 `MDS id 'mds.172.24.0.101' is invalid. MDS names may not start with a numeric digit` 是因为MDS名称的标识符部分(即 `mds.` 后的部分)不符合命名规范。以下是详细解释和解决方案: --- ### **1. 错误原因** - **命名规则**: MDS名称的格式为 `mds.<identifier>`,其中 `<identifier>` 必须满足: - 不以数字开头(如 `mds.123` 无效,但 `mds.node1` 有效); - 仅包含字母、数字、连字符(`-`)或下划线(`_`); - 长度合理(通常不超过64字符)。 - **错误示例**: 你的名称 `mds.172.24.0.101` 中,`172.24.0.101` 是IP地址,但以数字开头,违反了规则。 --- ### **2. 解决方案** #### **方法一:修改MDS名称** - **使用字母开头的标识符**: 在IP地址前添加一个字母前缀,例如: ```bash # 有效名称示例 mds.host-172.24.0.101 mds.node-172.24.0.101 mds.mds1-172.24.0.101 ``` - **直接使用主机名(推荐)**: 如果节点有主机名(如 `node1`),直接使用 `mds.node1` 更简洁。 #### **方法二:部署时指定正确名称** - **通过工具部署**: 使用 `ceph-deploy` 或 `cephadm` 部署MDS时,指定符合规范的名称: ```bash # 示例:使用ceph-deploy ceph-deploy mds create node1 # 自动生成名称 mds.node1 # 示例:使用cephadm ceph orch apply mds myfs --placement="node1" # 名称自动关联主机名 ``` - **手动创建(谨慎操作)**: 若需手动管理,需确保配置文件(如 `/etc/ceph/ceph.conf`)中的MDS名称合法: ```ini [mds.mds-host-1] # 合法名称 host = 172.24.0.101 ``` --- ### **3. 修复现有错误** 如果已创建了非法名称的MDS服务,需执行以下步骤: 1. **停止无效的MDS进程**: ```bash systemctl stop ceph-mds@mds.172.24.0.101 # 替换为实际名称 ``` 2. **删除无效的MDS条目**: ```bash ceph fs rm <filesystem-name> --yes-i-really-mean-it # 若关联了文件系统,需先删除 ceph mds rm failed mds.172.24.0.101 # 清理无效MDS记录 ``` 3. **重新部署合法名称的MDS**: ```bash ceph-deploy mds create <hostname> # 使用主机名或合法名称 ``` --- ### **4. 命名规范最佳实践** - **标识符可读性**:名称应反映节点功能或位置(如 `mds.metadata-node1`)。 - **避免特殊字符**:仅使用字母、数字、`-` 和 `_`。 - **一致性**:集群内所有MDS命名风格需统一,便于管理。 --- ### **5. 验证与调试** - **查看MDS状态**: ```bash ceph mds stat ceph fs status # 若关联了CephFS ``` - **检查日志**: ```bash journalctl -u ceph-mds@<mds-name>.service ``` --- ### **总结** - **核心问题**:MDS名称的标识符部分(`mds.`后的内容)不能以数字开头。 - **推荐方案**:使用字母前缀的命名方式(如 `mds.host-172.24.0.101`),或直接绑定主机名。 - **自动化工具**:优先通过 `cephadm` 或 `ceph-deploy` 部署,减少手动配置错误。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值