4.8. 恢复 Ceph 监控存储
Ceph 监控器将 cluster map 存储在 LevelDB 等键值存储中。如果存储在 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.ldb
生产用红帽 Ceph 存储集群至少使用三个 Ceph 监控器,以便在出现故障时可以替换为另一个监控器。然而,在某些情况下,所有 Ceph 监控器可能会损坏存储。例如,当 Ceph 监控节点配置错误的磁盘或文件系统设置时,断电可能会破坏底层文件系统。
如果所有 Ceph 监控上都存在损坏,则可以使用名为 ceph-monstore-tool 和 ceph-
的实用程序,通过 OSD 节点上存储的信息来恢复它。
objectstore-tool
这些步骤无法恢复以下信息:
- 元数据守护进程服务器(MDS)密钥环和映射
放置组设置:
-
使用
ceph pg set_full_ratio
命令设置完整比率
-
使用
ceph pg set_nearfull_ratio 命令设置的 nearfull
比率
-
使用
切勿从旧备份恢复 Ceph 监控存储。使用下列步骤从当前集群状态重建 Ceph monitor 存储,并从中恢复。
4.8.1. 使用 BlueStore 时恢复 Ceph monitor 存储 复制链接链接已复制到粘贴板!
如果 Ceph monitor 存储在所有 Ceph 监控上损坏并且您使用 BlueStore 后端,请按照以下步骤操作。
在容器化环境中,此方法需要附加 Ceph 存储库并首先恢复到非容器化 Ceph monitor。
这个过程可能会导致数据丢失。如果您不确定此流程中的任何步骤,请联络红帽技术支持以获取恢复过程的帮助。
先决条件
裸机部署
-
安装
rsync
和ceph-test
软件包。
-
安装
容器部署
- 所有 OSD 容器都已停止。
- 根据 Ceph 节点上的角色,启用 Ceph 存储库。
-
ceph-test
和rsync
软件包安装在 OSD 和 monitor 节点上。 -
ceph-mon
软件包安装在 monitor 节点上。 -
ceph-osd
软件包安装在 OSD 节点上。
流程
如果在容器中使用 Ceph ,请将 带有 Ceph 数据的所有磁盘挂载到临时位置。对所有 OSD 节点重复此步骤。
列出数据分区。根据您用来设置设备的实用程序,使用
ceph-volume
或 ceph-diskceph-volume lvm list
[root@osd ~]# ceph-volume lvm list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或
ceph-disk list
[root@osd ~]# ceph-disk 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 节点上以空格分隔的 Ceph OSD ID 列表替换 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 节点上以空格分隔的 Ceph OSD ID 列表替换 OSD_ID。
重要由于一个导致
update-mon-db 命令使用
monitor 数据库的其他db
和db.slow
目录的错误,您还必须复制这些目录。要做到这一点:准备容器外部的临时位置,以挂载和访问 OSD 数据库,并提取恢复 Ceph 监控所需的 OSD map:
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 替换为 OSD 数据和 OSD-ID 的卷组(VG)或逻辑卷(LV)路径。
在 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 替换为 BlueStore 数据库和 OSD-ID 的卷组(VG)或逻辑卷(LV)路径。
从具有损坏存储的 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
目录移动到临时位置:mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db
[root@mon ~]# mv /root/db/*.sst /root/db.slow/*.sst /tmp/monstore/store.db
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从收集的 map 重建 monitor 存储:
ceph-monstore-tool /tmp/monstore rebuild -- --keyring /etc/ceph/ceph.client.admin
[root@mon ~]# 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 使用 Ceph 监控节点的主机名替换 HOSTNAME。
替换损坏的存储。对所有 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 使用 monitor 节点的主机名替换 HOSTNAME。
更改新存储的所有者。对所有 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 使用 Ceph 监控节点的主机名替换 HOSTNAME。
如果在容器中使用 Ceph , 则在所有节点上卸载所有临时挂载的 OSD:
umount /var/lib/ceph/osd/ceph-*
[root@osd ~]# umount /var/lib/ceph/osd/ceph-*
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 启动所有 Ceph 监控守护进程:
systemctl start ceph-mon *
[root@mon ~]# systemctl start ceph-mon *
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保 monitor 能够形成仲裁:
裸机部署
ceph -s
[root@mon ~]# ceph -s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 容器
docker exec ceph-mon-_HOSTNAME_ ceph -s
[user@admin ~]$ docker exec ceph-mon-_HOSTNAME_ ceph -s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Ceph 监控节点的主机名替换 HOSTNAME。
导入 Ceph Manager 密钥环并启动所有 Ceph Manager 进程:
ceph auth import -i /etc/ceph/ceph.mgr.HOSTNAME.keyring systemctl start ceph-mgr@HOSTNAME
ceph auth import -i /etc/ceph/ceph.mgr.HOSTNAME.keyring systemctl start ceph-mgr@HOSTNAME
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Ceph 管理器节点的主机名替换 HOSTNAME。
在所有 OSD 节点中启动所有 OSD 进程:
systemctl start ceph-osd *
[root@osd ~]# systemctl start ceph-osd *
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保 OSD 返回到服务:
裸机部署
ceph -s
[root@mon ~]# ceph -s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 容器
docker exec ceph-mon-_HOSTNAME_ ceph -s
[user@admin ~]$ docker exec ceph-mon-_HOSTNAME_ ceph -s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Ceph 监控节点的主机名替换 HOSTNAME。
其它资源
- 有关将 Ceph 节点注册到内容交付网络(CDN)的详细信息,请参阅 Red Hat Ceph Storage 安装指南中的将 Red Hat Ceph Storage 节点注册到 CDN 和附加订阅 部分。
- 有关启用存储库的详细信息,请参阅 《红帽 Ceph 存储 安装指南》中的"启用红帽 Ceph 存储 存储库 "一节。