5.5. 替换 OSD 驱动器
Ceph 专为容错设计,这意味着它可以在 降级
状态下运行,而不丢失数据。因此,即使数据存储驱动器失败,Ceph 也能运行。在故障驱动器的上下文中,降级
状态意味着其他 OSD 上存储的数据的额外副本将自动回填到集群中的其他 OSD。不过,如果发生这种情况,请替换失败的 OSD 驱动器,并手动重新创建 OSD。
当驱动器出现故障时,Ceph 会将该 OSD 报告为 down
:
HEALTH_WARN 1/3 in osds are down osd.0 is down since epoch 23, last address 192.168.106.220:6800/11080
Ceph 也可以因为网络或权限问题将 OSD 标记为 down
。详情请参阅 关闭 OSD。
现代服务器通常使用热插拔驱动器进行部署,以便您可以将失败的驱动器替换为新的驱动器,而无需关闭节点。整个流程包括这些步骤:
- 从 Ceph 集群移除 OSD。详情请参阅 从 Ceph 集群删除 OSD 过程。
- 替换驱动器。详情请查看 替换物理驱动器 ]部分。
- 将 OSD 添加到集群。详情请参阅 在 Ceph 集群中添加 OSD 流程。
先决条件
- Ceph 监控节点的根级别访问权限.
确定哪个 OSD 处于
down 状态
:[root@mon ~]# ceph osd tree | grep -i down ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY 0 0.00999 osd.0 down 1.00000 1.00000
确保 OSD 进程已经停止。从 OSD 节点运行以下命令:
[root@mon ~]# systemctl status ceph-osd@_OSD_NUMBER_
将
OSD_NUMBER
替换为标记为down
的 OSD 的 ID,例如:[root@mon ~]# systemctl status ceph-osd@osd.0 ... Active: inactive (dead)
如果
ceph-osd
守护进程正在运行。如需有关 对标记为down
的 OSD 进行故障排除但对应的ceph-osd
守护进程正在运行的更多信息,请参阅 Down OSD。
步骤:从 Ceph 集群中删除 OSD
将 OSD 标记为
out
:[root@mon ~]# ceph osd out osd.OSD_NUMBER
将
OSD_NUMBER
替换为标记为down
的 OSD 的 ID,例如:[root@mon ~]# ceph osd out osd.0 marked out osd.0.
注意如果 OSD 为
down
,Ceph 会在 600 秒后自动将其标记为out
,当它未从 OSD 接收任何心跳数据包时。发生这种情况时,具有故障 OSD 数据副本的其他 OSD 开始回填,以确保集群中存在所需的副本数。当集群回填时,集群将处于降级
状态。确保故障 OSD 正在回填。输出将包含类似如下的信息:
[root@mon ~]# ceph -w | grep backfill 2017-06-02 04:48:03.403872 mon.0 [INF] pgmap v10293282: 431 pgs: 1 active+undersized+degraded+remapped+backfilling, 28 active+undersized+degraded, 49 active+undersized+degraded+remapped+wait_backfill, 59 stale+active+clean, 294 active+clean; 72347 MB data, 101302 MB used, 1624 GB / 1722 GB avail; 227 kB/s rd, 1358 B/s wr, 12 op/s; 10626/35917 objects degraded (29.585%); 6757/35917 objects misplaced (18.813%); 63500 kB/s, 15 objects/s recovering 2017-06-02 04:48:04.414397 mon.0 [INF] pgmap v10293283: 431 pgs: 2 active+undersized+degraded+remapped+backfilling, 75 active+undersized+degraded+remapped+wait_backfill, 59 stale+active+clean, 295 active+clean; 72347 MB data, 101398 MB used, 1623 GB / 1722 GB avail; 969 kB/s rd, 6778 B/s wr, 32 op/s; 10626/35917 objects degraded (29.585%); 10580/35917 objects misplaced (29.457%); 125 MB/s, 31 objects/s recovering 2017-06-02 04:48:00.380063 osd.1 [INF] 0.6f starting backfill to osd.0 from (0'0,0'0] MAX to 2521'166639 2017-06-02 04:48:00.380139 osd.1 [INF] 0.48 starting backfill to osd.0 from (0'0,0'0] MAX to 2513'43079 2017-06-02 04:48:00.380260 osd.1 [INF] 0.d starting backfill to osd.0 from (0'0,0'0] MAX to 2513'136847 2017-06-02 04:48:00.380849 osd.1 [INF] 0.71 starting backfill to osd.0 from (0'0,0'0] MAX to 2331'28496 2017-06-02 04:48:00.381027 osd.1 [INF] 0.51 starting backfill to osd.0 from (0'0,0'0] MAX to 2513'87544
从 CRUSH map 移除 OSD:
[root@mon ~]# ceph osd crush remove osd.OSD_NUMBER
将
OSD_NUMBER
替换为标记为down
的 OSD 的 ID,例如:[root@mon ~]# ceph osd crush remove osd.0 removed item id 0 name 'osd.0' from crush map
移除与 OSD 相关的身份验证密钥:
[root@mon ~]# ceph auth del osd.OSD_NUMBER
将
OSD_NUMBER
替换为标记为down
的 OSD 的 ID,例如:[root@mon ~]# ceph auth del osd.0 updated
从 Ceph 存储集群中移除 OSD:
[root@mon ~]# ceph osd rm osd.OSD_NUMBER
将
OSD_NUMBER
替换为标记为down
的 OSD 的 ID,例如:[root@mon ~]# ceph osd rm osd.0 removed osd.0
如果您已成功删除了 OSD,以下命令的输出中不存在它:
[root@mon ~]# ceph osd tree
对于裸机部署,卸载失败的驱动器:
[root@mon ~]# umount /var/lib/ceph/osd/CLUSTER_NAME-OSD_NUMBER
指定集群的名称和 OSD 的 ID,例如:
[root@mon ~]# umount /var/lib/ceph/osd/ceph-0/
如果您成功卸载了驱动器,以下命令输出中不存在该驱动器:
[root@mon ~]# df -h
步骤: 替换物理驱动器
有关替换物理驱动器的详情,请查看硬件节点的文档。
- 如果驱动器热插拔,请将失败的驱动器替换为新驱动器。
- 如果驱动器不可热插拔并且节点包含多个 OSD,您可能需要关闭整个节点并替换物理驱动器。考虑阻止集群回填。详情请参阅 红帽 Ceph 存储故障排除指南 中的 停止和启动重新平衡 章节。
-
当驱动器显示在
/dev/
目录下时,记下驱动器路径。 - 如果要手动添加 OSD,找到 OSD 驱动器并格式化磁盘。
步骤:将 OSD 添加到 Ceph 集群
再次添加 OSD。
如果您使用 Ansible 部署集群,请从 Ceph 管理服务器再次运行
ceph-ansible
playbook:裸机部署:
语法
ansible-playbook site.yml -i hosts --limit NEW_OSD_NODE_NAME
示例
[user@admin ceph-ansible]$ ansible-playbook site.yml -i hosts --limit node03
容器部署:
语法
ansible-playbook site-container.yml -i hosts --limit NEW_OSD_NODE_NAME
示例
[user@admin ceph-ansible]$ ansible-playbook site-container.yml -i hosts --limit node03
- 如果您手动添加 OSD,请参阅红帽 Ceph 存储 4 操作指南中的使用命令行界面添加 Ceph OSD 部分。
确保 CRUSH 层次结构准确:
[root@mon ~]# ceph osd tree
如果您对 CRUSH 层次结构中的 OSD 的位置不满意,请将 OSD 移到所需的位置:
[root@mon ~]# ceph osd crush move BUCKET_TO_MOVE BUCKET_TYPE=PARENT_BUCKET
例如,将位于
sdd:row1
的存储桶移动到 root 存储桶:[root@mon ~]# ceph osd crush move ssd:row1 root=ssd:root
其它资源
- 请参阅《 红帽 Ceph 存储故障排除指南 》中的 故障 OSD 部分。
- 请参阅《 红帽 Ceph 存储操作指南》中的管理集群大小 一章。
- 请参阅《 红帽 Ceph 存储安装指南 》。