2.2. 磁盘失败
Ceph 为容错而设计,这意味着 Ceph 可在不丢失数据的情况下以 降级状态
运行。即使数据存储驱动器出现故障,Ceph 仍然可以运行。降级状态
表示,存储在其他 OSD 上的数据的额外副本将自动回填到存储集群中的其他 OSD。当 OSD 标记为 down
时,这可能意味着驱动器失败。
当驱动器出现故障时,最初的 OSD 状态将 停机
,但仍 在
存储集群中。网络问题也可以将 OSD 标记为 down
,即使它确实是 。首先检查环境中出现的任何网络问题。如果网络检查正常,则 OSD 驱动器可能会失败。
现代服务器通常使用热插拔驱动器进行部署,从而可以拉取失败的驱动器并将其替换为新的驱动器,而无需关闭节点。但是,在 Ceph 中,您还必须删除由软件定义的 OSD 部分。
2.2.1. 替换失败的 OSD 磁盘
替换 OSD 的一般步骤涉及从存储集群中移除 OSD,替换驱动器,然后重新创建 OSD。
在替换包含 BlueStore OSD 数据库分区的 BlueStore block.db
磁盘时,红帽仅支持使用 Ansible 重新部署所有 OSD。损坏的 block.db
文件将影响到这个 block.db
文件中包含的所有 OSD。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 失败的磁盘。
步骤
检查存储集群健康状况:
# ceph health
识别 CRUSH 层次结构中的 OSD 位置:
# ceph osd tree | grep -i down
在 OSD 节点上,尝试启动 OSD:
# systemctl start ceph-osd@$OSD_ID
如果命令表示 OSD 已在运行,则可能存在一个心跳或网络问题。如果无法重启 OSD,则驱动器可能会失败。
注意如果 OSD 已经
停机
,则 OSD 最终将标记为。这是 Ceph Storage 的正常行为。当 OSD 标记为 时,带有故障 OSD 数据副本的其他 OSD 将开始回填,以确保存储集群中存在所需的副本数。
在存储集群进行回填时,集群将
处于降级状态
。对于容器化 Ceph 部署,尝试通过引用与 OSD 关联的驱动器来启动 OSD 容器:
# systemctl start ceph-osd@$OSD_DRIVE
如果命令表示 OSD 已在运行,则可能存在一个心跳或网络问题。如果无法重启 OSD,则驱动器可能会失败。
注意与 OSD 关联的驱动器可以通过 将容器 OSD ID 映射到驱动器 来确定。
检查失败的 OSD 的挂载点:
注意对于容器化部署 Ceph,如果 OSD 停机,容器将停机,并且将卸载 OSD 驱动器,因此您无法运行
df
检查其挂载点。使用另一种方法来确定 OSD 驱动器是否失败。例如,在容器节点的驱动器上运行smartctl
。# df -h
如果无法重启 OSD,您可以检查 挂载点。如果挂载点不再显示,您可以尝试重新挂载 OSD 驱动器并重启 OSD。如果无法恢复挂载点,则可能具有失败的 OSD 驱动器。
使用
smartctl
实用程序 cab 帮助确定驱动器是否运行正常。例如:# yum install smartmontools # smartctl -H /dev/$DRIVE
如果驱动器失败,则需要替换它。
停止 OSD 进程:
# systemctl stop ceph-osd@$OSD_ID
如果使用 FileStore,将日志刷新到磁盘:
# ceph osd -i $$OSD_ID --flush-journal
对于容器化 Ceph 部署,通过引用与 OSD 关联的驱动器来停止 OSD 容器:
# systemctl stop ceph-osd@$OSD_DRIVE
从存储集群中移除 OSD:
# ceph osd out $OSD_ID
确保失败的 OSD 是回填:
# ceph -w
从 CRUSH map 移除 OSD:
# ceph osd crush remove osd.$OSD_ID
注意只有在您永久删除 OSD 而非重新部署时才需要这一步。
删除 OSD 的身份验证密钥:
# ceph auth del osd.$OSD_ID
验证 OSD 的密钥没有被列出:
# ceph auth list
从存储集群中移除 OSD:
# ceph osd rm osd.$OSD_ID
卸载故障驱动器路径:
注意对于容器化 Ceph 部署,如果 OSD 停机,容器将停机,并且 OSD 驱动器将被卸载。在这种情况下,不卸载这一步,可以跳过此步骤。
# umount /var/lib/ceph/osd/$CLUSTER_NAME-$OSD_ID
替换物理驱动器。如需节点,请参阅硬件供应商的文档。如果驱动器可热交换,只需将失败的驱动器替换为新驱动器。如果驱动器不热交换,且节点包含多个 OSD,那么 MIGHT 需要让节点更换物理驱动器。如果您需要临时关闭节点,您可以将集群设置为
noout
以防止回填:# ceph osd set noout
在替换了驱动器并且使节点及其 OSD 重新上线后,请删除
noout
设置:# ceph osd unset noout
允许
/dev/
目录下显示新驱动器,并在继续操作前记录驱动器路径。- 查找 OSD 驱动器并格式化磁盘。
重新创建 OSD:
检查 CRUSH 层次结构,以确保准确:
# ceph osd tree
如果您对 CRUSH 层次结构中 OSD 的位置不满意,您可能通过
move
命令移动:# ceph osd crush move $BUCKET_TO_MOVE $BUCKET_TYPE=$PARENT_BUCKET
- 验证 OSD 是否在线。
2.2.2. 在保留 OSD ID 时替换 OSD 驱动器
在替换故障 OSD 驱动器时,您可以保留原始 OSD ID 和 CRUSH map 条目。
ceph-volume lvm
命令默认为 OSD 的 BlueStore。要使用 FileStore OSD,然后使用 --filestore
、--data
和 --journal
选项。
如需了解更多详细信息 ,请参阅准备 OSD 数据和 Journal Drives 部分。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 失败的磁盘。
步骤
销毁 OSD:
ceph osd destroy $OSD_ID --yes-i-really-mean-it
示例
$ ceph osd destroy 1 --yes-i-really-mean-it
另外,如果之前使用了替换磁盘,则需要
缩小
该磁盘:ceph-volume lvm zap $DEVICE
示例
$ ceph-volume lvm zap /dev/sdb
使用现有 OSD ID 创建新 OSD:
ceph-volume lvm create --osd-id $OSD_ID --data $DEVICE
示例
$ ceph-volume lvm create --osd-id 1 --data /dev/sdb