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
Corruption: error in middle of record
Corruption: 1 missing files; e.g.: /var/lib/ceph/mon/mon.0/store.db/1234567.ldbRed Hat Ceph Storage 集群使用至少三个 Ceph 监控器,以便在一个失败时,它可以被替换为另一个。然而,在某些情况下,所有 Ceph 监控器可能会损坏存储。例如,当 Ceph 监控节点配置错误的磁盘或文件系统设置时,断电可能会破坏底层文件系统。
				如果所有 Ceph 监控上都存在损坏,则可以使用名为 ceph-monstore-tool 和 ceph-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-test和rsync软件包安装在 OSD 和 monitor 节点上。
- 
							ceph-mon软件包安装在 monitor 节点上。
- 
							ceph-osd软件包安装在 OSD 节点上。
流程
- 将所有带有 Ceph 数据的磁盘挂载到临时位置。对所有 OSD 节点重复此步骤。 - 使用 - ceph-volume命令列出数据分区:- 示例 - [ceph: root@host01 /]# ceph-volume lvm list - [ceph: root@host01 /]# ceph-volume lvm list- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 将数据分区挂载到临时位置: - 语法 - mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-$i - mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-$i- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 恢复 SELinux 上下文: - 语法 - for i in {OSD_ID}; do restorecon /var/lib/ceph/osd/ceph-$i; done- for i in {OSD_ID}; do restorecon /var/lib/ceph/osd/ceph-$i; done- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 OSD_ID 替换为 OSD 节点上的 Ceph OSD ID 数字、空格分隔的列表。 
- 将所有者和组更改为 - ceph:ceph:- 语法 - for i in {OSD_ID}; do chown -R ceph:ceph /var/lib/ceph/osd/ceph-$i; done- for i in {OSD_ID}; do chown -R ceph:ceph /var/lib/ceph/osd/ceph-$i; done- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 OSD_ID 替换为 OSD 节点上的 Ceph OSD ID 数字、空格分隔的列表。 重要- 由于一个程序错误会导致 - update-mon-db命令为 monitor 数据库使用额外的- db和- db.slow目录,因此您还必须复制这些目录。要做到这一点:- 准备容器外部的临时位置,以挂载和访问 OSD 数据库,并提取恢复 Ceph Monitor 所需的 OSD 映射: - 语法 - ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev OSD-DATA --path /var/lib/ceph/osd/ceph-OSD-ID - ceph-bluestore-tool --cluster=ceph prime-osd-dir --dev OSD-DATA --path /var/lib/ceph/osd/ceph-OSD-ID- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 OSD-DATA 替换为卷组(VG)或逻辑卷(LV)路径,将 OSD 数据和 OSD 的 ID 替换为 OSD 的 ID。 
- 在 BlueStore 数据库和 - block.db之间创建符号链接:- 语法 - ln -snf BLUESTORE DATABASE /var/lib/ceph/osd/ceph-OSD-ID/block.db - ln -snf BLUESTORE DATABASE /var/lib/ceph/osd/ceph-OSD-ID/block.db- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 BLUESTORE-DATABASE 替换为卷组(VG)或逻辑卷(LV)路径,将 OSD-ID 替换为 OSD 的 ID。 
 
 
- 从具有损坏存储的 Ceph 监控节点使用以下命令:为所有节点上的所有 OSD 重复它们。 - 从所有 OSD 节点收集 cluster map: - 示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 设置适当的功能: - 示例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 将所有 - sst文件从- db和- db.slow目录移到临时位置:- 示例 - [ceph: root@host01 /]# mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db - [ceph: root@host01 /]# mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 从收集的 map 重建 monitor 存储: - 示例 - [ceph: root@host01 /]# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /etc/ceph/ceph.client.admin - [ceph: root@host01 /]# ceph-monstore-tool /tmp/monstore rebuild -- --keyring /etc/ceph/ceph.client.admin- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注意- 使用此命令后,Ceph 身份验证数据库中仅存在从 OSD 提取的密钥环和 - ceph-monstore-tool命令行中指定的密钥环。您必须重新创建或导入所有其他密钥环,如客户端、Ceph 管理器和 Ceph 对象网关等,以便这些客户端可以访问集群。
- 备份损坏的存储。对所有 Ceph 监控节点重复此步骤: - 语法 - mv /var/lib/ceph/mon/ceph-HOSTNAME/store.db /var/lib/ceph/mon/ceph-HOSTNAME/store.db.corrupted - mv /var/lib/ceph/mon/ceph-HOSTNAME/store.db /var/lib/ceph/mon/ceph-HOSTNAME/store.db.corrupted- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 HOSTNAME 替换为 Ceph 监控节点的主机名。 
- 替换损坏的存储。对所有 Ceph 监控节点重复此步骤: - 语法 - scp -r /tmp/monstore/store.db HOSTNAME:/var/lib/ceph/mon/ceph-HOSTNAME/ - scp -r /tmp/monstore/store.db HOSTNAME:/var/lib/ceph/mon/ceph-HOSTNAME/- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 HOSTNAME 替换为 monitor 节点的主机名。 
- 更改新存储的所有者。对所有 Ceph 监控节点重复此步骤: - 语法 - chown -R ceph:ceph /var/lib/ceph/mon/ceph-HOSTNAME/store.db - chown -R ceph:ceph /var/lib/ceph/mon/ceph-HOSTNAME/store.db- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 HOSTNAME 替换为 Ceph 监控节点的主机名。 
 
- 卸载所有节点上所有临时挂载的 OSD: - 示例 - umount /var/lib/ceph/osd/ceph-* - [root@host01 ~]# umount /var/lib/ceph/osd/ceph-*- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 启动所有 Ceph Monitor 守护进程: - 语法 - systemctl start ceph-FSID@DAEMON_NAME - systemctl start ceph-FSID@DAEMON_NAME- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 示例 - systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@mon.host01.service - [root@mon ~]# systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@mon.host01.service- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 确保 monitor 能够形成仲裁: - 语法 - ceph -s - ceph -s- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 HOSTNAME 替换为 Ceph 监控节点的主机名。 
- 导入 Ceph Manager 密钥环并启动所有 Ceph Manager 进程: - 语法 - ceph auth import -i /etc/ceph/ceph.mgr.HOSTNAME.keyring systemctl start ceph-FSID@DAEMON_NAME - ceph auth import -i /etc/ceph/ceph.mgr.HOSTNAME.keyring systemctl start ceph-FSID@DAEMON_NAME- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 示例 - systemctl start ceph-b341e254-b165-11ed-a564-ac1f6bb26e8c@mgr.extensa003.exrqql.service - [root@mon ~]# systemctl start ceph-b341e254-b165-11ed-a564-ac1f6bb26e8c@mgr.extensa003.exrqql.service- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 HOSTNAME 替换为 Ceph Manager 节点的主机名。 
- 启动所有 OSD 节点中的所有 OSD 进程。对集群中的所有 OSD 重复此操作: - 语法 - systemctl start ceph-FSID@osd.OSD_ID - systemctl start ceph-FSID@osd.OSD_ID- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 示例 - systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@osd.0.service - [root@host01 ~]# systemctl start ceph-b404c440-9e4c-11ec-a28a-001a4a0001df@osd.0.service- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 确保 OSD 返回到服务: - 示例 - [ceph: root@host01 /]# ceph -s - [ceph: root@host01 /]# ceph -s- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 如需与网络相关的问题,请参阅 Red Hat Ceph Storage 故障排除指南中的对网络进行故障排除。