2.4. 替换失败的 OSD 磁盘
替换 OSD 的一般步骤涉及从存储集群中移除 OSD,替换驱动器,然后重新创建 OSD。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 一个失败的磁盘。
流程
检查存储集群健康状况:
[root@mon ~]# ceph health
识别 CRUSH 层次结构中的 OSD 位置:
[root@mon ~]# ceph osd tree | grep -i down
在 OSD 节点上,尝试启动 OSD:
语法
systemctl start ceph-osd@OSD_ID
如果命令显示 OSD 已在运行,则可能存在心跳或网络问题。如果您无法重启 OSD,则驱动器可能会失败。
注意如果 OSD 为
down
,则 OSD 最终将被标记为out
。这是 Ceph 存储的正常行为。当 OSD 标记为out
时,具有故障 OSD 数据副本的其他 OSD 将开始回填,以确保存储集群中存在所需的副本数。当存储集群进行回填时,集群会处于降级状态
。对于 Ceph 的容器化部署,请尝试使用 OSD_ID 启动 OSD 容器:
语法
systemctl start ceph-osd@OSD_ID
如果命令显示 OSD 已在运行,则可能存在心跳或网络问题。如果您无法重启 OSD,则驱动器可能会失败。
注意与 OSD 关联的驱动器可以通过将容器 OSD ID 映射到驱动器来确定。
检查失败的 OSD 的挂载点:
注意对于 Ceph 的容器化部署,如果 OSD 停机,并且 OSD 驱动器将被卸载,因此您无法运行
df
来检查其挂载点。使用另一种方法来确定 OSD 驱动器是否已失败。例如,在容器节点的驱动器上运行smartctl
。[root@osd ~]# df -h
如果无法重启 OSD,您可以检查挂载点。如果挂载点不再显示,您可以尝试重新挂载 OSD 驱动器并重新启动 OSD。如果无法恢复挂载点,则可能有一个失败的 OSD 驱动器。
使用
smartctl
程序 cab 帮助确定驱动器是否健康:语法
yum install smartmontools smartctl -H /dev/BLOCK_DEVICE
示例
[root@osd ~]# smartctl -H /dev/sda
如果驱动器失败,则需要替换它。
停止 OSD 进程:
语法
systemctl stop ceph-osd@OSD_ID
对于 Ceph 的容器化部署,请停止 OSD 容器:
语法
systemctl stop ceph-osd@OSD_ID
从存储集群中移除 OSD:
语法
ceph osd out OSD_ID
确保失败的 OSD 正在回填:
[root@osd ~]# ceph -w
从 CRUSH map 移除 OSD:
语法
ceph osd crush remove osd.OSD_ID
注意只有在您永久删除 OSD 且没有重新部署时,才需要执行此步骤。
删除 OSD 的身份验证密钥:
语法
ceph auth del osd.OSD_ID
验证 OSD 的密钥没有被列出:
示例
[root@osd ~]# ceph auth list
从存储集群中移除 OSD:
语法
ceph osd rm osd.OSD_ID
卸载失败的驱动器路径:
语法
umount /var/lib/ceph/osd/CLUSTER_NAME-OSD_ID
示例
[root@osd ~]# umount /var/lib/ceph/osd/ceph-0
注意对于 Ceph 容器化部署,如果 OSD 关闭容器,则将卸载 OSD 驱动器。在这种情况下,没有卸载,并可以跳过此步骤。
替换物理驱动器。请参阅硬件厂商的文档。如果驱动器是热交换的,只需将故障驱动器替换为新驱动器。如果驱动器不热交换,且节点包含多个 OSD,则 MIGHT 需要关闭节点来取代物理驱动器。如果需要临时关闭节点,您可以将集群设置为
noout
以防止回填:示例
[root@osd ~]# ceph osd set noout
替换驱动器后,您使节点及其 OSD 重新在线,删除
noout
设置:示例
[root@osd ~]# ceph osd unset noout
在继续操作前,等待新驱动器出现在
/dev/
目录下,并记录下驱动器路径。- 查找 OSD 驱动器并格式化磁盘。
重新创建 OSD:
- 使用 Ceph Ansible.
- 使用命令行界面。
检查 CRUSH 层次结构以确保其准确:
示例
[root@osd ~]# ceph osd tree
如果您对 OSD 在 CRUSH 层次结构中的位置不满意,您可以使用
move
命令移动它:语法
ceph osd crush move BUCKET_TO_MOVE BUCKET_TYPE=PARENT_BUCKET
- 验证 OSD 是否在线。