1.5. Ceph OSD


当 Red Hat Ceph Storage 集群启动并运行时,您可以在运行时将 OSD 添加到存储集群中。

Ceph OSD 通常由一个存储驱动器和一个 ceph-osd 守护进程和一个节点中的相关日志组成。如果节点有多个存储驱动器,则为每个驱动器映射一个 ceph-osd 守护进程。

红帽建议定期检查集群的容量,以查看它是否达到其存储容量的上限。当存储集群达到其 近满(near full)比率时,添加一个或多个 OSD 来扩展存储集群的容量。

当您要缩小 Red Hat Ceph Storage 集群大小或替换硬件时,您还可以在运行时移除 OSD。如果节点有多个存储驱动器,您可能还需要为该驱动器删除其中一个 ceph-osd 守护进程。通常,最好检查存储集群的容量,以查看您是否达到其容量的上限。在删除 OSD 后,确保存储集群没有达到接近全满比率。

重要

在添加 OSD 前,不要让存储集群达到全满比率。在存储集群达到接近满比率后发生 OSD 故障可能会导致存储集群超过全满比率。Ceph 会阻止写入访问来保护数据,直到您解决存储容量问题。在删除 OSD 前,需要仔细考虑它对 full 比率的影响。

1.5.1. Ceph OSD 节点配置

配置 Ceph OSD 及其支持的硬件与使用 OSD 的池存储策略类似。Ceph 倾向于在池之间实现一致的性能配置集统一硬件。为了获得最佳性能,请考虑使用相同类型或大小的驱动器的 CRUSH 层次结构。

如果您添加不同大小的驱动器,请相应地调整其权重。将 OSD 添加到 CRUSH map 时,请考虑新 OSD 的权重。硬盘容量每年增长约 40%,因此较新的 OSD 节点可能比存储集群中的旧节点有更大的硬盘驱动器,即它们可能具有更大的权重。

在进行新安装前,请参阅安装指南中的安装 Red Hat Ceph Storage 的要求章节。

其它资源

1.5.2. 将容器 OSD ID 映射到驱动器

有时,需要确定容器化 OSD 正在使用哪个驱动器。例如,如果 OSD 有问题,您可能需要知道它用来验证驱动器状态的驱动器。另外,对于非容器化 OSD,您可以引用 OSD ID 来启动和停止它,但要启动和停止容器化 OSD,您要引用它所使用的驱动器。

重要

以下示例在 Red Hat Enterprise Linux 8 上运行。在 Red Hat Enterprise Linux 8 中,podman 是默认服务,并替换了旧的 docker 服务。如果您在 Red Hat Enterprise Linux 7 上运行,则使用 docker 替换 podman 以执行给定的命令。

先决条件

  • 在容器化环境中运行的 Red Hat Ceph Storage 集群。
  • 具有容器节点的 root 访问权限。

流程

  1. 查找容器名称。例如,要识别与 osd.5 关联的驱动器,请在 osd.5 正在运行的容器节点上打开终端,然后运行 podman ps 来列出所有容器:

    示例

    [root@ceph3 ~]# podman ps
    CONTAINER ID        IMAGE                                                     COMMAND             CREATED             STATUS              PORTS               NAMES
    3a866f927b74        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    About an hour ago   Up About an hour                        ceph-osd-ceph3-sdd
    4e242d932c32        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    About an hour ago   Up About an hour                        ceph-osd-ceph3-sdc
    91f3d4829079        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    22 hours ago        Up 22 hours                             ceph-osd-ceph3-sdb
    73dfe4021a49        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-osd-ceph3-sdf
    90f6d756af39        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-osd-ceph3-sde
    e66d6e33b306        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-mgr-ceph3
    733f37aafd23        registry.redhat.io/rhceph/rhceph-4-rhel8:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-mon-ceph3

  2. 使用 podman exec 在前面输出中任何 OSD 容器名称上运行 ceph-volume lvm 列表

    示例

    [root@ceph3 ~]# podman exec ceph-osd-ceph3-sdb ceph-volume lvm list
    
    ====== osd.5 =======
    
      [journal]    /dev/journals/journal1
    
          journal uuid              C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs
          osd id                    1
          cluster fsid              ce454d91-d748-4751-a318-ff7f7aa18ffd
          type                      journal
          osd fsid                  661b24f8-e062-482b-8110-826ffe7f13fa
          data uuid                 SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ
          journal device            /dev/journals/journal1
          data device               /dev/test_group/data-lv2
          devices                   /dev/sda
    
      [data]    /dev/test_group/data-lv2
    
          journal uuid              C65n7d-B1gy-cqX3-vZKY-ZoE0-IEYM-HnIJzs
          osd id                    1
          cluster fsid              ce454d91-d748-4751-a318-ff7f7aa18ffd
          type                      data
          osd fsid                  661b24f8-e062-482b-8110-826ffe7f13fa
          data uuid                 SlEgHe-jX1H-QBQk-Sce0-RUls-8KlY-g8HgcZ
          journal device            /dev/journals/journal1
          data device               /dev/test_group/data-lv2
          devices                   /dev/sdb

    在这个输出中,您可以看到 osd.5/dev/sdb 关联。

其它资源

1.5.3. 使用 Ansible 添加具有相同磁盘拓扑的 Ceph OSD

对于具有相同磁盘拓扑的 Ceph OSD,Ansible 使用 /usr/share/ceph-ansible/group_vars/osds.yml 文件的 devices: 部分中指定的同一设备路径添加与其他 OSD 节点相同的 OSD 数量。

注意

新的 Ceph OSD 节点具有与 OSD 的其余部分相同的配置。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 请参阅 Red Hat Ceph Storage 安装指南中的安装 Red Hat Ceph Storage 的要求
  • 具有对新节点的 root 访问权限。
  • 与存储集群中的其他 OSD 节点相同的 OSD 数据驱动器数量。

流程

  1. 将 Ceph OSD 节点添加到 /etc/ansible/hosts 文件的 [osds] 部分下:

    语法

    [osds]
    ...
    osd06
    NEW_OSD_NODE_NAME

  2. 验证 Ansible 能否访问 Ceph 节点:

    [user@admin ~]$ ansible all -m ping
  3. 进入 Ansible 配置目录:

    [user@admin ~]$ cd /usr/share/ceph-ansible
  4. 对于裸机容器部署,请运行 add-osd.yml Ansible playbook:

    注意

    对于新的 OSD 主机,您需要使用 --limit 选项运行 site.ymlsite-container.yml playbook,并且 ceph-crash 服务没有部署到使用 osds.yml playbook 的节点上。

    示例

    [user@admin ceph-ansible]$ ansible-playbook infrastructure-playbooks/add-osd.yml -i hosts

    对于新的 OSD 主机,请运行 site.ymlsite-container.yml 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 时,如果 playbook 失败(PGs were not reported as active+clean),在 all.yml 文件中配置以下变量来调整重试和延迟:

# OSD handler checks
handler_health_osd_check_retries: 50
handler_health_osd_check_delay: 30

其它资源

  • 如需了解有关 Ansible 清单配置的更多详细信息,请参阅 {storage_product} 安装指南中的配置 Ansible 清单位置部分。

1.5.4. 使用具有不同磁盘拓扑的 Ansible 添加 Ceph OSD

对于具有不同磁盘拓扑的 Ceph OSD,可通过两种方法将新 OSD 节点添加到现有存储集群中。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 请参阅 Red Hat Ceph Storage 安装指南中的安装 Red Hat Ceph Storage 的要求
  • 具有对新节点的 root 访问权限。

流程

  1. 第一种方法

    1. [osds] 部分下,添加新的 Ceph OSD 节点到 /etc/ansible/hosts 文件:

      示例

      [osds]
      ...
      osd06
      NEW_OSD_NODE_NAME

    2. /etc/ansible/host_vars/ 目录下,为每个添加到存储集群的每个新 Ceph OSD 节点创建一个新文件:

      语法

      touch /etc/ansible/host_vars/NEW_OSD_NODE_NAME

      示例

      [root@admin ~]# touch /etc/ansible/host_vars/osd07

    3. 编辑新文件,并将 devices:dedicated_devices: 部分添加到该文件中。在每个部分下,添加一个 -、空格,然后添加到这个 OSD 节点的块设备名称的完整路径:

      示例

      devices:
        - /dev/sdc
        - /dev/sdd
        - /dev/sde
        - /dev/sdf
      
      dedicated_devices:
        - /dev/sda
        - /dev/sda
        - /dev/sdb
        - /dev/sdb

    4. 验证 Ansible 是否可以访问所有 Ceph 节点:

      [user@admin ~]$ ansible all -m ping
    5. 将目录改为 Ansible 配置目录:

      [user@admin ~]$ cd /usr/share/ceph-ansible
    6. 对于裸机容器部署,请运行 add-osd.yml Ansible playbook:

      注意

      对于新的 OSD 主机,您需要使用 --limit 选项运行 site.ymlsite-container.yml playbook,并且 ceph-crash 服务没有部署到使用 osds.yml playbook 的节点上。

      示例

      [user@admin ceph-ansible]$ ansible-playbook infrastructure-playbooks/add-osd.yml -i hosts

      对于新的 OSD 主机,请运行 site.ymlsite-container.yml 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

  2. 第二种方法

    1. 将新 OSD 节点名称添加到 /etc/ansible/hosts 文件,并使用 devicesdedicated_devices 选项指定不同的磁盘拓扑:

      示例

      [osds]
      ...
      osd07 devices="['/dev/sdc', '/dev/sdd', '/dev/sde', '/dev/sdf']" dedicated_devices="['/dev/sda', '/dev/sda', '/dev/sdb', '/dev/sdb']"

    2. 验证 Ansible 能否访问所有 Ceph 节点:

      [user@admin ~]$ ansible all -m ping
    3. 将目录改为 Ansible 配置目录:

      [user@admin ~]$ cd /usr/share/ceph-ansible
  3. 对于裸机容器部署,请运行 add-osd.yml Ansible playbook:

    注意

    对于新的 OSD 主机,您需要使用 --limit 选项运行 site.ymlsite-container.yml playbook,并且 ceph-crash 服务没有部署到使用 osds.yml playbook 的节点上。

    示例

    [user@admin ceph-ansible]$ ansible-playbook infrastructure-playbooks/add-osd.yml -i hosts

    对于新的 OSD 主机,请运行 site.ymlsite-container.yml 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

其它资源

  • 如需了解有关 Ansible 清单配置的更多详细信息,请参阅 {storage_product} 安装指南中的配置 Ansible 清单位置部分。

1.5.5. 使用 ceph-volume创建 Ceph OSD

create 子命令调用 prepare 子命令,然后调用 activate 子命令。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 对 Ceph OSD 节点的 root 级别访问权限。
注意

如果您希望对创建过程拥有更多控制,可以单独使用 prepareactivate 子命令来创建 OSD,而不必使用 create。您可以使用两个子命令逐步将新的 OSD 引入到存储集群中,同时避免重新平衡大量数据。这两种方法的工作方式相同,唯一的不同是使用 create 子命令会使 OSD 在完成后立即变为 upin

流程

  1. 要创建新 OSD,请执行以下操作:

    语法

    ceph-volume lvm create --bluestore --data VOLUME_GROUP/LOGICAL_VOLUME

    示例

    [root@osd ~]# ceph-volume lvm create --bluestore --data example_vg/data_lv

其它资源

1.5.6. 将批处理模式与 ceph-volume搭配使用

当提供单一设备时,batch 子命令可自动创建多个 OSD。

ceph-volume 命令根据驱动器类型决定使用创建 OSD 的最佳方法。Ceph OSD 优化取决于可用的设备:

  • 如果所有设备都是传统的硬盘驱动器,batch 会为每个设备创建一个 OSD。
  • 如果所有设备都是固态硬盘,则 batch 会为每个设备创建两个 OSD。
  • 如果混合使用传统硬盘驱动器和固态驱动器,batch 使用传统的硬盘驱动器用于数据,并在固态硬盘上创建最大可能的日志(block.db)。
注意

batch 子命令不支持为 write-ahead-log (block.wal) 设备创建单独的逻辑卷。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 对 Ceph OSD 节点的 root 级别访问权限。

流程

  1. 在几个驱动器中创建 OSD:

    语法

    ceph-volume lvm batch --bluestore PATH_TO_DEVICE [PATH_TO_DEVICE]

    示例

    [root@osd ~]# ceph-volume lvm batch --bluestore /dev/sda /dev/sdb /dev/nvme0n1

其它资源

1.5.7. 使用命令行界面添加 Ceph OSD

以下是手动将 OSD 添加到 Red Hat Ceph Storage 的高级别工作流:

  1. 安装 ceph-osd 软件包并创建新的 OSD 实例。
  2. 准备并挂载 OSD 数据和日志驱动器。
  3. 创建卷组和逻辑卷。
  4. 添加新 OSD 节点到 CRUSH map。
  5. 更新所有者和组权限。
  6. 启用并启动 ceph-osd 守护进程。
重要

ceph-disk 命令已弃用。ceph-volume 命令现在是从命令行界面部署 OSD 的首选方法。目前,ceph-volume 命令只支持 lvm 插件。红帽在整个指南中提供了使用两个命令作为参考的示例,允许存储管理员将依赖 ceph-disk 的任何自定义脚本转换为 ceph-volume

注意

对于自定义存储集群名称,请将 --cluster CLUSTER_NAME 选项与 cephceph-osd 命令搭配使用。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 请参阅 Red Hat Ceph Storage 安装指南中的安装 Red Hat Ceph Storage 的要求
  • 新节点的 root 访问权限。
  • 可选。如果您不希望 ceph-volume 实用程序自动创建卷组和逻辑卷,请手动创建它们。请参阅 Red Hat Enterprise Linux 8 配置和管理逻辑卷指南。

流程

  1. 启用 Red Hat Ceph Storage 4 OSD 软件存储库。

    Red Hat Enterprise Linux 7

    [root@osd ~]# subscription-manager repos --enable=rhel-7-server-rhceph-4-osd-rpms

    Red Hat Enterprise Linux 8

    [root@osd ~]# subscription-manager repos --enable=rhceph-4-osd-for-rhel-8-x86_64-rpms

  2. 创建 /etc/ceph/ 目录:

    [root@osd ~]# mkdir /etc/ceph
  3. 在新 OSD 节点上,从其中一个 Ceph 监控节点复制 Ceph 管理密钥环和配置文件:

    语法

    scp USER_NAME @ MONITOR_HOST_NAME :/etc/ceph/CLUSTER_NAME.client.admin.keyring /etc/ceph
    scp USER_NAME @ MONITOR_HOST_NAME :/etc/ceph/CLUSTER_NAME.conf /etc/ceph

    示例

    [root@osd ~]# scp root@node1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
    [root@osd ~]# scp root@node1:/etc/ceph/ceph.conf /etc/ceph/

  4. 在新的 Ceph OSD 节点上安装 ceph-osd 软件包:

    Red Hat Enterprise Linux 7

    [root@osd ~]# yum install ceph-osd

    Red Hat Enterprise Linux 8

    [root@osd ~]# dnf install ceph-osd

  5. 准备 OSD。

    • 使用之前创建的逻辑卷:

      语法

      ceph-volume lvm prepare --bluestore --data VOLUME_GROUP/LOGICAL_VOLUME

    • ceph-volume 指定原始设备以自动创建逻辑卷:

      语法

      ceph-volume lvm prepare --bluestore --data /PATH_TO_DEVICE

      如需了解更多详细信息,请参阅准备 OSD 部分。

  6. 设置 noup 选项:

    [root@osd ~]# ceph osd set noup
  7. 激活新 OSD:

    语法

    ceph-volume lvm activate --bluestore OSD_ID OSD_FSID

    示例

    [root@osd ~]# ceph-volume lvm activate --bluestore 4 6cc43680-4f6e-4feb-92ff-9c7ba204120e

    如需了解更多详细信息,请参阅 激活 OSD 部分。

    注意

    您可以使用一个命令准备并激活 OSD。详情请参阅创建 OSD 部分。或者,您可以使用单个命令指定多个驱动器并创建 OSD。请参阅使用 batch 模式

  8. 将 OSD 添加到 CRUSH map。如果指定了多个存储桶,命令会将 OSD 放置到您指定的特定存储桶中,并且会将存储桶移到您指定的任何其他 bucket 下。

    语法

    ceph osd crush add OSD_ID WEIGHT [ BUCKET_TYPE = BUCKET_NAME ...]

    示例

    [root@osd ~]# ceph osd crush add 4 1 host=node4

    注意

    如果指定了多个存储桶,命令会将 OSD 放置到您指定的特定存储桶中,并且会将存储桶移到您指定的任何其他 bucket 下。

    注意

    您也可以手动编辑 CRUSH map。请参阅 Red Hat Ceph Storage 策略指南中的编辑 CRUSH map 部分。

    重要

    如果您仅指定根存储桶,则 OSD 会直接附加到 root,但 CRUSH 规则预期 OSD 在主机 bucket 内。

  9. 取消设置 noup 选项:

    [root@osd ~]# ceph osd unset noup
  10. 为新创建的目录更新所有者和组权限:

    语法

    chown -R OWNER : GROUP PATH_TO_DIRECTORY

    示例

    [root@osd ~]# chown -R ceph:ceph /var/lib/ceph/osd
    [root@osd ~]# chown -R ceph:ceph /var/log/ceph
    [root@osd ~]# chown -R ceph:ceph /var/run/ceph
    [root@osd ~]# chown -R ceph:ceph /etc/ceph

  11. 如果您使用带有自定义名称的存储集群,请在适当的文件中添加以下行:

    [root@osd ~]# echo "CLUSTER=CLUSTER_NAME" >> /etc/sysconfig/ceph

    CLUSTER_NAME 替换为自定义存储集群名称。

  12. 为确保新 OSD 已启动 并准备好接收数据,请启用并启动 OSD 服务:

    语法

    systemctl enable ceph-osd@OSD_ID
    systemctl start ceph-osd@OSD_ID

    示例

    [root@osd ~]# systemctl enable ceph-osd@4
    [root@osd ~]# systemctl start ceph-osd@4

其它资源

1.5.8. 使用容器化环境中的命令行界面添加 Ceph OSD

您可以使用容器化 Red Hat Ceph Storage 集群中的命令行界面手动添加一个或多个 Ceph OSD。

重要

红帽建议使用 ceph-ansible 添加 Ceph OSD,除非存在异常或需要手动添加 Ceph OSD 的具体用例。如果您不确定,请联系红帽支持团队

先决条件

  • 在容器化环境中运行的 Red Hat Ceph Storage 集群。
  • 具有对容器节点的 root 访问权限。
  • 现有的 OSD 节点。
重要

以下示例在 Red Hat Enterprise Linux 8 上运行。在 Red Hat Enterprise Linux 8 中,podman 是默认服务,并替换了旧的 docker 服务。如果您在 Red Hat Enterprise Linux 7 上运行,则使用 docker 替换 podman 来执行给定的命令。

流程

  1. 要创建单个 OSD,请执行 lvm prepare 命令:

    语法

    podman run --rm --net=host --privileged=true --pid=host --ipc=host -v /dev:/dev -v /etc/localtime:/etc/localtime:ro -v /var/lib/ceph:/var/lib/ceph:z -v /etc/ceph:/etc/ceph:z -v /var/run/ceph:/var/run/ceph:z -v /var/run/udev/:/var/run/udev/ -v /var/log/ceph:/var/log/ceph:z -v /run/lvm/:/run/lvm/ --entrypoint=ceph-volume PATH_TO_IMAGE --cluster CLUSTER_NAME lvm prepare --bluestore --data PATH_TO_DEVICE --no-systemd

    示例

    [root@osd ~]# podman run --rm --net=host --privileged=true --pid=host --ipc=host -v /dev:/dev -v /etc/localtime:/etc/localtime:ro -v /var/lib/ceph:/var/lib/ceph:z -v /etc/ceph:/etc/ceph:z -v /var/run/ceph:/var/run/ceph:z -v /var/run/udev/:/var/run/udev/ -v /var/log/ceph:/var/log/ceph:z -v /run/lvm/:/run/lvm/ --entrypoint=ceph-volume registry.redhat.io/rhceph/rhceph-4-rhel8:latest --cluster ceph lvm prepare --bluestore --data /dev/sdh --no-systemd

    此示例准备一个 Bluestore Ceph OSD,其数据位于 /dev/sdh 中。

    注意

    要启用并启动 OSD,请执行以下命令:

    示例

    [root@osd ~]# systemctl enable ceph-osd@4
    [root@osd ~]# systemctl start ceph-osd@4

    您还可以使用以下可选参数:

    dmcrypt
    描述
    为底层 OSD 设备启用加密。
    block.db
    描述
    到 bluestore block.db 逻辑卷或分区的路径。
    block.wal
    描述
    到 bluestore block.wal 逻辑卷或分区的路径。
  2. 要创建多个 Ceph OSD,请执行 lvm batch 命令:

    语法

    podman run --rm --net=host --privileged=true --pid=host --ipc=host -v /dev:/dev -v /etc/localtime:/etc/localtime:ro -v /var/lib/ceph:/var/lib/ceph:z -v /etc/ceph:/etc/ceph:z -v /var/run/ceph:/var/run/ceph:z -v /var/run/udev/:/var/run/udev/ -v /var/log/ceph:/var/log/ceph:z -v /run/lvm/:/run/lvm/ --entrypoint=ceph-volume PATH_TO_IMAGE --cluster CLUSTER_NAME lvm batch --bluestore --yes --prepare _PATH_TO_DEVICE PATH_TO_DEVICE --no-systemd

    示例

    [root@osd ~]# podman run --rm --net=host --privileged=true --pid=host --ipc=host -v /dev:/dev -v /etc/localtime:/etc/localtime:ro -v /var/lib/ceph:/var/lib/ceph:z -v /etc/ceph:/etc/ceph:z -v /var/run/ceph:/var/run/ceph:z -v /var/run/udev/:/var/run/udev/ -v /var/log/ceph:/var/log/ceph:z -v /run/lvm/:/run/lvm/ --entrypoint=ceph-volume registry.redhat.io/rhceph/rhceph-4-rhel8:latest --cluster ceph lvm batch --bluestore --yes --prepare /dev/sde /dev/sdf --no-systemd

    这个示例使用 /dev/sde/dev/sdf 中的数据准备多个 Bluestore Ceph OSD。

    您还可以使用以下可选参数:

    dmcrypt
    描述
    为底层 OSD 设备启用加密。
    db-devices
    描述
    到 bluestore block.db 逻辑卷或分区的路径。
    wal-devices
    描述
    到 bluestore block.wal 逻辑卷或分区的路径。

1.5.9. 使用 Ansible 删除 Ceph OSD

有时,您可能需要缩减 Red Hat Ceph Storage 集群的容量。要使用 Ansible 从 Red Hat Ceph Storage 集群中删除 OSD,请运行 shrink-osd.yml playbook。

重要

从存储集群移除 OSD 将破坏该 OSD 中包含的所有数据。

重要

在移除 OSD 前,请验证集群有足够的空间来重新平衡。

重要

除非您要确保 PG 处于 active+clean 状态,否则 OSD 不会同时删除 OSD,否则 OSD 不包含同一对象的副本或纠删代码分片。如果不确定,请联系红帽支持 团队。

先决条件

  • 一个由 Ansible 部署的、正在运行的 Red Hat Ceph Storage。
  • 正在运行的 Ansible 管理节点。

流程

  1. 进入到 /usr/share/ceph-ansible/ 目录。

    语法

    [user@admin ~]$ cd /usr/share/ceph-ansible

  2. 将 Ceph 监控节点上的 /etc/ceph/ 中的 admin keyring 复制到包含您要删除的 OSD 的节点。
  3. 为 Ceph 的正常或容器化部署运行 Ansible playbook:

    语法

    ansible-playbook infrastructure-playbooks/shrink-osd.yml -e osd_to_kill=ID -u ANSIBLE_USER_NAME -i hosts

    替换:

    • 带有 OSD 节点的 ID 的 ID。要删除多个 OSD,请将 OSD ID 与逗号分开。
    • ANSIBLE_USER_NAME,Ansible 用户的名称。

    示例

    [user@admin ceph-ansible]$ ansible-playbook infrastructure-playbooks/shrink-osd.yml -e osd_to_kill=1 -u user -i hosts

  4. 验证 OSD 是否已成功移除:

    语法

    [root@mon ~]# ceph osd tree

其它资源

1.5.10. 使用命令行界面删除 Ceph OSD

从存储集群中移除 OSD 涉及这些步骤:* 更新 cluster map。* 删除其验证密钥。* 从 OSD map 移除 OSD。* 从 ceph.conf 文件中删除 OSD。

如果 OSD 节点有多个驱动器,您可能需要为您要删除的每个 OSD 重复此步骤来为每个驱动器移除 OSD。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 有足够的 OSD,使得存储集群不达到接近全满比率。
  • 对 OSD 节点的 root 级别访问。

流程

  1. 禁用和停止 OSD 服务:

    语法

    systemctl disable ceph-osd@OSD_ID
    systemctl stop ceph-osd@OSD_ID

    示例

    [root@osd ~]# systemctl disable ceph-osd@4
    [root@osd ~]# systemctl stop ceph-osd@4

    OSD 停止后,它会 关闭

  2. 从存储集群中移除 OSD:

    语法

    ceph osd out OSD_ID

    示例

    [root@osd ~]# ceph osd out 4

    重要

    删除 OSD 后,Ceph 会开始重新平衡数据,并将数据复制到存储集群中剩余的 OSD。红帽建议等待存储集群变为 active+clean,然后再继续下一步。要观察数据迁移,请运行以下命令:

    语法

    [root@mon ~]# ceph -w

  3. 从 CRUSH map 移除 OSD,使它不再接收数据。

    语法

    ceph osd crush remove OSD_NAME

    示例

    [root@osd ~]# ceph osd crush remove osd.4

    注意

    要手动删除 OSD 和包含它的存储桶,您还可以解译 CRUSH map,从设备列表中删除 OSD,将设备移除为主机存储桶,或者移除主机存储桶。如果它位于 CRUSH map 中,并且您想要删除主机,则重新编译该映射并设置它。详情请参阅 Storage 策略指南中的反编译 CRUSH map 的说明。

  4. 移除 OSD 身份验证密钥:

    语法

    ceph auth del osd.OSD_ID

    示例

    [root@osd ~]# ceph auth del osd.4

  5. 删除 OSD:

    语法

    ceph osd rm OSD_ID

    示例

    [root@osd ~]# ceph osd rm 4

  6. 编辑存储集群的配置文件。文件的默认名称为 /etc/ceph/ceph.conf。如果存在,请删除文件中的 OSD 条目:

    示例

    [osd.4]
    host = _HOST_NAME_

  7. 如果手动添加了 OSD,删除对 /etc/fstab 文件中的 OSD 的引用。
  8. 将更新后的配置文件复制到存储集群中所有节点的 /etc/ceph/ 目录中。

    语法

    scp /etc/ceph/CLUSTER_NAME.conf USER_NAME@HOST_NAME:/etc/ceph/

    示例

    [root@osd ~]# scp /etc/ceph/ceph.conf root@node4:/etc/ceph/

1.5.11. 使用命令行界面替换 BlueStore 数据库磁盘

当替换 BlueStore DB 设备 block.db 中包含 BlueStore OSD 的内部元数据时,红帽支持使用 Ansible 和命令行界面 (CLI) 重新部署所有 OSD。一个被破坏的 block.db 文件会影响到包括在那个 block.db 文件包含的所有 OSD。

替换 BlueStore block.db 磁盘的步骤是,标记每个设备,等待数据在集群中复制,替换 OSD,再重新标记它。您可以保留 OSD_ID,并使用所替换磁盘上的新 block.db 分区重新创建 OSD。虽然这只是一个简单的流程,但需要大量数据迁移。

注意

如果 block.db 设备具有多个 OSD,则对 block.db 设备上的每个 OSD 遵循这个步骤。您可以运行 ceph-volume lvm list 来查看 block.db 到块的关系。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 带分区的存储设备。
  • 所有节点的根级别访问权限。

流程

  1. 检查 monitor 节点上的当前 Ceph 集群状态:

    [root@mon ~]# ceph status
    [root@mon ~]# ceph df
  2. 识别要替换的 OSD 失败:

    [root@mon ~]# ceph osd tree | grep -i down
  3. 在 OSD 节点上停止并禁用 OSD 服务:

    语法

    systemctl disable ceph-osd@OSD_ID
    systemctl stop ceph-osd@OSD_ID

    示例

    [root@osd1 ~]# systemctl stop ceph-osd@1
    [root@osd1 ~]# systemctl disable ceph-osd@1

  4. 在监控节点上设置 OSD out

    语法

    ceph osd out OSD_ID

    示例

    [root@mon ~]# ceph osd out 1

  5. 等待数据从 OSD 迁出:

    语法

    while ! ceph osd safe-to-destroy OSD_ID ; do sleep 60 ; done

    示例

    [root@mon ~]# while ! ceph osd safe-to-destroy 1 ; do sleep 60 ; done

  6. 停止 OSD 节点上的 OSD 守护进程:

    语法

    systemctl kill ceph-osd@OSD_ID

    示例

    [root@osd1 ~]# systemctl kill ceph-osd@1

  7. 记录此 OSD 使用的设备:

    语法

    mount | grep /var/lib/ceph/osd/ceph-OSD_ID

    示例

    [root@osd1 ~]# mount | grep /var/lib/ceph/osd/ceph-1

  8. 卸载 OSD 节点上的故障驱动器路径的挂载点:

    语法

    umount /var/lib/ceph/osd/CLUSTER_NAME-OSD_ID

    示例

    [root@osd1 ~] #umount /var/lib/ceph/osd/ceph-1

  9. 设置 nooutnorebalance 以避免回填和重新平衡:

    [root@mon ~]# ceph osd set noout
    [root@mon ~]# ceph osd set norebalance
  10. 替换物理驱动器。请参阅硬件厂商的文档。在继续操作前,等待新驱动器出现在 /dev/ 目录下,并记录下驱动器路径。
  11. 销毁 monitor 节点上的 OSD:

    语法

    ceph osd destroy OSD_ID --yes-i-really-mean-it

    示例

    [root@mon ~]# ceph osd destroy 1 --yes-i-really-mean-it

    重要

    此步骤会破坏设备的内容。确保不需要该设备中的数据,且集群处于健康状态。

  12. 删除 OSD 磁盘中的逻辑卷管理器:

    语法

    lvremove /dev/VOLUME_GROUP/LOGICAL_VOLUME
    vgremove VOLUME_GROUP
    pvremove /dev/DEVICE

    示例

    [root@osd1 ~]# lvremove /dev/data-vg1/data-lv1
    [root@osd1 ~]# vgremove data-vg1
    [root@osd1 ~]# pvremove /dev/sdb

  13. 在 OSD 节点上 zap OSD 磁盘:

    语法

    ceph-volume lvm zap DEVICE

    示例

    [root@osd1 ~]# ceph-volume lvm zap /dev/sdb

  14. 在 OSD 磁盘上重新创建 lvm:

    语法

    pvcreate /dev/DEVICE
    vgcreate VOLUME_GROUP /dev/DEVICE
    lvcreate -l SIZE -n LOGICAL_VOLUME VOLUME_GROUP

    示例

    [root@osd1 ~]# pvcreate /dev/sdb
    [root@osd1 ~]# vgcreate data-vg1 /dev/sdb
    [root@osd1 ~]# lvcreate -l 100%FREE -n data-lv1 data-vg1

  15. 在新的 block.db 磁盘上创建 lvm:

    语法

    pvcreate /dev/DEVICE
    vgcreate VOLUME_GROUP_DATABASE /dev/DEVICE
    lvcreate -Ll SIZE -n LOGICAL_VOLUME_DATABASE VOLUME_GROUP_DATABASE

    示例

    [root@osd1 ~]# pvcreate /dev/sdb
    [root@osd1 ~]# vgcreate db-vg1 /dev/sdb
    [root@osd1 ~]# lvcreate -l 100%FREE -n lv-db1 db-vg1

  16. 在 OSD 节点上重新创建 OSD:

    语法

    ceph-volume lvm create --bluestore --osd-id OSD_ID --data VOLUME_GROUP/LOGICAL_VOLUME --block.db VOLUME_GROUP_DATABASE/LOGICAL_VOLUME_DATABASE

    示例

    [root@osd1 ~]# ceph-volume lvm create --bluestore --osd-id 1 --data data-vg1/data-lv1 --block.db db-vg1/db-lv1

    注意

    红帽建议使用与前面步骤中销毁相同的 OSD_ID

  17. 在 OSD 节点上启动并启用 OSD 服务:

    语法

    systemctl start ceph-osd@OSD_ID
    systemctl enable ceph-osd@OSD_ID

    示例

    [root@osd1 ~]# systemctl start ceph-osd@1
    [root@osd1 ~]# systemctl enable ceph-osd@1

  18. 检查 CRUSH 层次结构以确保 OSD 在集群中:

    [root@mon ~]# ceph osd tree
  19. 取消设置 noout 和 norebalance:

    [root@mon ~]# ceph osd unset noout
    [root@mon ~]# ceph osd unset norebalance
  20. 监控集群状态,直到 HEALTH_OK 为止:

    [root@mon ~]# watch -n2 ceph -s

其它资源

1.5.12. 观察数据迁移

将 OSD 添加到 CRUSH map 时,Ceph 开始通过将放置组迁移到新的或现有的 OSD 来重新平衡数据。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 最近添加或删除 OSD。

流程

  1. 观察数据迁移:

    [root@monitor ~]# ceph -w
  2. 在迁移完成后,观察放置组状态从 active+clean 变为 active, some degraded objects,最终变为 active+clean
  3. 要退出,请按 Ctrl + C
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.