操作指南


Red Hat Ceph Storage 3

Red Hat Ceph Storage 的操作任务

Red Hat Ceph Storage Documentation Team

摘要

本文档论述了如何为 Red Hat Ceph Storage 进行运维任务。

第 1 章 管理存储集群大小

作为存储管理员,您可以添加或删除 Ceph 监视器或 OSD 作为存储容量扩展或缩小来管理存储集群大小。

注意

如果您是第一次引导存储集群,请参阅 Red Hat Enterprise LinuxUbuntu 的 Red Hat Ceph Storage 3 安装指南。

1.1. 先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。

1.2. Ceph Monitors

Ceph 监控器是维护 cluster map 主节点副本的轻量级进程。所有 Ceph 客户端都联系 Ceph 监控器并检索 cluster map 的当前副本,使客户端能够绑定到池以及读取和写入数据。

Ceph 监视器使用 Paxos 协议的变体来建立关于集群中映射和其他重要信息的共识。由于 Paxos 的性质,Ceph 需要大多数监视器正在运行才能建立仲裁,从而建立共识。

重要

红帽至少需要三个监视器在独立的主机上接受对生产环境集群的支持。

红帽建议部署奇数个 monitor。奇数的监控器数量比监视器数要高到故障的弹性。例如,若要在两个监控部署中维护仲裁,Ceph 无法容忍任何错误;具有三个监视器,一个故障;四个监视器故障;一个故障,有五个 monitor,两个失败。这就是为什么推荐奇数个数字。Ceph 总结需要大部分的监控器正在运行,而且能够相互通信,另外两个(共三个三个),共三个(共 4 个),等等。

对于多节点 Ceph 存储集群的初始部署,红帽需要三个监视器,当存在超过三个监视器的有效需求时,红帽需要三个监视器。

由于监控器是轻量级的,因此可以在与 OpenStack 节点相同的主机上运行。但是,红帽建议在单独的主机上运行 monitor。

重要

红帽不支持在同一个节点上并定位 Ceph Monitor 和 OSD。这样做可能会对存储集群性能造成负面影响。

红帽仅支持在容器化环境中找到 Ceph 服务。

当您从存储集群中移除监控器时,请考虑 Ceph 监视器使用 Paxos 协议来建立主存储集群映射的共识。您必须有足够的监控器来建立仲裁。

其它资源

1.2.1. 准备新的 Ceph Monitor 节点

在向存储集群添加新 Ceph Monitor 时,请将它们部署到单独的节点上。节点硬件必须统一用于存储集群中的所有节点。

先决条件

步骤

  1. 将新节点添加到服务器机架。
  2. 将新节点连接到网络。
  3. 在新节点上安装 Red Hat Enterprise Linux 7 或 Ubuntu 16.04。
  4. 安装 NTP 并配置可靠的时间源:

    [root@monitor ~]# yum install ntp
    Copy to Clipboard Toggle word wrap
  5. 如果使用防火墙,打开 TCP 端口 6789:

    Red Hat Enterprise Linux

    [root@monitor ~]# firewall-cmd --zone=public --add-port=6789/tcp
    [root@monitor ~]# firewall-cmd --zone=public --add-port=6789/tcp --permanent
    Copy to Clipboard Toggle word wrap

    Ubuntu

    iptables -I INPUT 1 -i $NIC_NAME -p tcp -s $IP_ADDR/$NETMASK_PREFIX --dport 6789 -j ACCEPT
    Copy to Clipboard Toggle word wrap

    Ubuntu 示例

    [user@monitor ~]$ sudo iptables -I INPUT 1 -i enp6s0 -p tcp -s 192.168.0.11/24 --dport 6789 -j ACCEPT
    Copy to Clipboard Toggle word wrap

1.2.2. 使用 Ansible 添加 Ceph Monitor

红帽建议一次添加两个 monitor,以维护奇数的 monitor。例如,如果您在存储集群中有三个监控器,红帽建议将其扩展为五个监控器。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 有到新节点的 root 访问权限。

步骤

  1. /etc/ansible/hosts Ansible 清单文件中添加新 Ceph Monitor 节点,位于 [mons] 部分:

    示例

    [mons]
    monitor01
    monitor02
    monitor03
    $NEW_MONITOR_NODE_NAME
    $NEW_MONITOR_NODE_NAME
    Copy to Clipboard Toggle word wrap

  2. 验证 Ansible 是否可以联系 Ceph 节点:

    # ansible all -m ping
    Copy to Clipboard Toggle word wrap
  3. 将目录改为 Ansible 配置目录:

    # cd /usr/share/ceph-ansible
    Copy to Clipboard Toggle word wrap
  4. 运行 Ansible playbook:

    $ ansible-playbook site.yml
    Copy to Clipboard Toggle word wrap

    如果在 Ceph 的容器化部署中添加新监控器,请运行 site-docker.yml playbook:

    $ ansible-playbook site-docker.yml
    Copy to Clipboard Toggle word wrap
  5. 在 Ansible playbook 完成后,新的监控节点将位于存储集群中。

1.2.3. 使用命令行界面添加 Ceph Monitor

红帽建议一次添加两个 monitor,以维护奇数的 monitor。例如,如果您在存储集群中有三个监控器,红帽建议扩展太五个 monitor。

重要

红帽建议每个节点只运行一个 Ceph monitor 守护进程。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 具有对正在运行的 Ceph 监控节点的 root 访问权限,以及对新的监控节点的访问权限。

步骤

  1. 添加 Red Hat Ceph Storage 3 监控软件仓库。

    Red Hat Enterprise Linux

    [root@monitor ~]# subscription-manager repos --enable=rhel-7-server-rhceph-3-mon-els-rpms
    Copy to Clipboard Toggle word wrap

    Ubuntu

    [user@monitor ~]$ sudo bash -c 'umask 0077; echo deb https://$CUSTOMER_NAME:$CUSTOMER_PASSWORD@rhcs.download.redhat.com/3-updates/Tools $(lsb_release -sc) main | tee /etc/apt/sources.list.d/Tools.list'
    [user@monitor ~]$ sudo bash -c 'wget -O - https://www.redhat.com/security/fd431d51.txt | apt-key add -'
    Copy to Clipboard Toggle word wrap

  2. 在新的 Ceph Monitor 节点上安装 ceph-mon 软件包:

    Red Hat Enterprise Linux

    [root@monitor ~]# yum install ceph-mon
    Copy to Clipboard Toggle word wrap

    Ubuntu

    [user@monitor ~]$ sudo apt-get install ceph-mon
    Copy to Clipboard Toggle word wrap

  3. 为确保存储集群在启动时标识监控器或重启时,请将 monitor 的 IP 地址添加到 Ceph 配置文件。

    将新监控器添加到存储集群中现有监控节点上的 Ceph 配置文件的 [mon][global] 部分。mon_host 设置,这是可解析的主机名或 IP 地址列表,由 "," 或 "; 或 "; 分隔。另外,您还可以在 Ceph 配置文件中为新的监控节点创建特定的部分:

    Syntax

    [mon]
    mon host = $MONITOR_IP:$PORT $MONITOR_IP:$PORT ... $NEW_MONITOR_IP:$PORT
    Copy to Clipboard Toggle word wrap

    [mon.$MONITOR_ID]
    host = $MONITOR_ID
    mon addr = $MONITOR_IP
    Copy to Clipboard Toggle word wrap

    要使监视器成为初始仲裁组的一部分,还必须将主机名添加到 Ceph 配置文件的 [global] 部分中的 mon_initial_members 参数。

    示例

    [global]
    mon initial members = node1 node2 node3 node4 node5
    ...
    [mon]
    mon host = 192.168.0.1:6789 192.168.0.2:6789 192.168.0.3:6789 192.168.0.4:6789 192.168.0.5:6789
    ...
    [mon.node4]
    host = node4
    mon addr = 192.168.0.4
    
    [mon.node5]
    host = node5
    mon addr = 192.168.0.5
    Copy to Clipboard Toggle word wrap

    重要

    生产存储集群 REQUIRE 至少三个 monitor 在 mon_initial_membersmon_host 中设置,以确保高可用性。如果只有一个初始 monitor 的存储集群增加了两个监视器,但没有将它们添加到 mon_initial_membersmon_host,则初始监控器的故障会导致存储群集锁定。如果您要添加的监控器替换为 mon_initial_membersmon_host 的一部分的监控器,则必须将新监视器添加到 mon_initial_membersmon_host 中。

  4. 将更新的 Ceph 配置文件复制到所有 Ceph 节点和 Ceph 客户端:

    Syntax

    scp /etc/ceph/$CLUSTER_NAME.conf $TARGET_NODE_NAME:/etc/ceph
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# scp /etc/ceph/ceph.conf node4:/etc/ceph
    Copy to Clipboard Toggle word wrap

  5. 在新监控节点上创建监控器的数据目录:

    Syntax

    mkdir /var/lib/ceph/mon/$CLUSTER_NAME-$MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# mkdir /var/lib/ceph/mon/ceph-node4
    Copy to Clipboard Toggle word wrap

  6. 在正在运行的监控节点上和新的监控节点上创建一个临时目录,以保留此过程需要的文件。该目录应该与上一步中创建的监控默认目录不同,并可在完成所有步骤后删除:

    Syntax

    mkdir $TEMP_DIRECTORY
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# mkdir /tmp/ceph
    Copy to Clipboard Toggle word wrap

  7. 将 admin 密钥从正在运行的监控节点复制到新的监控节点,以便运行 ceph 命令:

    Syntax

    scp /etc/ceph/$CLUSTER_NAME.client.admin.keyring $TARGET_NODE_NAME:/etc/ceph
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# scp /etc/ceph/ceph.client.admin.keyring node4:/etc/ceph
    Copy to Clipboard Toggle word wrap

  8. 从正在运行的监控器节点中,检索监控器密钥环:

    Syntax

    ceph auth get mon. -o /$TEMP_DIRECTORY/$KEY_FILE_NAME
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph auth get mon. -o /tmp/ceph/ceph_keyring.out
    Copy to Clipboard Toggle word wrap

  9. 从正在运行的监控器节点中,检索 monitor 映射:

    Syntax

    ceph mon getmap -o /$TEMP_DIRECTORY/$MONITOR_MAP_FILE
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph mon getmap -o /tmp/ceph/ceph_mon_map.out
    Copy to Clipboard Toggle word wrap

  10. 将收集的监控器数据复制到新监控节点上:

    Syntax

    scp /tmp/ceph $TARGET_NODE_NAME:/tmp/ceph
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# scp /tmp/ceph node4:/tmp/ceph
    Copy to Clipboard Toggle word wrap

  11. 从您之前收集的数据准备新的监控器数据目录。您必须指定 monitor 映射的路径,以从监控器检索仲裁信息,以及它们的 fsid。您还必须指定到监控器密钥环的路径:

    Syntax

    ceph-mon -i $MONITOR_ID --mkfs --monmap /$TEMP_DIRECTORY/$MONITOR_MAP_FILE --keyring /$TEMP_DIRECTORY/$KEY_FILE_NAME
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph-mon -i node4 --mkfs --monmap /tmp/ceph/ceph_mon_map.out --keyring /tmp/ceph/ceph_keyring.out
    Copy to Clipboard Toggle word wrap

  12. 对于具有自定义名称的存储集群,请在 /etc/sysconfig/ceph 文件中添加以下行:

    Red Hat Enterprise Linux

    [root@monitor ~]# echo "CLUSTER=<custom_cluster_name>" >> /etc/sysconfig/ceph
    Copy to Clipboard Toggle word wrap

    Ubuntu

    [user@monitor ~]$ sudo echo "CLUSTER=<custom_cluster_name>" >> /etc/default/ceph
    Copy to Clipboard Toggle word wrap

  13. 更新新监控节点上的所有者和组权限:

    Syntax

    chown -R $OWNER:$GROUP $DIRECTORY_PATH
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# chown -R ceph:ceph /var/lib/ceph/mon
    [root@monitor ~]# chown -R ceph:ceph /var/log/ceph
    [root@monitor ~]# chown -R ceph:ceph /var/run/ceph
    [root@monitor ~]# chown -R ceph:ceph /etc/ceph
    Copy to Clipboard Toggle word wrap

  14. 在新监控节点上启用并启动 ceph-mon 进程:

    Syntax

    systemctl enable ceph-mon.target
    systemctl enable ceph-mon@$MONITOR_ID
    systemctl start ceph-mon@$MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# systemctl enable ceph-mon.target
    [root@monitor ~]# systemctl enable ceph-mon@node4
    [root@monitor ~]# systemctl start ceph-mon@node4
    Copy to Clipboard Toggle word wrap

1.2.4. 使用 Ansible 删除 Ceph Monitor

要使用 Ansible 删除 Ceph Monitor,请使用 shrink-mon.yml playbook。

先决条件

  • Ansible 管理节点.
  • 由 Ansible 部署的正在运行的红帽 Ceph 存储集群。

步骤

  1. 更改到 /usr/share/ceph-ansible/ 目录。

    [user@admin ~]$ cd /usr/share/ceph-ansible
    Copy to Clipboard Toggle word wrap
  2. infrastructure-playbooks 目录中的 shrink-mon.yml playbook 复制到当前目录。

    [root@admin ceph-ansible]# cp infrastructure-playbooks/shrink-mon.yml .
    Copy to Clipboard Toggle word wrap
  3. 为 Red Hat Ceph Storage 的普通或容器化部署运行 shrink-mon.yml playbook:

    [user@admin ceph-ansible]$ ansible-playbook shrink-mon.yml -e mon_to_kill=<hostname> -u <ansible-user>
    Copy to Clipboard Toggle word wrap

    替换:

    • <hostname> 带有 monitor 节点的短主机名。要删除更多监视器,请使用逗号分隔其主机名。
    • <ansible-user> 带有 Ansible 用户的名称

    例如,要删除位于带有 monitor1 主机名的节点上的 monitor:

    [user@admin ceph-ansible]$ ansible-playbook shrink-mon.yml -e mon_to_kill=monitor1 -u user
    Copy to Clipboard Toggle word wrap
  4. 从集群中的所有 Ceph 配置文件删除 Monitor 条目。
  5. 确保 monitor 已成功移除。

    [root@monitor ~]# ceph -s
    Copy to Clipboard Toggle word wrap

其它资源

1.2.5. 使用命令行界面删除 Ceph Monitor

删除 Ceph Monitor 涉及从存储集群中移除 ceph-mon 守护进程,并更新存储集群映射。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 具有对监控节点的 root 访问权限。

步骤

  1. 停止 monitor 服务:

    Syntax

    systemctl stop ceph-mon@$MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# systemctl stop ceph-mon@node3
    Copy to Clipboard Toggle word wrap

  2. 从存储集群中移除该监控器:

    Syntax

    ceph mon remove $MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph mon remove node3
    Copy to Clipboard Toggle word wrap

  3. 默认情况下,从 Ceph 配置文件中删除 monitor 条目,默认为 /etc/ceph/ceph.conf
  4. 将 Ceph 配置文件重新分发到存储集群中所有剩余的 Ceph 节点:

    Syntax

    scp /etc/ceph/$CLUSTER_NAME.conf $USER_NAME@$TARGET_NODE_NAME:/etc/ceph/
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# scp /etc/ceph/ceph.conf root@$node1:/etc/ceph/
    Copy to Clipboard Toggle word wrap

  5. 仅限容器。禁用监控器服务:

    注意

    仅在使用容器时执行第 5-9 步。

    Syntax

    systemctl disable ceph-mon@$MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# systemctl disable ceph-mon@node3
    Copy to Clipboard Toggle word wrap

  6. 仅限容器。从 systemd 中删除服务:

    [root@monitor ~]# rm /etc/systemd/system/ceph-mon@.service
    Copy to Clipboard Toggle word wrap
  7. 仅限容器。重新载入 systemd Manager 配置:

    [root@monitor ~]# systemctl daemon-reload
    Copy to Clipboard Toggle word wrap
  8. 仅限容器。重置失败 monitor 单元的状态:

    [root@monitor ~]# systemctl reset-failed
    Copy to Clipboard Toggle word wrap
  9. 仅限容器。删除 ceph-mon RPM:

    [root@monitor ~]# docker exec node3 yum remove ceph-mon
    Copy to Clipboard Toggle word wrap
  10. 归档监控器数据:

    Syntax

    mv /var/lib/ceph/mon/$CLUSTER_NAME-$MONITOR_ID /var/lib/ceph/mon/removed-$CLUSTER_NAME-$MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# mv /var/lib/ceph/mon/ceph-node3 /var/lib/ceph/mon/removed-ceph-node3
    Copy to Clipboard Toggle word wrap

  11. 删除监控器数据:

    Syntax

    rm -r /var/lib/ceph/mon/$CLUSTER_NAME-$MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# rm -r /var/lib/ceph/mon/ceph-node3
    Copy to Clipboard Toggle word wrap

1.2.6. 从不健康的存储集群中移除 Ceph Monitor

此流程从不健康的存储集群中移除 ceph-mon 守护进程。具有放置组的不健康存储集群永久不 激活 + clean

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 具有对监控节点的 root 访问权限。
  • 至少一个正在运行的 Ceph Monitor 节点。

步骤

  1. 确定 Surviving monitor 并登录到该节点:

    [root@monitor ~]# ceph mon dump
    [root@monitor ~]# ssh $MONITOR_HOST_NAME
    Copy to Clipboard Toggle word wrap
  2. 停止 ceph-mon 守护进程并提取 monmap 文件的副本:

    Syntax

    systemctl stop ceph-mon@$MONITOR_ID
    ceph-mon -i $MONITOR_ID --extract-monmap $TEMPORARY_PATH
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# systemctl stop ceph-mon@node1
    [root@monitor ~]# ceph-mon -i node1 --extract-monmap /tmp/monmap
    Copy to Clipboard Toggle word wrap

  3. 删除非演示监控器:

    Syntax

    monmaptool $TEMPORARY_PATH --rm $MONITOR_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# monmaptool /tmp/monmap --rm node2
    Copy to Clipboard Toggle word wrap

  4. 将 Surviving monitor map 以及 remove monitor(s)注入到 Surviving monitor 中:

    Syntax

    ceph-mon -i $MONITOR_ID --inject-monmap $TEMPORARY_PATH
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph-mon -i node1 --inject-monmap /tmp/monmap
    Copy to Clipboard Toggle word wrap

1.3. Ceph OSD

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

Ceph OSD 通常包含一个 ceph-osd 守护进程,用于一个存储驱动器及其在一个节点中的相关日志。如果节点有多个存储驱动器,则为每个驱动器映射一个 ceph-osd 守护进程。

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

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

重要

不要让存储集群在添加 OSD 前达到 比率。在存储集群达到 接近的全满比率 后发生的 OSD 失败可能会导致存储集群超过 比率。Ceph 会阻止写入访问权限来保护数据,直到解决存储容量问题。在不考虑首先对 比率的影响的情况下,不要移除 OSD。

1.3.1. Ceph OSD 节点配置

Ceph OSD 及其支持硬件应该类似于使用 OSD 的池的存储策略。Ceph 更倾向于在池间统一硬件,以实现一致的性能配置集。为获得最佳性能,请考虑采用相同类型或大小的驱动器的 CRUSH 层次结构。如需了解更多详细信息,请参阅 存储策略指南

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

在进行新的安装前,请参阅《 红帽企业 Linux 或 Ubuntu 安装指南》中的安装 Red Hat Ceph Storage 的要求 章节。

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

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

先决条件

  • 在容器化环境中运行的红帽 Ceph 存储集群。
  • 具有对容器主机的 root 访问权限。

步骤

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

    示例

    [root@ceph3 ~]# docker ps
    CONTAINER ID        IMAGE                                                     COMMAND             CREATED             STATUS              PORTS               NAMES
    3a866f927b74        registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest   "/entrypoint.sh"    About an hour ago   Up About an hour                        ceph-osd-ceph3-sdd
    91f3d4829079        registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest   "/entrypoint.sh"    22 hours ago        Up 22 hours                             ceph-osd-ceph3-sdb
    73dfe4021a49        registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-osd-ceph3-sdf
    90f6d756af39        registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-osd-ceph3-sde
    e66d6e33b306        registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-mgr-ceph3
    733f37aafd23        registry.access.redhat.com/rhceph/rhceph-3-rhel7:latest   "/entrypoint.sh"    7 days ago          Up 7 days                               ceph-mon-ceph3
    Copy to Clipboard Toggle word wrap

  2. 使用 docker exec 对来自上一输出中的任何 OSD 容器名称运行 ceph-volume lvm 列表

    示例

    [root@ceph3 ~]# docker 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
    Copy to Clipboard Toggle word wrap

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

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

注意

新的 Ceph OSD 节点与 OSD 的其余部分相同。

先决条件

步骤

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

    示例

    [osds]
    ...
    osd06
    $NEW_OSD_NODE_NAME
    Copy to Clipboard Toggle word wrap

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

    [user@admin ~]$ ansible all -m ping
    Copy to Clipboard Toggle word wrap
  3. 进入 Ansible 配置目录:

    [user@admin ~]$ cd /usr/share/ceph-ansible
    Copy to Clipboard Toggle word wrap
  4. add-osd.yml 文件复制到 /usr/share/ceph-ansible/ 目录中:

    [user@admin ceph-ansible]$ sudo cp infrastructure-playbooks/add-osd.yml .
    Copy to Clipboard Toggle word wrap
  5. 为 Ceph 的正常或容器化部署运行 Ansible playbook:

    [user@admin ceph-ansible]$ ansible-playbook add-osd.yml
    Copy to Clipboard Toggle word wrap
    注意

    在添加 OSD 时,如果 playbook 与 PG 没有报告为 active+clean,请在 all.yml 文件中配置以下变量来调整重试和延迟:

    # OSD handler checks
    handler_health_osd_check_retries: 50
    handler_health_osd_check_delay: 30
    Copy to Clipboard Toggle word wrap

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

先决条件

步骤

  1. 第一方法

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

      示例

      [osds]
      ...
      osd06
      $NEW_OSD_NODE_NAME
      Copy to Clipboard Toggle word wrap

    2. /etc/ansible/host_vars/ 目录下,为每个新 Ceph OSD 节点创建一个新文件:

      Syntax

      touch /etc/ansible/host_vars/$NEW_OSD_NODE_NAME
      Copy to Clipboard Toggle word wrap

      示例

      [root@admin ~]# touch /etc/ansible/host_vars/osd07
      Copy to Clipboard Toggle word wrap

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

      示例

      devices:
        - /dev/sdc
        - /dev/sdd
        - /dev/sde
        - /dev/sdf
      
      dedicated_devices:
        - /dev/sda
        - /dev/sda
        - /dev/sdb
        - /dev/sdb
      Copy to Clipboard Toggle word wrap

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

      [user@admin ~]$ ansible all -m ping
      Copy to Clipboard Toggle word wrap
    5. 将目录改为 Ansible 配置目录:

      [user@admin ~]$ cd /usr/share/ceph-ansible
      Copy to Clipboard Toggle word wrap
    6. add-osd.yml 文件复制到 /usr/share/ceph-ansible/ 目录中:

      [user@admin ceph-ansible]$ sudo cp infrastructure-playbooks/add-osd.yml .
      Copy to Clipboard Toggle word wrap
    7. 运行 Ansible playbook:

      [user@admin ceph-ansible]$ ansible-playbook add-osd.yml
      Copy to Clipboard Toggle word wrap
  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']"
      Copy to Clipboard Toggle word wrap

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

      [user@admin ~]$ ansible all -m ping
      Copy to Clipboard Toggle word wrap
    3. 将目录改为 Ansible 配置目录:

      [user@admin ~]$ cd /usr/share/ceph-ansible
      Copy to Clipboard Toggle word wrap
    4. add-osd.yml 文件复制到 /usr/share/ceph-ansible/ 目录中:

      [user@admin ceph-ansible]$ sudo cp infrastructure-playbooks/add-osd.yml .
      Copy to Clipboard Toggle word wrap
    5. 运行 Ansible playbook:

      [user@admin ceph-ansible]$ ansible-playbook add-osd.yml
      Copy to Clipboard Toggle word wrap

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

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

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

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

有关使用 ceph-volume 命令的更多信息,请参见《红帽 Ceph 存储管理指南》

注意

对于自定义存储集群名称,在 cephceph-osd 命令中使用 --cluster $CLUSTER_NAME 选项。

先决条件

步骤

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

    Red Hat Enterprise Linux

    [root@osd ~]# subscription-manager repos --enable=rhel-7-server-rhceph-3-osd-els-rpms
    Copy to Clipboard Toggle word wrap

    Ubuntu

    [user@osd ~]$ sudo bash -c 'umask 0077; echo deb https://customername:customerpasswd@rhcs.download.redhat.com/3-updates/Tools $(lsb_release -sc) main | tee /etc/apt/sources.list.d/Tools.list'
    [user@osd ~]$ sudo bash -c 'wget -O - https://www.redhat.com/security/fd431d51.txt | apt-key add -'
    Copy to Clipboard Toggle word wrap

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

    # mkdir /etc/ceph
    Copy to Clipboard Toggle word wrap
  3. 在新 OSD 节点上,从其中一个 Ceph Monitor 节点上复制 Ceph 管理密钥环和配置文件:

    Syntax

    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
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# scp root@node1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
    [root@osd ~]# scp root@node1:/etc/ceph/ceph.conf /etc/ceph/
    Copy to Clipboard Toggle word wrap

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

    Red Hat Enterprise Linux

    [root@osd ~]# yum install ceph-osd
    Copy to Clipboard Toggle word wrap

    Ubuntu

    [user@osd ~]$ sudo apt-get install ceph-osd
    Copy to Clipboard Toggle word wrap

  5. 决定您要并置日志还是将专用日志用于新的 OSD。

    注意

    需要 --filestore 选项。

    1. 对于带有并置日志的 OSD:

      Syntax

      [root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare  --filestore /dev/$DEVICE_NAME
      Copy to Clipboard Toggle word wrap

      示例

      [root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare  --filestore /dev/sda
      Copy to Clipboard Toggle word wrap

    2. 对于带有专用日志的 OSD:

      Syntax

      [root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare  --filestore /dev/$DEVICE_NAME /dev/$JOURNAL_DEVICE_NAME
      Copy to Clipboard Toggle word wrap

      [root@osd ~]# ceph-volume lvm prepare  --filestore --data /dev/$DEVICE_NAME --journal /dev/$JOURNAL_DEVICE_NAME
      Copy to Clipboard Toggle word wrap

      示例

      [root@osd ~]# ceph-disk --setuser ceph --setgroup ceph prepare  --filestore /dev/sda /dev/sdb
      Copy to Clipboard Toggle word wrap

      [root@osd ~]# ceph-volume lvm prepare  --filestore --data /dev/vg00/lvol1 --journal /dev/sdb
      Copy to Clipboard Toggle word wrap
  6. 设置 noup 选项:

    [root@osd ~]# ceph osd set noup
    Copy to Clipboard Toggle word wrap
  7. 激活新的 OSD:

    Syntax

    [root@osd ~]# ceph-disk activate /dev/$DEVICE_NAME
    Copy to Clipboard Toggle word wrap

    [root@osd ~]# ceph-volume lvm activate --filestore $OSD_ID $OSD_FSID
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# ceph-disk activate /dev/sda
    Copy to Clipboard Toggle word wrap

    [root@osd ~]# ceph-volume lvm activate --filestore 0 6cc43680-4f6e-4feb-92ff-9c7ba204120e
    Copy to Clipboard Toggle word wrap
  8. 将 OSD 添加到 CRUSH map:

    Syntax

    ceph osd crush add $OSD_ID $WEIGHT [$BUCKET_TYPE=$BUCKET_NAME ...]
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# ceph osd crush add 4 1 host=node4
    Copy to Clipboard Toggle word wrap

    注意

    如果您指定多个存储桶,该命令将将 OSD 放置到最具体的存储桶中,它将 OSD 移到您指定的其它存储桶中。

    注意

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

    重要

    如果仅指定 root bucket,则 OSD 将直接附加到 root,但 CRUSH 规则期望 OSD 在主机 bucket 内。

  9. 取消设置 noup 选项:

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

    Syntax

    chown -R $OWNER:$GROUP $PATH_TO_DIRECTORY
    Copy to Clipboard Toggle word wrap

    示例

    [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
    Copy to Clipboard Toggle word wrap

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

    Red Hat Enterprise Linux

    [root@osd ~]# echo "CLUSTER=$CLUSTER_NAME" >> /etc/sysconfig/ceph
    Copy to Clipboard Toggle word wrap

    Ubuntu

    [user@osd ~]$ sudo echo "CLUSTER=$CLUSTER_NAME" >> /etc/default/ceph
    Copy to Clipboard Toggle word wrap

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

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

    Syntax

    systemctl enable ceph-osd@$OSD_ID
    systemctl start ceph-osd@$OSD_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# systemctl enable ceph-osd@4
    [root@osd ~]# systemctl start ceph-osd@4
    Copy to Clipboard Toggle word wrap

1.3.6. 使用 Ansible 删除 Ceph OSD

有时,您可能需要缩减 Red Hat Ceph Storage 集群的容量。要使用 Ansible 从 Red Hat Ceph Storage 集群中删除 OSD,并根据使用了哪个 OSD 方案,运行 shrink-osd.ymlshrink-osd-ceph-disk.yml playbook。如果 osd_scenario 设置为 collocatednon-collocated,则使用 shrink-osd-ceph-disk.yml playbook。如果 osd_scenario 设置为 lvm,则使用 shrink-osd.yml playbook。

重要

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

先决条件

  • 正在运行的红帽 Ceph 存储,由 Ansible 部署。
  • 正在运行的 Ansible 管理节点。
  • 对 Ansible 管理节点的根级别访问权限.

步骤

  1. 更改到 /usr/share/ceph-ansible/ 目录。

    [user@admin ~]$ cd /usr/share/ceph-ansible
    Copy to Clipboard Toggle word wrap
  2. 将 Ceph 监控节点上的 /etc/ceph/ 中的 admin 密钥环复制到包含您要删除的 OSD 的节点。
  3. 将适当的 playbook 从 infrastructure-playbooks 目录复制到当前目录。

    [root@admin ceph-ansible]# cp infrastructure-playbooks/shrink-osd.yml .
    Copy to Clipboard Toggle word wrap

    [root@admin ceph-ansible]# cp infrastructure-playbooks/shrink-osd-ceph-disk.yml .
    Copy to Clipboard Toggle word wrap
  4. 对于 裸机或容器部署 请运行适当的 Ansible playbook:

    Syntax

    ansible-playbook shrink-osd.yml -e osd_to_kill=$ID -u $ANSIBLE_USER
    Copy to Clipboard Toggle word wrap

    ansible-playbook shrink-osd-ceph-disk.yml -e osd_to_kill=$ID -u $ANSIBLE_USER
    Copy to Clipboard Toggle word wrap

    替换:

    • 带有 OSD ID 的 $ID。要移除更多 OSD,请用逗号分隔 OSD ID。
    • $ANSIBLE_USER,名称为 Ansible 用户

    示例

    [user@admin ceph-ansible]$ ansible-playbook shrink-osd.yml -e osd_to_kill=1 -u user
    Copy to Clipboard Toggle word wrap

    [user@admin ceph-ansible]$ ansible-playbook shrink-osd-ceph-disk.yml -e osd_to_kill=1 -u user
    Copy to Clipboard Toggle word wrap
  5. 验证 OSD 是否已成功移除:

    [root@mon ~]# ceph osd tree
    Copy to Clipboard Toggle word wrap

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

从存储集群中移除 OSD 涉及更新 cluster map、移除其身份验证密钥、从 OSD map 中删除 OSD,并从 ceph.conf 文件中删除 OSD。如果节点有多个驱动器,您可能需要重复这个过程为每个驱动器删除 OSD。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 有足够的 OSD,以便存储集群没有处于 接近满 比率。
  • 具有对 OSD 节点的 root 访问权限。

步骤

  1. 禁用并停止 OSD 服务:

    Syntax

    systemctl disable ceph-osd@$OSD_ID
    systemctl stop ceph-osd@$OSD_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# systemctl disable ceph-osd@4
    [root@osd ~]# systemctl stop ceph-osd@4
    Copy to Clipboard Toggle word wrap

    OSD 停止后,它 将被关闭

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

    Syntax

    ceph osd out $OSD_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# ceph osd out 4
    Copy to Clipboard Toggle word wrap

    重要

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

    [root@monitor ~]# ceph -w
    Copy to Clipboard Toggle word wrap
  3. 从 CRUSH map 移除 OSD,使其不再接收数据。

    Syntax

    ceph osd crush remove $OSD_NAME
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# ceph osd crush remove osd.4
    Copy to Clipboard Toggle word wrap

    注意

    您还可以解译 CRUSH map,从设备列表中删除 OSD,将设备作为主机存储桶中的项目删除,或者移除主机存储桶。如果它位于 CRUSH map 中,并且计划移除主机,然后重新编译 map 并设置它。详情请参阅 存储策略指南

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

    Syntax

    ceph auth del osd.$OSD_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# ceph auth del osd.4
    Copy to Clipboard Toggle word wrap

  5. 删除 OSD:

    Syntax

    ceph osd rm $OSD_ID
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# ceph osd rm 4
    Copy to Clipboard Toggle word wrap

  6. 编辑存储集群的配置文件(默认为 /etc/ceph/ceph.conf ),并删除 OSD 条目(如果存在):

    示例

    [osd.4]
    host = $HOST_NAME
    Copy to Clipboard Toggle word wrap

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

    Syntax

    scp /etc/ceph/$CLUSTER_NAME.conf $USER_NAME@$HOST_NAME:/etc/ceph/
    Copy to Clipboard Toggle word wrap

    示例

    [root@osd ~]# scp /etc/ceph/ceph.conf root@node4:/etc/ceph/
    Copy to Clipboard Toggle word wrap

1.3.8. 使用命令行界面替换日志

当日志和数据设备位于同一物理设备中时,替换日志的步骤(例如,使用 osd_scenario: 并置 )需要替换整个 OSD。但是,在日志位于数据设备的独立物理设备(例如,使用 osd_scenario: non-collocated )的 OSD 上,您可以替换日志设备。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 新分区或存储设备。

步骤

  1. 将集群设置为 noout 以防止回填:

    [root@osd1 ~]# ceph osd set noout
    Copy to Clipboard Toggle word wrap
  2. 停止将更改日志的 OSD:

    [root@osd1 ~]# systemctl stop ceph-osd@$OSD_ID
    Copy to Clipboard Toggle word wrap
  3. 清除 OSD 上的日志:

    [root@osd1 ~]# ceph-osd -i $OSD_ID --flush-journal
    Copy to Clipboard Toggle word wrap
  4. 删除旧的日志分区以防止分区 UUID 与新分区冲突:

    sgdisk --delete=$OLD_PART_NUM -- $OLD_DEV_PATH
    Copy to Clipboard Toggle word wrap
    替换
    • $OLD_PART_NUM,分区号为旧日志设备。
    • $OLD_DEV_PATH 带有到旧日志设备的路径。

    示例

    [root@osd1 ~]# sgdisk --delete=1 -- /dev/sda
    Copy to Clipboard Toggle word wrap

  5. 在新设备上创建新日志分区。这个 sgdisk 命令会自动使用下一个可用的分区号:

    sgdisk --new=0:0:$JOURNAL_SIZE -- $NEW_DEV_PATH
    Copy to Clipboard Toggle word wrap
    替换
    • $JOURNAL_SIZE 带有适合环境的日志大小,如 10240M
    • NEW_DEV_PATH,其路径指向用于新日志的设备的路径。
    注意

    日志的最小大小为 5 GB。通常不需要 10 GB 的值。如需更多详细信息,请联系红帽支持

    示例

    [root@osd1 ~]# sgdisk --new=0:0:10240M -- /dev/sda
    Copy to Clipboard Toggle word wrap

  6. 在新分区中设置正确的参数:

    sgdisk --change-name=0:"ceph journal" --partition-guid=0:$OLD_PART_UUID --typecode=0:45b0969e-9b03-4f30-b4c6-b4b80ceff106 --mbrtogpt -- $NEW_DEV_PATH
    Copy to Clipboard Toggle word wrap
    替换
    • $OLD_PART_UUID 带有相关 OSD 的 journal_uuid 文件中的 UUID。例如,对于 OSD 0, 使用 /var/lib/ceph/osd/ceph-0/journal_uuid 中的 UUID。
    • NEW_DEV_PATH,其路径指向用于新日志的设备的路径。

    示例

    [root@osd1 ~]# sgdisk --change-name=0:"ceph journal" --partition-guid=0:a1279726-a32d-4101-880d-e8573bb11c16 --typecode=0:097c058d-0758-4199-a787-ce9bacb13f48 --mbrtogpt -- /dev/sda
    Copy to Clipboard Toggle word wrap

    运行上述 sgdisk 命令后,新日志分区已准备好用于 Ceph,并且可以在其上创建日志。

    重要

    由于 sgdisk 的限制导致无法正确创建分区,所以无法将此命令与分区创建结合使用。

  7. 创建新日志:

    [root@osd1 ~]# ceph-osd -i $OSD_ID --mkjournal
    Copy to Clipboard Toggle word wrap
  8. 启动 OSD:

    [root@osd1 ~]# systemctl start ceph-osd@$OSD_ID
    Copy to Clipboard Toggle word wrap
  1. 删除 OSD 上的 noout 标志:

    [root@osd1 ~]# ceph osd unset noout
    Copy to Clipboard Toggle word wrap
  2. 确认日志与正确的设备关联:

    [root@osd1 ~]# ceph-disk list
    Copy to Clipboard Toggle word wrap

1.3.9. 观察数据迁移

当您向 CRUSH map 添加或删除 OSD 时,Ceph 将放置组迁移到新的或现有 OSD 来重新平衡数据。

先决条件

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

步骤

  1. 观察数据迁移:

    [root@monitor ~]# ceph -w
    Copy to Clipboard Toggle word wrap
  2. 观察放置组状态从 active+clean 更改为 active,一些降级对象,最后在迁移完成时为 active+clean
  3. 要退出实用程序,请按 Ctrl + C

1.4. 重新计算放置组

放置组(PG)定义将任何池数据分散到可用的 OSD 中。PG 基于给定的冗余算法构建。对于三向复制,冗余定义为使用三个不同的 OSD。对于纠删代码池,要使用的 OSD 数量由块的数量来定义。

在定义池时,放置组的数量定义了粒度率,数据将分散到所有可用 OSD 中。容量负载的比例越大,数量越好。但是,由于处理放置组在重建数据时也很重要,因此必须仔细选择前期的数量。支持计算工具可用于生成敏捷环境。

在存储集群生命周期中,池可能会超出最初预期的限制。建议使用重新计算的驱动器数量增加。每个 OSD 的放置组数量应该大约 100。当添加更多 OSD 到存储集群时,每个 OSD 的 PG 数量会随时间降低。从存储集群中最初使用 120 个驱动器,并将池的 pg_num 设置为 4000 后,每个 OSD 的 PG 中将最终达到 100 个 PG,以三个的复制因素来计算。随着时间的推移,当到 OSD 数量达到十倍时,每个 OSD 的 PG 数量只会变为十倍。因为每个 OSD 的小数量的 PG 将倾向于非均匀分布式容量,所以请考虑调整每个池的 PG。

可以在线调整放置组的数量。重新计算不是 PG 号的重新计算,还将涉及数据重新定位,这将是一个冗长的过程。但是,数据可用性将随时维护。

应避免使用非常高的 PG 数量,因为在故障 OSD 上重建所有 PG 将一次性开始。需要进行大量 IOPS 才能及时进行重建,而这可能无法使用。这会导致深度 I/O 队列和延迟导致存储集群不可用,或会导致长时间修复。

其它资源

  • 请参阅 PG 计算器,以计算给定用例的值。
  • 如需更多信息,请参阅 Red Hat Ceph Storage 策略指南中的 Erasure Code Pools 一章。

1.5. 使用 Ceph Manager 负载均衡器模块

该负载平衡器是 Ceph Manager 的模块,它可在 OSD 之间优化放置组或 PG 的放置,从而实现均衡分配,可自动或处于受监管的方式。

先决条件

  • 正在运行的 Red Hat Ceph Storage 集群

启动负载均衡器

  1. 确保启用了 balancer 模块:

    [root@mon ~]# ceph mgr module enable balancer
    Copy to Clipboard Toggle word wrap
  2. 打开 balancer 模块:

    [root@mon ~]# ceph balancer on
    Copy to Clipboard Toggle word wrap

模式

目前有两种支持的负载均衡器模式:

  • CRUSH-compat:CRUSH compat 模式使用 Ceph Luminous 中引入的 compat weight-set 功能来管理 CRUSH 层次结构中设备的一组替代权重。普通的权重应保留为设备大小,以反映您要保存在该设备中的数据的目标数量。然后,负载均衡器会优化 weight-set 值,以小增量或向下调整,以便尽可能实现与目标分布匹配的发行版。由于 PG 放置是伪随机进程,因此放置有自然的差异;通过优化权重,负载平衡器计数器可以自然变化。

    这个模式完全与旧的客户端向后兼容。当 OSDMap 和 CRUSH map 与旧客户端共享时,该负载平衡器将优化的权重作为实际权重。

    此模式的主要限制是,如果层次结构的子树共享任何 OSD,则负载平衡器无法处理具有不同放置规则的多个 CRUSH 层次结构。由于此配置使得在共享 OSD 上管理空间利用率非常困难,因此通常不建议这样做。因此,这个限制通常不是一个问题。

  • upmap:自 Luminous 开始,OSDMap 可以将个别 OSD 的显式映射存储为正常 CRUSH 放置计算之外。这些 upmap 条目提供对 PG 映射的精细控制。此 CRUSH 模式将优化单个 PG 的放置,以实现均衡的分布。在大多数情况下,这种分布是 "perfect",每个 OSD +/-1 PG 上具有平等的 PG 数量,因为它们可能无法均匀划分。

    重要

    使用 upmap 需要所有客户端都在运行 Red Hat Ceph Storage 3.x 或更高版本,以及 Red Hat Enterprise Linux 7.5 或更高版本。

    要允许使用这个功能,您必须告诉集群,只需要通过以下方法支持 luminous 或更高的客户端:

    [root@admin ~]# ceph osd set-require-min-compat-client luminous
    Copy to Clipboard Toggle word wrap

    如果任何 pre-luminous 客户端或守护进程连接到监控器,此命令将失败。

    由于一个已知问题,内核 CephFS 客户端会报告自己为 jewel 客户端。要临时解决这个问题,请使用 --yes-i-really-mean-it 标志:

    [root@admin ~]# ceph osd set-require-min-compat-client luminous --yes-i-really-mean-it
    Copy to Clipboard Toggle word wrap

    您可以检查正在使用的客户端版本:

    [root@admin ~]# ceph features
    Copy to Clipboard Toggle word wrap
    警告

    在 Red Hat Ceph Storage 3.x 中,upmap 功能仅支持作为使用 Ceph Manager 的 PG 来平衡 PG。Red Hat Ceph Storage 3.x 不支持使用 upmap 功能手动重新平衡 PG。

默认模式是 crush-compat。可使用以下方法更改模式:

[root@mon ~]# ceph balancer mode upmap
Copy to Clipboard Toggle word wrap

或:

[root@mon ~]# ceph balancer mode crush-compat
Copy to Clipboard Toggle word wrap

状态

可使用以下方法随时检查负载均衡器的当前状态:

[root@mon ~]# ceph balancer status
Copy to Clipboard Toggle word wrap

自动平衡

默认情况下,在打开负载均衡器模块时,会使用自动平衡:

[root@mon ~]# ceph balancer on
Copy to Clipboard Toggle word wrap

可使用以下方法关闭负载均衡器:

[root@mon ~]# ceph balancer off
Copy to Clipboard Toggle word wrap

这将使用 crush-compat 模式,这些模式与旧客户端向后兼容,并且随着时间的推移对数据分发进行小更改,以确保 OSD 平等使用。

节流

如果集群已被降级,例如,如果 OSD 失败且系统还没有修复,则不会对 PG 分发进行修改。

当集群处于健康状态时,负载均衡器会减慢其更改,从而使被误置或需要移动的 PG 的百分比低于 5% 的阈值。这个百分比可以使用 max_misplaced 设置调整。例如,将阈值增加到 7%:

[root@mon ~]# ceph config-key set mgr/balancer/max_misplaced .07
Copy to Clipboard Toggle word wrap

加强优化

负载均衡器操作被分为几个不同的阶段:

  1. 构建 计划
  2. 评估数据分发的质量,可以是当前 PG 发行版,或 执行计划后会导致的 PG 发行版
  3. 执行计划

    • 评估和分数当前的分发:

      [root@mon ~]# ceph balancer eval
      Copy to Clipboard Toggle word wrap
    • 评估单个池的发布:

      [root@mon ~]# ceph balancer eval <pool-name>
      Copy to Clipboard Toggle word wrap
    • 查看更多评估详情:

      [root@mon ~]# ceph balancer eval-verbose ...
      Copy to Clipboard Toggle word wrap
    • 使用当前配置模式生成计划:

      [root@mon ~]# ceph balancer optimize <plan-name>
      Copy to Clipboard Toggle word wrap

      <plan-name> 替换为自定义计划名称。

    • 查看计划的内容:

      [root@mon ~]# ceph balancer show <plan-name>
      Copy to Clipboard Toggle word wrap
    • 丢弃旧计划:

      [root@mon ~]# ceph balancer rm <plan-name>
      Copy to Clipboard Toggle word wrap
    • 要查看当前记录的计划,请使用 status 命令:

      [root@mon ~]# ceph balancer status
      Copy to Clipboard Toggle word wrap
    • 计算执行计划后生成的发布质量:

      [root@mon ~]# ceph balancer eval <plan-name>
      Copy to Clipboard Toggle word wrap
    • 执行计划:

      [root@mon ~]# ceph balancer execute <plan-name>
      Copy to Clipboard Toggle word wrap

      [NOTE]:只有如果 预计要改进分发,则才执行计划。执行后,计划将被丢弃。

1.6. 其它资源

  • 如需更多信息,请参阅 Red Hat Ceph Storage 策略指南中的放置组 (PG) 一章。

第 2 章 处理磁盘失败

作为存储管理员,您必须在存储群集的生命周期内处理磁盘故障。在发生实际故障前,测试和模拟磁盘失败将确保您为实际情况做好准备。

以下是替换故障磁盘的高级别工作流:

  1. 查找失败的 OSD。
  2. 将 OSD 变为 out。
  3. 停止节点上的 OSD 守护进程。
  4. 检查 Ceph 的状态。
  5. 从 CRUSH map 移除 OSD。
  6. 删除 OSD 授权。
  7. 从存储集群中移除 OSD。
  8. 卸载节点上的文件系统。
  9. 替换失败的驱动器。
  10. 将 OSD 重新添加到存储集群。
  11. 检查 Ceph 的状态。

2.1. 先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 失败的磁盘。

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 集群。
  • 失败的磁盘。

步骤

  1. 检查存储集群健康状况:

    # ceph health
    Copy to Clipboard Toggle word wrap
  2. 识别 CRUSH 层次结构中的 OSD 位置:

    # ceph osd tree | grep -i down
    Copy to Clipboard Toggle word wrap
  3. 在 OSD 节点上,尝试启动 OSD:

    # systemctl start ceph-osd@$OSD_ID
    Copy to Clipboard Toggle word wrap

    如果命令表示 OSD 已在运行,则可能存在一个心跳或网络问题。如果无法重启 OSD,则驱动器可能会失败。

    注意

    如果 OSD 已经 停机,则 OSD 最终将标记为 。这是 Ceph Storage 的正常行为。当 OSD 标记为 时,带有故障 OSD 数据副本的其他 OSD 将开始回填,以确保存储集群中存在所需的副本数。在存储集群进行回填时,集群将 处于降级状态

  4. 对于容器化 Ceph 部署,尝试通过引用与 OSD 关联的驱动器来启动 OSD 容器:

    # systemctl start ceph-osd@$OSD_DRIVE
    Copy to Clipboard Toggle word wrap

    如果命令表示 OSD 已在运行,则可能存在一个心跳或网络问题。如果无法重启 OSD,则驱动器可能会失败。

    注意

    与 OSD 关联的驱动器可以通过 将容器 OSD ID 映射到驱动器 来确定。

  5. 检查失败的 OSD 的挂载点:

    注意

    对于容器化部署 Ceph,如果 OSD 停机,容器将停机,并且将卸载 OSD 驱动器,因此您无法运行 df 检查其挂载点。使用另一种方法来确定 OSD 驱动器是否失败。例如,在容器节点的驱动器上运行 smartctl

    # df -h
    Copy to Clipboard Toggle word wrap

    如果无法重启 OSD,您可以检查 挂载点。如果挂载点不再显示,您可以尝试重新挂载 OSD 驱动器并重启 OSD。如果无法恢复挂载点,则可能具有失败的 OSD 驱动器。

    使用 smartctl 实用程序 cab 帮助确定驱动器是否运行正常。例如:

    # yum install smartmontools
    # smartctl -H /dev/$DRIVE
    Copy to Clipboard Toggle word wrap

    如果驱动器失败,则需要替换它。

  6. 停止 OSD 进程:

    # systemctl stop ceph-osd@$OSD_ID
    Copy to Clipboard Toggle word wrap
    1. 如果使用 FileStore,将日志刷新到磁盘:

      # ceph osd -i $$OSD_ID --flush-journal
      Copy to Clipboard Toggle word wrap
  7. 对于容器化 Ceph 部署,通过引用与 OSD 关联的驱动器来停止 OSD 容器:

    # systemctl stop ceph-osd@$OSD_DRIVE
    Copy to Clipboard Toggle word wrap
  8. 从存储集群中移除 OSD:

    # ceph osd out $OSD_ID
    Copy to Clipboard Toggle word wrap
  9. 确保失败的 OSD 是回填:

    # ceph -w
    Copy to Clipboard Toggle word wrap
  10. 从 CRUSH map 移除 OSD:

    # ceph osd crush remove osd.$OSD_ID
    Copy to Clipboard Toggle word wrap
    注意

    只有在您永久删除 OSD 而非重新部署时才需要这一步。

  11. 删除 OSD 的身份验证密钥:

    # ceph auth del osd.$OSD_ID
    Copy to Clipboard Toggle word wrap
  12. 验证 OSD 的密钥没有被列出:

    # ceph auth list
    Copy to Clipboard Toggle word wrap
  13. 从存储集群中移除 OSD:

    # ceph osd rm osd.$OSD_ID
    Copy to Clipboard Toggle word wrap
  14. 卸载故障驱动器路径:

    注意

    对于容器化 Ceph 部署,如果 OSD 停机,容器将停机,并且 OSD 驱动器将被卸载。在这种情况下,不卸载这一步,可以跳过此步骤。

    # umount /var/lib/ceph/osd/$CLUSTER_NAME-$OSD_ID
    Copy to Clipboard Toggle word wrap
  15. 替换物理驱动器。如需节点,请参阅硬件供应商的文档。如果驱动器可热交换,只需将失败的驱动器替换为新驱动器。如果驱动器不热交换,且节点包含多个 OSD,那么 MIGHT 需要让节点更换物理驱动器。如果您需要临时关闭节点,您可以将集群设置为 noout 以防止回填:

    # ceph osd set noout
    Copy to Clipboard Toggle word wrap

    在替换了驱动器并且使节点及其 OSD 重新上线后,请删除 noout 设置:

    # ceph osd unset noout
    Copy to Clipboard Toggle word wrap

    允许 /dev/ 目录下显示新驱动器,并在继续操作前记录驱动器路径。

  16. 查找 OSD 驱动器并格式化磁盘。
  17. 重新创建 OSD:

  18. 检查 CRUSH 层次结构,以确保准确:

    # ceph osd tree
    Copy to Clipboard Toggle word wrap

    如果您对 CRUSH 层次结构中 OSD 的位置不满意,您可能通过 move 命令移动:

    # ceph osd crush move $BUCKET_TO_MOVE $BUCKET_TYPE=$PARENT_BUCKET
    Copy to Clipboard Toggle word wrap
  19. 验证 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 集群。
  • 失败的磁盘。

步骤

  1. 销毁 OSD:

    ceph osd destroy $OSD_ID --yes-i-really-mean-it
    Copy to Clipboard Toggle word wrap

    示例

    $ ceph osd destroy 1 --yes-i-really-mean-it
    Copy to Clipboard Toggle word wrap

  2. 另外,如果之前使用了替换磁盘,则需要 缩小 该磁盘:

    ceph-volume lvm zap $DEVICE
    Copy to Clipboard Toggle word wrap

    示例

    $ ceph-volume lvm zap /dev/sdb
    Copy to Clipboard Toggle word wrap

  3. 使用现有 OSD ID 创建新 OSD:

    ceph-volume lvm create --osd-id $OSD_ID --data $DEVICE
    Copy to Clipboard Toggle word wrap

    示例

    $ ceph-volume lvm create --osd-id 1 --data /dev/sdb
    Copy to Clipboard Toggle word wrap

2.3. 模拟磁盘失败

存在两种磁盘故障方案:硬链接和软。硬故障意味着替换磁盘。软故障可能是设备驱动程序或某些其他软件组件的问题。

如果出现软故障,则可能不需要替换磁盘。如果替换磁盘,则需要遵循步骤来移除失败的磁盘,并将替换磁盘添加到 Ceph。为了模拟软磁盘失败,最好删除该设备。选择一个设备并从系统中删除该设备。

echo 1 > /sys/block/$DEVICE/device/delete
Copy to Clipboard Toggle word wrap

示例

[root@ceph1 ~]# echo 1 > /sys/block/sdb/device/delete
Copy to Clipboard Toggle word wrap

在 Ceph OSD 日志中,OSD 检测到故障并自动启动恢复过程。

示例

[root@ceph1 ~]# tail -50 /var/log/ceph/ceph-osd.1.log
2017-02-02 12:15:27.490889 7f3e1fa3d800 -1 ^[[0;31m ** ERROR: unable to open OSD superblock on /var/lib/ceph/osd/ceph-1: (5) Input/output error^[[0m
2017-02-02 12:34:17.777898 7fb7df1e7800  0 set uid:gid to 167:167 (ceph:ceph)
2017-02-02 12:34:17.777933 7fb7df1e7800  0 ceph version 10.2.3-17.el7cp (ca9d57c0b140eb5cea9de7f7133260271e57490e), process ceph-osd, pid 1752
2017-02-02 12:34:17.788885 7fb7df1e7800  0 pidfile_write: ignore empty --pid-file
2017-02-02 12:34:17.870322 7fb7df1e7800  0 filestore(/var/lib/ceph/osd/ceph-1) backend xfs (magic 0x58465342)
2017-02-02 12:34:17.871028 7fb7df1e7800  0 genericfilestorebackend(/var/lib/ceph/osd/ceph-1) detect_features: FIEMAP ioctl is disabled via 'filestore fiemap' config option
2017-02-02 12:34:17.871035 7fb7df1e7800  0 genericfilestorebackend(/var/lib/ceph/osd/ceph-1) detect_features: SEEK_DATA/SEEK_HOLE is disabled via 'filestore seek data hole' config option
2017-02-02 12:34:17.871059 7fb7df1e7800  0 genericfilestorebackend(/var/lib/ceph/osd/ceph-1) detect_features: splice is supported
2017-02-02 12:34:17.897839 7fb7df1e7800  0 genericfilestorebackend(/var/lib/ceph/osd/ceph-1) detect_features: syncfs(2) syscall fully supported (by glibc and kernel)
2017-02-02 12:34:17.897985 7fb7df1e7800  0 xfsfilestorebackend(/var/lib/ceph/osd/ceph-1) detect_feature: extsize is disabled by conf
2017-02-02 12:34:17.921162 7fb7df1e7800  1 leveldb: Recovering log #22
2017-02-02 12:34:17.947335 7fb7df1e7800  1 leveldb: Level-0 table #24: started
2017-02-02 12:34:18.001952 7fb7df1e7800  1 leveldb: Level-0 table #24: 810464 bytes OK
2017-02-02 12:34:18.044554 7fb7df1e7800  1 leveldb: Delete type=0 #22
2017-02-02 12:34:18.045383 7fb7df1e7800  1 leveldb: Delete type=3 #20
2017-02-02 12:34:18.058061 7fb7df1e7800  0 filestore(/var/lib/ceph/osd/ceph-1) mount: enabling WRITEAHEAD journal mode: checkpoint is not enabled
2017-02-02 12:34:18.105482 7fb7df1e7800  1 journal _open /var/lib/ceph/osd/ceph-1/journal fd 18: 1073741824 bytes, block size 4096 bytes, directio = 1, aio = 1
2017-02-02 12:34:18.130293 7fb7df1e7800  1 journal _open /var/lib/ceph/osd/ceph-1/journal fd 18: 1073741824 bytes, block size 4096 bytes, directio = 1, aio = 1
2017-02-02 12:34:18.130992 7fb7df1e7800  1 filestore(/var/lib/ceph/osd/ceph-1) upgrade
2017-02-02 12:34:18.136547 7fb7df1e7800  0 <cls> cls/cephfs/cls_cephfs.cc:202: loading cephfs_size_scan
2017-02-02 12:34:18.142863 7fb7df1e7800  0 <cls> cls/hello/cls_hello.cc:305: loading cls_hello
2017-02-02 12:34:18.255019 7fb7df1e7800  0 osd.1 51 crush map has features 2200130813952, adjusting msgr requires for clients
2017-02-02 12:34:18.255041 7fb7df1e7800  0 osd.1 51 crush map has features 2200130813952 was 8705, adjusting msgr requires for mons
2017-02-02 12:34:18.255048 7fb7df1e7800  0 osd.1 51 crush map has features 2200130813952, adjusting msgr requires for osds
2017-02-02 12:34:18.296256 7fb7df1e7800  0 osd.1 51 load_pgs
2017-02-02 12:34:18.561604 7fb7df1e7800  0 osd.1 51 load_pgs opened 152 pgs
2017-02-02 12:34:18.561648 7fb7df1e7800  0 osd.1 51 using 0 op queue with priority op cut off at 64.
2017-02-02 12:34:18.562603 7fb7df1e7800 -1 osd.1 51 log_to_monitors {default=true}
2017-02-02 12:34:18.650204 7fb7df1e7800  0 osd.1 51 done with init, starting boot process
2017-02-02 12:34:19.274937 7fb7b78ba700  0 -- 192.168.122.83:6801/1752 >> 192.168.122.81:6801/2620 pipe(0x7fb7ec4d1400 sd=127 :6801 s=0 pgs=0 cs=0 l=0 c=0x7fb7ec42e480).accept connect_seq 0 vs existing 0 state connecting
Copy to Clipboard Toggle word wrap

查看 osd 磁盘树,我们还要看到磁盘脱机。

[root@ceph1 ~]# ceph osd tree
ID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.28976 root default
-2 0.09659     host ceph3
 1 0.09659         osd.1       down 1.00000          1.00000
-3 0.09659     host ceph1
 2 0.09659         osd.2       up  1.00000          1.00000
-4 0.09659     host ceph2
 0 0.09659         osd.0       up  1.00000          1.00000
Copy to Clipboard Toggle word wrap

第 3 章 处理节点故障

作为存储管理员,您可能会遇到整个节点在存储集群中失败的情况,并且处理节点失败与处理磁盘失败类似。在一个节点失败时,不能只从一个磁盘恢复 PG(placement group),而该节点中磁盘上的所有 PG 必须被恢复。Ceph 将检测 OSD 是否都处于停机状态,并自动启动恢复过程,称为自我修复。

有三个节点故障方案。以下是替换节点时每个场景的高级工作流:

  • 替换节点,但使用故障节点中的 root 和 Ceph OSD 磁盘。

    1. 禁用回填。
    2. 替换节点,将磁盘从旧节点获取,并将它们添加到新节点。
    3. 启用回填.
  • 替换节点,重新安装操作系统,以及从故障节点使用 Ceph OSD 磁盘。

    1. 禁用回填。
    2. 创建 Ceph 配置的备份。
    3. 替换节点,并从故障节点中添加 Ceph OSD 磁盘。

      1. 将磁盘配置为 JBOD.
    4. 安装操作系统。
    5. 恢复 Ceph 配置。
    6. 运行 ceph-ansible
    7. 启用回填.
  • 替换节点,重新安装操作系统,使用所有新的 Ceph OSD 磁盘。

    1. 禁用回填。
    2. 从存储集群中移除故障节点上的所有 OSD。
    3. 创建 Ceph 配置的备份。
    4. 替换节点,并从故障节点中添加 Ceph OSD 磁盘。

      1. 将磁盘配置为 JBOD.
    5. 安装操作系统。
    6. 运行 ceph-ansible
    7. 启用回填.

3.1. 先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 出现故障的节点。

3.2. 添加或删除节点前的注意事项

Ceph 的一个未佳的功能是能够在运行时添加或删除 Ceph OSD 节点。这意味着您可以重新定义存储容量大小或更换硬件,而无需关闭存储集群。例如,可以在集群 处于降级状态 的同时为 Ceph 客户端提供服务,例如,您可以在常规工作时间内添加或删除硬件,而不是按时限或周末工作。但是,添加和删除 Ceph OSD 节点可能会对性能有严重影响,而且您必须考虑在操作前考虑添加、删除或替换存储集群中的硬件的性能影响。

从容量角度看,删除节点会删除节点中包含的 OSD,并有效减少存储集群的容量。添加节点添加节点中包含的 OSD,并有效扩展存储集群的容量。无论您是扩展还是减少存储容量,添加或移除 Ceph OSD 节点都将因为集群重新平衡一样减少回填操作。在这种重新平衡时间期间,Ceph 使用其他资源来影响存储集群性能。

想象一个包含各个节点有四个 OSD 的 Ceph 节点的存储集群。在四个节点的存储中,使用 16 个 OSD 来删除节点,并删除 4 个 OSD,并将容量削减了 25%。在具有三个节点的存储中,具有 12 个 OSD,添加节点添加 4 个 OSD,并将容量增加 33%。

在生产用 Ceph 存储集群中,Ceph OSD 节点具有特定的硬件配置,可促进特定类型的存储策略。如需了解更多详细信息,请参阅 Red Hat Ceph Storage 3 的存储策略指南

由于 Ceph OSD 节点是 CRUSH 层次结构的一部分,添加或删除节点的性能通常会影响使用该 CRUSH 层次结构的池性能,即 CRUSH 规则集。

3.3. 性能考虑

在添加或删除 Ceph OSD 节点时,以下因素通常对存储集群的性能有影响:

在受影响的池中载入当前客户端:

Ceph 客户端将负载放在 Ceph 的 I/O 接口上;即,对池的负载。池映射到 CRUSH 规则集。底层 CRUSH 层次结构允许 Ceph 在故障域之间放置数据。如果底层 Ceph OSD 节点在较高的客户端负载中涉及一个池,客户端负载可能会对恢复时间造成重大影响,并影响性能。更具体地说,因为写操作需要数据复制才能实现持久性,写入密集型客户端负载将会增加存储集群恢复的时间。

容量添加或 Removed:

通常,作为整体集群添加或删除的容量会对存储集群进行恢复的影响。此外,您添加或删除的节点的存储密度可能会对恢复时间造成影响。例如,与具有 36 个 OSD 的节点恢复通常要更长的时间,与具有 12 个 OSD 的节点恢复通常要更长的时间。删除节点时,MUST 确保有足够的备用容量,以便不会达到 满比率接近全满比率。如果存储集群达到 全满比率,Ceph 将暂停写操作以防止数据丢失。

池和 CRUSH 规则集:

Ceph OSD 节点映射到至少一个 Ceph CRUSH 层次结构,层次结构则映射到至少一个池。使用 CRUSH 层次结构(ruleset)的每个池,添加或删除 Ceph OSD 节点都会遇到性能影响。

池类型和持久性:

复制池通常使用更多的网络带宽来复制数据的深度副本,而纠删代码池则往往使用更多 CPU 来计算 k+m 编码区块。数据副本数越多,例如大小或更多 k+m 块,存储集群需要更长的时间才能恢复。

吞吐量主要特征:

驱动器、控制器和网络接口卡都有可能影响恢复时间的吞吐量特征。通常,具有更高吞吐量特征的节点,例如,10 Gbps 和 SSD 将比低吞吐量特性的节点更快地恢复,如 1 Gbps 和 SATA 驱动器。

3.4. 添加或删除节点的建议

节点的故障可能会阻止一次移除某一个 OSD,然后再更改节点。在有些情况下,您可以在添加或删除 Ceph OSD 节点时降低对性能造成负面影响,红帽建议在节点间添加或删除一个 OSD,并允许集群在继续下一个 OSD 前进行恢复。有关删除 OSD 的详细信息:

在添加 Ceph 节点时,红帽还建议一次添加一个 OSD。有关添加 OSD 的详情:

在添加或删除 Ceph OSD 节点时,请考虑其他持续进程会对性能造成影响。为了减少对客户端 I/O 的影响,红帽建议以下操作:

计算容量:

在移除 Ceph OSD 节点之前,请确保存储集群能够通过 OUT 回填所有 OSD 的内容,到达 满比率。达到 全满比率 将导致集群拒绝写操作。

临时禁用清理

清理是确保存储集群数据的持久性,但资源密集型是必不可少的。在添加或删除 Ceph OSD 节点前,禁用清理和深度清理,并在继续前让当前的清理操作完成,例如:

ceph osd set noscrub
ceph osd set nodeep-scrub
Copy to Clipboard Toggle word wrap

添加或移除了 Ceph OSD 节点并且存储集群返回到 active+clean 状态后,取消设置 noscrubnodeep-scrub 设置。

限制回填和恢复

如果您具有合理的数据持久性,例如 osd pool default size = 3osd pool default min size = 2,则代表没有遇到 降级状态 的问题。您可以对存储集群进行调优,以达到最快的恢复时间,但这可能会影响 Ceph 客户端 I/O 性能。要保持最高的 Ceph 客户端 I/O 性能,请限制回填和恢复操作,从而使它们需要更长的时间,例如:

osd_max_backfills = 1
osd_recovery_max_active = 1
osd_recovery_op_priority = 1
Copy to Clipboard Toggle word wrap

您还可以设置 sleep 和 delay 参数,如 osd_recovery_sleep

最后,如果您要扩展存储集群的大小,可能需要增加 PG 的数量。如果您确定需要扩展放置组数量,红帽建议在放置组数量上增加增量。通过大量增加放置组的数量会大大降低性能。

3.5. 添加 Ceph OSD 节点

要扩展 Red Hat Ceph Storage 集群的容量,请添加 OSD 节点。

先决条件

步骤

  1. 通过短主机名验证存储集群中的其他节点是否可以访问新节点。
  2. 临时禁用清理:

    [root@monitor ~]# ceph osd set noscrub
    [root@monitor ~]# ceph osd set nodeep-scrub
    Copy to Clipboard Toggle word wrap
  3. 限制回填和恢复功能:

    Syntax

    ceph tell $DAEMON_TYPE.* injectargs --$OPTION_NAME $VALUE [--$OPTION_NAME $VALUE]
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph tell osd.* injectargs --osd-max-backfills 1 --osd-recovery-max-active 1 --osd-recovery-op-priority 1
    Copy to Clipboard Toggle word wrap

  4. 将新节点添加到 CRUSH Map 中:

    Syntax

    ceph osd crush add-bucket $BUCKET_NAME $BUCKET_TYPE
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph osd crush add-bucket node2 host
    Copy to Clipboard Toggle word wrap

  5. 为节点上的每个磁盘添加一个 OSD 到存储集群。

    • 使用 Ansible.
    • 使用命令行界面

      重要

      将 OSD 节点添加到 Red Hat Ceph Storage 集群时,红帽建议在节点内添加一个 OSD,并允许集群恢复到 active+clean 状态,然后再继续执行下一个 OSD。

其它资源

  • 如需了解更多详细信息,请参阅 Red Hat Ceph Storage Configuration Guide 中的 在运行时 设置特定配置设置 部分。
  • 有关将节点放置到 CRUSH 层次结构的适当位置的详细信息,请参阅 Red Hat Ceph Storage 策略指南中的 Add a BucketMove a Bucket 部分。

3.6. 删除 Ceph OSD 节点

要减少存储集群的容量,可移除 OSD 节点。

警告

在移除 Ceph OSD 节点之前,请确保存储集群能够通过OUT 回填所有 OSD 的内容,达到满比率。达到全满比率将导致集群拒绝写操作。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。

步骤

  1. 检查存储集群的容量:

    [root@monitor ~]# ceph df
    [root@monitor ~]# rados df
    [root@monitor ~]# ceph osd df
    Copy to Clipboard Toggle word wrap
  2. 临时禁用清理:

    [root@monitor ~]# ceph osd set noscrub
    [root@monitor ~]# ceph osd set nodeep-scrub
    Copy to Clipboard Toggle word wrap
  3. 限制回填和恢复功能:

    Syntax

    ceph tell $DAEMON_TYPE.* injectargs --$OPTION_NAME $VALUE [--$OPTION_NAME $VALUE]
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph tell osd.* injectargs --osd-max-backfills 1 --osd-recovery-max-active 1 --osd-recovery-op-priority 1
    Copy to Clipboard Toggle word wrap

  4. 从存储集群中移除节点上的每个 OSD:

    • 使用 Ansible.
    • 使用命令行界面

      重要

      从存储集群中移除 OSD 节点时,红帽建议在节点内部删除一个 OSD,并允许集群恢复 active+clean 状态,然后再继续执行下一个 OSD。

      1. 删除 OSD 检查后,验证存储集群是否没有达到将满比率:

        [root@monitor ~]# ceph -s
        [root@monitor ~]# ceph df
        Copy to Clipboard Toggle word wrap
      2. 重复此步骤,直到节点上的所有 OSD 都从存储集群中移除。
  5. 当所有 OSD 被删除后,从 CRUSH map 中删除主机存储桶:

    Syntax

    ceph osd crush rm $BUCKET_NAME
    Copy to Clipboard Toggle word wrap

    示例

    [root@monitor ~]# ceph osd crush rm node2
    Copy to Clipboard Toggle word wrap

其它资源

3.7. 模拟节点故障

为了模拟硬节点故障电源,请关闭节点并重新安装操作系统。

先决条件

  • 正常运行的 Red Hat Ceph Storage 集群。

步骤

  1. 检查存储容量,以了解删除节点对存储集群意味着什么:

    # ceph df
    # rados df
    # ceph osd df
    Copy to Clipboard Toggle word wrap
  2. (可选)禁用恢复和回填:

    # ceph osd set noout
    # ceph osd set noscrub
    # ceph osd set nodeep-scrub
    Copy to Clipboard Toggle word wrap
  3. 关闭节点。
  4. 如果主机名发生更改,请从 CRUSH 映射中删除节点:

    [root@ceph1 ~]# ceph osd crush rm ceph3
    Copy to Clipboard Toggle word wrap
  5. 检查集群的状态:

    [root@ceph1 ~]# ceph -s
    Copy to Clipboard Toggle word wrap
  6. 在节点上重新安装操作系统。
  7. 添加 Ansible 用户和 SSH 密钥:

    [root@ceph3 ~]# useradd ansible
    [root@ceph3 ~]# passwd ansible
    [root@ceph3 ~]# cat << EOF > /etc/sudoers.d/ansible
    ansible ALL = (root) NOPASSWD:ALL
    Defaults:ansible !requiretty
    EOF
    [root@ceph3 ~]# su - ansible
    [ansible@ceph3 ~]# ssh-keygen
    Copy to Clipboard Toggle word wrap
  8. 在管理节点中复制 ansible 用户的 SSH 密钥:

    [ansible@admin ~]$ ssh-copy-id ceph3
    Copy to Clipboard Toggle word wrap
  9. 在管理节点中重新运行 Ansible playbook:

    [ansible@admin ~]$ cd /usr/share/ceph-ansible
    [ansible@admin ~]$ ansible-playbook site.yml
    Copy to Clipboard Toggle word wrap

    输出示例

    PLAY RECAP ********************************************************************
    ceph1                      : ok=368  changed=2    unreachable=0    failed=0
    ceph2                      : ok=284  changed=0    unreachable=0    failed=0
    ceph3                      : ok=284  changed=15   unreachable=0    failed=0
    Copy to Clipboard Toggle word wrap

  10. (可选)启用恢复和回填:

    [root@ceph3 ~]# ceph osd unset noout
    [root@ceph3 ~]# ceph osd unset noscrub
    [root@ceph3 ~]# ceph osd unset nodeep-scrub
    Copy to Clipboard Toggle word wrap
  11. 检查 Ceph 的健康状况:

    [root@ceph3 ~]# ceph -s
        cluster 1e0c9c34-901d-4b46-8001-0d1f93ca5f4d
         health HEALTH_OK
         monmap e1: 3 mons at {ceph1=192.168.122.81:6789/0,ceph2=192.168.122.82:6789/0,ceph3=192.168.122.83:6789/0}
                election epoch 36, quorum 0,1,2 ceph1,ceph2,ceph3
         osdmap e95: 3 osds: 3 up, 3 in
                flags sortbitwise
          pgmap v1190: 152 pgs, 12 pools, 1024 MB data, 441 objects
                3197 MB used, 293 GB / 296 GB avail
                     152 active+clean
    Copy to Clipboard Toggle word wrap

其它资源

第 4 章 处理数据中心失败

红帽 Ceph 存储可能会对基础架构出现灾难性故障,例如在扩展集群中丢失三个数据中心之一。对于标准对象存储用例,可将所有三个数据中心配置独立使用在它们之间进行复制设置。在这种情况下,每个数据中心的集群配置可能会有所不同,反映本地的功能和依赖项。

应考虑放置层次结构的逻辑结构。可以使用正确的 CRUSH map,反映基础架构中故障域的层次结构。使用逻辑层次定义可提高存储集群的可靠性,而不是使用标准的分层定义。故障域在 CRUSH map 中定义。默认的 CRUSH map 包含扁平层次结构中的所有节点。

在三个数据中心环境中,通过扩展集群,节点放置应以一个数据中心停止运行的方式进行管理,但存储集群会继续运行。当为数据使用三向复制时,请考虑节点所在的故障域,在一个数据中心的停机时,可能存在一些数据保留的。当发生这种情况时,有两个选项:

  • 将只读状态的数据保留为标准设置。
  • 在中断期间只有一个副本。

使用标准设置,由于数据在节点间的随机性,并非所有数据都会受到影响,但某些数据可能只有一个副本,而且存储集群将恢复为只读模式。

在下面的示例中,生成的 map 派生自具有 6 个 OSD 节点的集群的初始设置。在本例中,所有节点都只有一个磁盘,因此一个 OSD。所有节点都按照默认的 root 排列,这是层次结构树的标准根。由于这些 OSD 分配到两个 OSD 的权重,这些 OSD 收到比其他 OSD 更少的数据块。这些节点稍后引入,其磁盘比初始 OSD 磁盘大。这不会影响数据放置,以防出现一组节点故障。

标准 CRUSH map

$ sudo ceph osd tree
ID WEIGHT  TYPE NAME           UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.33554 root default
-2 0.04779     host ceph-node3
 0 0.04779         osd.0            up  1.00000          1.00000
-3 0.04779     host ceph-node2
 1 0.04779         osd.1            up  1.00000          1.00000
-4 0.04779     host ceph-node1
 2 0.04779         osd.2            up  1.00000          1.00000
-5 0.04779     host ceph-node4
 3 0.04779         osd.3            up  1.00000          1.00000
-6 0.07219     host ceph-node6
 4 0.07219         osd.4            up  0.79999          1.00000
-7 0.07219     host ceph-node5
 5 0.07219         osd.5            up  0.79999          1.00000
Copy to Clipboard Toggle word wrap

使用逻辑层次定义将节点分组到同一数据中心,以获得数据放置成熟度。可能的定义类型:数据中心机架、行和 主机 允许反映三个数据中心的故障域:

  • 节点 ceph-node1 和 ceph-node2 驻留在数据中心 1(DC1)
  • 节点 ceph-node3 和 ceph-node5 驻留在数据中心 2(DC2)
  • 节点 ceph-node4 和 ceph-node6 驻留在数据中心 3(DC3)中
  • 所有数据中心都属于相同的结构(allDC)

由于主机中的所有 OSD 都属于主机定义,因此无需更改。所有其他分配都可以在存储集群的运行时调整:

  • 使用以下命令 定义存储桶 结构:

    ceph osd crush add-bucket allDC root
    ceph osd crush add-bucket DC1 datacenter
    ceph osd crush add-bucket DC2 datacenter
    ceph osd crush add-bucket DC3 datacenter
    Copy to Clipboard Toggle word wrap
  • 通过修改 CRUSH 映射,将节点移到这个结构中的相应位置:

    ceph osd crush move DC1 root=allDC
    ceph osd crush move DC2 root=allDC
    ceph osd crush move DC3 root=allDC
    ceph osd crush move ceph-node1 datacenter=DC1
    ceph osd crush move ceph-node2 datacenter=DC1
    ceph osd crush move ceph-node3 datacenter=DC2
    ceph osd crush move ceph-node5 datacenter=DC2
    ceph osd crush move ceph-node4 datacenter=DC3
    ceph osd crush move ceph-node6 datacenter=DC3
    Copy to Clipboard Toggle word wrap

在此结构中,也可以添加任何新主机,以及新的磁盘。通过将 OSD 放置到层次结构中的正确位置,CRUSH 算法被更改为将冗余片段放入不同的故障域中。

以上示例会产生以下内容:

$ sudo ceph osd tree
ID  WEIGHT  TYPE NAME               UP/DOWN REWEIGHT PRIMARY-AFFINITY
 -8 6.00000 root allDC
 -9 2.00000     datacenter DC1
 -4 1.00000         host ceph-node1
  2 1.00000             osd.2            up  1.00000          1.00000
 -3 1.00000         host ceph-node2
  1 1.00000             osd.1            up  1.00000          1.00000
-10 2.00000     datacenter DC2
 -2 1.00000         host ceph-node3
  0 1.00000             osd.0            up  1.00000          1.00000
 -7 1.00000         host ceph-node5
  5 1.00000             osd.5            up  0.79999          1.00000
-11 2.00000     datacenter DC3
 -6 1.00000         host ceph-node6
  4 1.00000             osd.4            up  0.79999          1.00000
 -5 1.00000         host ceph-node4
  3 1.00000             osd.3            up  1.00000          1.00000
 -1       0 root default
Copy to Clipboard Toggle word wrap

以上列表通过显示 osd 树来显示生成的 CRUSH map。现在,易于查看是主机如何属于数据中心,所有数据中心都属于同一顶级结构,但可清楚地区分位置。

注意

根据 map 将数据放置到正确的位置,只能在健康的集群中正常工作。当某些 OSD 不可用时,可能会发生 Misplacement。这些错误替换会在可能的情况下自动更正。

其它资源

  • 如需更多信息,请参阅 Red Hat Ceph Storage 策略指南中的 CRUSH 管理 章节。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat