Red Hat Training

A Red Hat training course is available for Red Hat Ceph Storage

5.4. 替换 OSD 驱动器

Ceph 专为容错设计,这意味着它可以在 degraded 状态下运行,而不丢失数据。因此,即使数据存储驱动器失败,Ceph 也能运行。在故障驱动器的上下文中,degraded 状态意味着存储在其他 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。详情请查看 第 5.1.3 节 “个或更多 OSD 发生故障”

现代服务器通常使用热插拔驱动器进行部署,以便您可以将失败的驱动器替换为新的驱动器,而无需关闭节点。整个流程包括这些步骤:

  1. 从 Ceph 集群移除 OSD。详情请参阅 从 Ceph 集群删除 OSD 过程。
  2. 替换驱动器。详情请查看 替换 Physical Drive 部分。
  3. 将 OSD 添加到集群。详情请参阅 在 Ceph 集群中添加 OSD

开始前

  1. 确定哪个 OSD 为 down:

    # 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
  2. 确保 OSD 进程已经停止。从 OSD 节点运行以下命令:

    # systemctl status ceph-osd@<OSD-number>

    使用标记为 down 的 OSD 的 ID 替换 <OSD-number>,例如:

    # systemctl status ceph-osd@osd.0
    ...
       Active: inactive (dead)

    如果 ceph-osd 守护进程正在运行。如需有关对标记为 down 的 OSD 进行故障排除(它们对应的 ceph-osd 守护进程正在运行)的更多详细信息,请参阅 第 5.1.3 节 “个或更多 OSD 发生故障”

步骤:从 Ceph 集群中删除 OSD

  1. 将 OSD 标记为 out

    # ceph osd out osd.<OSD-number>

    使用标记为 down 的 OSD 的 ID 替换 <OSD-number>,例如:

    # ceph osd out osd.0
    marked out osd.0.
    注意

    如果 OSD 是 down,当它没有从 OSD 接收任何心跳数据包时,Ceph 会在 600 秒后自动将其标记为 out。发生这种情况时,具有故障 OSD 数据副本的其他 OSD 开始回填,以确保集群中存在所需的副本数。当集群回填时,集群将处于 degraded 状态。

  2. 确保故障 OSD 正在回填。输出将包含类似如下的信息:

    # 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
  3. 从 CRUSH map 移除 OSD:

    # ceph osd crush remove osd.<OSD-number>

    使用标记为 down 的 OSD 的 ID 替换 <OSD-number>,例如:

    # ceph osd crush remove osd.0
    removed item id 0 name 'osd.0' from crush map
  4. 移除与 OSD 相关的身份验证密钥:

    # ceph auth del osd.<OSD-number>

    使用标记为 down 的 OSD 的 ID 替换 <OSD-number>,例如:

    # ceph auth del osd.0
    updated
  5. 从 Ceph 存储集群中移除 OSD:

    # ceph osd rm osd.<OSD-number>

    使用标记为 down 的 OSD 的 ID 替换 <OSD-number>,例如:

    # ceph osd rm osd.0
    removed osd.0

    如果您已成功删除了 OSD,以下命令的输出中不存在它:

    # ceph osd tree
  6. 卸载失败的驱动器:

    # umount /var/lib/ceph/osd/<cluster-name>-<OSD-number>

    指定集群的名称和 OSD 的 ID,例如:

    # umount /var/lib/ceph/osd/ceph-0/

    如果您成功卸载了驱动器,以下命令输出中不存在该驱动器:

    # df -h

步骤: 替换物理驱动器

  1. 有关替换物理驱动器的详情,请查看硬件节点的文档。

    1. 如果驱动器热插拔,请将失败的驱动器替换为新驱动器。
    2. 如果驱动器不可热插拔并且节点包含多个 OSD,您可能需要关闭整个节点并替换物理驱动器。考虑阻止集群回填。详情请查看 第 5.2 节 “停止并启动重新平衡”
  2. 当驱动器显示在 /dev/ 目录中时,记录驱动器路径。
  3. 如果要手动添加 OSD,找到 OSD 驱动器并格式化磁盘。

步骤:将 OSD 添加到 Ceph 集群

  1. 再次添加 OSD。

    1. 如果您使用 Ansible 部署集群,请从 Ceph 管理服务器再次运行 ceph-ansible playbook:

      # ansible-playbook /usr/share/ceph-ansible site.yml
    2. 如果您手动添加 OSD,请参阅 Red Hat Ceph Storage 3 的 _Administration Guide_e 中的使用命令行界面添加 OSD 部分。
  2. 确保 CRUSH 层次结构准确:

    # ceph osd tree
  3. 如果您对 CRUSH 层次结构中的 OSD 的位置不满意,请将 OSD 移到所需的位置:

    ceph osd crush move <bucket-to-move> <bucket-type>=<parent-bucket>

    例如,将位于 sdd:row1 的存储桶移动到根存储桶:

    # ceph osd crush move ssd:row1 root=ssd:root

另请参阅