4.6. 恢复 Ceph Monitor 存储


Ceph 监控器将 cluster map 存储在键值存储中,如 RocksDB。如果存储在 monitor 上损坏,则 monitor 会意外终止,且无法再次启动。Ceph 日志可能包括以下错误:

Corruption: error in middle of record
Corruption: 1 missing files; e.g.: /var/lib/ceph/mon/mon.0/store.db/1234567.ldb

Red Hat Ceph Storage 集群使用至少三个 Ceph 监控器,以便在一个失败时,它可以被替换为另一个。然而,在某些情况下,所有 Ceph 监控器可能会损坏存储。例如,当 Ceph 监控节点配置错误的磁盘或文件系统设置时,断电可能会破坏底层文件系统。

如果所有 Ceph 监控上都存在损坏,则可以使用名为 ceph-monstore-toolceph-objectstore-tool 的实用程序,通过 OSD 节点上存储的信息来恢复它。

重要

这些步骤无法恢复以下信息:

  • 元数据服务器(MDS)密钥环和映射
  • 放置组设置:

    • 使用 ceph pg set_full_ratio 命令设置 full ratio
    • 使用 ceph pg set_nearfull_ratio 命令设置 nearfull ratio
重要

从旧备份中恢复 Ceph Monitor 存储。使用以下步骤从当前集群状态重建 Ceph Monitor 存储,并从中恢复。

4.6.1. 使用 BlueStore 时恢复 Ceph Monitor 存储

如果 Ceph Monitor 存储在所有 Ceph 监控器上损坏,且您使用 BlueStore 后端,请按照以下步骤操作。

在容器化环境中,此方法需要附加 Ceph 存储库并首先恢复到非容器化 Ceph monitor。

警告

这个流程可能会导致数据丢失。如果您不确定这个过程中的任何步骤,请联系红帽技术支持以获取恢复过程的帮助。

先决条件

  • 所有 OSD 容器都已停止。
  • 根据 Ceph 节点上的角色,启用 Ceph 存储库。
  • ceph-testrsync 软件包安装在 OSD 和 monitor 节点上。
  • ceph-mon 软件包安装在 monitor 节点上。
  • ceph-osd 软件包安装在 OSD 节点上。

流程

  1. 将所有带有 Ceph 数据的磁盘挂载到临时位置。对所有 OSD 节点重复此步骤。

    1. 使用 ceph-volume 命令列出数据分区:

      示例

      [ceph: root@host01 /]# ceph-volume lvm list

    2. 将数据分区挂载到临时位置:

      语法

      mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-$i

    3. 恢复 SELinux 上下文:

      语法

      for i in {OSD_ID}; do restorecon /var/lib/ceph/osd/ceph-$i; done

      OSD_ID 替换为 OSD 节点上的 Ceph OSD ID 数字、空格分隔的列表。

    4. 将所有者和组更改为 ceph:ceph

      语法

      for i in {OSD_ID}; do chown -R ceph:ceph /var/lib/ceph/osd/ceph-$i; done

      OSD_ID 替换为 OSD 节点上的 Ceph OSD ID 数字、空格分隔的列表。

      重要

      由于一个程序错误会导致 update-mon-db 命令为 monitor 数据库使用额外的 dbdb.slow 目录,因此您还必须复制这些目录。要做到这一点:

      1. 准备容器外部的临时位置,以挂载和访问 OSD 数据库,并提取恢复 Ceph Monitor 所需的 OSD 映射:

        语法

        ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev OSD-DATA --path /var/lib/ceph/osd/ceph-OSD-ID

        OSD-DATA 替换为卷组(VG)或逻辑卷(LV)路径,将 OSD 数据和 OSD 的 ID 替换为 OSD 的 ID。

      2. 在 BlueStore 数据库和 block.db 之间创建符号链接:

        语法

        ln -snf BLUESTORE DATABASE /var/lib/ceph/osd/ceph-OSD-ID/block.db

        BLUESTORE-DATABASE 替换为卷组(VG)或逻辑卷(LV)路径,将 OSD-ID 替换为 OSD 的 ID。

  2. 从具有损坏存储的 Ceph 监控节点使用以下命令:为所有节点上的所有 OSD 重复它们。

    1. 从所有 OSD 节点收集 cluster map:

      示例

      [root@host01 ~]# cd /root/
      [root@host01 ~]# ms=/tmp/monstore/
      [root@host01 ~]# db=/root/db/
      [root@host01 ~]# db_slow=/root/db.slow/
      
      [root@host01 ~]# mkdir $ms
      [root@host01 ~]# for host in $osd_nodes; do
                      echo "$host"
                      rsync -avz $ms $host:$ms
                      rsync -avz $db $host:$db
                      rsync -avz $db_slow $host:$db_slow
      
                      rm -rf $ms
                      rm -rf $db
                      rm -rf $db_slow
      
                      sh -t $host <<EOF
                        for osd in /var/lib/ceph/osd/ceph-*; do
                          ceph-objectstore-tool --type bluestore --data-path \$osd --op update-mon-db --mon-store-path $ms
      
                         done
                      EOF
      
                            rsync -avz $host:$ms $ms
                            rsync -avz $host:$db $db
                            rsync -avz $host:$db_slow $db_slow
                      done

    2. 设置适当的功能:

      示例

      [ceph: root@host01 /]# ceph-authtool /etc/ceph/ceph.client.admin.keyring -n mon. --cap mon 'allow *' --gen-key
      [ceph: root@host01 /]# cat /etc/ceph/ceph.client.admin.keyring
        [mon.]
          key = AQCleqldWqm5IhAAgZQbEzoShkZV42RiQVffnA==
          caps mon = "allow *"
        [client.admin]
          key = AQCmAKld8J05KxAArOWeRAw63gAwwZO5o75ZNQ==
          auid = 0
          caps mds = "allow *"
          caps mgr = "allow *"
          caps mon = "allow *"
          caps osd = "allow *"

    3. 将所有 sst 文件从 dbdb.slow 目录移到临时位置:

      示例

      [ceph: root@host01 /]# mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db

    4. 从收集的 map 重建 monitor 存储:

      示例

      [ceph: root@host01 /]# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /etc/ceph/ceph.client.admin

      注意

      使用此命令后,Ceph 身份验证数据库中仅存在从 OSD 提取的密钥环和 ceph-monstore-tool 命令行中指定的密钥环。您必须重新创建或导入所有其他密钥环,如客户端、Ceph 管理器和 Ceph 对象网关等,以便这些客户端可以访问集群。

    5. 备份损坏的存储。对所有 Ceph 监控节点重复此步骤:

      语法

      mv /var/lib/ceph/mon/ceph-HOSTNAME/store.db /var/lib/ceph/mon/ceph-HOSTNAME/store.db.corrupted

      HOSTNAME 替换为 Ceph 监控节点的主机名。

    6. 替换损坏的存储。对所有 Ceph 监控节点重复此步骤:

      语法

      scp -r /tmp/monstore/store.db HOSTNAME:/var/lib/ceph/mon/ceph-HOSTNAME/

      HOSTNAME 替换为 monitor 节点的主机名。

    7. 更改新存储的所有者。对所有 Ceph 监控节点重复此步骤:

      语法

      chown -R ceph:ceph /var/lib/ceph/mon/ceph-HOSTNAME/store.db

      HOSTNAME 替换为 Ceph 监控节点的主机名。

  3. 卸载所有节点上所有临时挂载的 OSD:

    示例

    [root@host01 ~]# umount /var/lib/ceph/osd/ceph-*

  4. 启动所有 Ceph Monitor 守护进程:

    语法

    systemctl start ceph-FSID@DAEMON_NAME

    示例

    [root@mon ~]# systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@mon.host01.service

  5. 确保 monitor 能够形成仲裁:

    语法

    ceph -s

    HOSTNAME 替换为 Ceph 监控节点的主机名。

  6. 导入 Ceph Manager 密钥环并启动所有 Ceph Manager 进程:

    语法

    ceph auth import -i /etc/ceph/ceph.mgr.HOSTNAME.keyring
    systemctl start ceph-FSID@DAEMON_NAME

    示例

    [root@mon ~]# systemctl start ceph-b341e254-b165-11ed-a564-ac1f6bb26e8c@mgr.extensa003.exrqql.service

    HOSTNAME 替换为 Ceph Manager 节点的主机名。

  7. 启动所有 OSD 节点中的所有 OSD 进程。对集群中的所有 OSD 重复此操作:

    语法

    systemctl start ceph-FSID@osd.OSD_ID

    示例

    [root@host01 ~]# systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@osd.0.service

  8. 确保 OSD 返回到服务:

    示例

    [ceph: root@host01 /]# ceph -s

其它资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.