注意

本文档适用于 Ceph 开发版本。

添加/删除监视器

只要保持冗余,就可以向正在运行的集群添加监控器。要引导启动监控器,请参阅手动部署监控器.

添加监控器

Ceph 监控器作为集群地图的单一真实来源。可以仅用一个监控器运行集群,但对于生产集群,建议至少配置并处于多数派状态三个监控器。Ceph 监控器使用 Paxos 算法的变体来维护集群中关于地图和其他关键信息的共识。由于 Paxos 的性质,Ceph 只有在多数监控器的情况下才能维护多数派(从而建立共识)。由于监控器的性质,Ceph 只有在多数监控器的情况下才能维护多数派(从而建立共识)。Paxos algorithm to maintain consensus about maps and about other critical information across the cluster. Due to the nature of Paxos, Ceph is able to maintain quorum (and thus establish consensus) only if a majority of the monitors are active.

最好运行奇数个监控器。这是因为运行奇数个监控器的集群比运行偶数个监控器的集群更具弹性。例如,在双监控器部署中,如果要维护多数派,则不能容忍任何故障;在三监控器部署中,可以容忍一个故障;在四监控器部署中,可以容忍一个故障;在五监控器部署中,可以容忍两个故障。一般来说,运行奇数个监控器的集群最佳,因为它避免了所谓的分裂大脑现象。简而言之,Ceph 只有在多数监控器的情况下才能运行active并且能够相互通信,(例如:必须有一个单独的监控器,两个中的两个监控器,三个中的三个监控器,五个中的三个监控器,或者类似的情况)。

对于小型或多节点 Ceph 集群的非关键部署,建议部署三个监控器。对于更大的集群或打算承受双重故障的集群,建议部署五个监控器。只有在罕见的情况下,才有任何理由部署七个或更多监控器。

可以在同一主机上运行监控器,该主机也在运行 OSD。但是,这种方法有缺点:例如:fsync内核问题可能会降低性能,监控器和 OSD 守护进程可能会同时处于非活动状态,如果节点崩溃、重启或因维护而停机,则可能会造成中断。由于这些风险,建议在专用主机上运行监控器和管理器。

Note

A 大多数您集群中的监控器必须能够相互到达,才能建立多数派。

Deploying your Hardware

一些运维人员选择在添加新监控器的同时添加新的监控器主机。有关监控器硬件的最低建议,请参阅硬件推荐。在将监控器主机添加到集群之前,请确保安装了最新的 Linux 版本。

将新安装的监控器主机添加到集群的机架中,将主机连接到网络,并确保主机具有网络连接。

安装所需的软件

在手动部署的集群中,需要手动安装 Ceph 软件包。详细信息,请参阅安装软件包。配置 SSH,以便它可用于具有无密码认证和 root 权限的用户。

添加监控器(手动)

本节中的程序创建了一个ceph-mon数据目录,检索了监控器地图和监控器密钥环,并将一个ceph-mon守护进程添加到集群中。该程序可能导致一个只包含两个监控器守护进程的 Ceph 集群。要添加更多监控器,直到有足够ceph-mon守护进程来建立多数派,请重复该程序。

这是定义新监控器id的一个好时机。监控器通常用单个字母a, b, c、等命名,但您可以自由地定义id您认为合适的方式。在本文档中,{mon-id}指的是id排除前缀:例如,如果mon. prefix: for example, if mon.a已被选为监控器的id,则{mon-id}a。 ???

  1. 在将要在其中托管新监控器的机器上创建一个数据目录:

    ssh {new-mon-host}
    sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
    
  2. 创建一个临时目录{tmp},它将包含在此过程中需要的文件。此目录应与上一步中创建的数据目录不同。由于这是一个临时目录,因此可以在程序完成后删除它:

    mkdir {tmp}
    
  3. 检索您的监控器密钥环{tmp}是检索到的密钥环的路径,而{key-filename}是包含检索到的监控器密的文件名:

    ceph auth get mon. -o {tmp}/{key-filename}
    
  4. 检索监控器地图{tmp}是检索到的监控器地图的路径,而{map-filename}是包含检索到的监控器地图的文件名:

    ceph mon getmap -o {tmp}/{map-filename}
    
  5. 准备第一步中创建的监控器的数据目录。必须指定以下命令的监控器地图路径(以便检索监控器多数派及其fsid的信息),并指定监控器密钥环的路径:

    sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
    
  6. 启动新的监控器。它将自动加入集群。要向守护进程提供绑定到哪个地址的信息,请使用--public-addr {ip}选项或--public-network {network}选项。例如:

    ceph-mon -i {mon-id} --public-addr {ip:port}
    

删除监控器

当监控器从集群中删除时,重要的是要记住 Ceph 监控器使用 Paxos 来维护关于集群地图的共识。这种共识只有在监控器的数量足以建立多数派时才可能实现。

删除监控器(手动)

本节中的程序从不健康的集群(例如,监控器无法形成多数派的集群)中删除一个ceph-mon守护进程。该程序可能导致一个包含不足以维护多数派的监控器数量的 Ceph 集群,因此请仔细计划。当用新的监控器替换旧的监控器时,先添加新的监控器,等待多数派建立,然后再删除旧的监控器。这确保了多数派不会丢失。

  1. 停止监控器:

    service ceph -a stop mon.{mon-id}
    
  2. 从集群中删除监控器:

    ceph mon remove {mon-id}
    
  3. ceph.conf文件:

从不健康集群中删除监控器的步骤进行操作。

本节中的程序从不健康的集群(例如,监控器无法形成多数派的集群)中删除一个ceph-mon守护进程。

  1. 停止所有ceph-mon守护进程:

    ssh {mon-host}
    systemctl stop ceph-mon.target
    

    在所有监控器主机上重复此步骤。

  2. 确定一个存活的监控器并登录到监控器的主机:

    ssh {mon-host}
    
  3. 运行以下格式的命令来提取monmap文件的一个副本:

    ceph-mon -i {mon-id} --extract-monmap {map-path}
    

    以下是一个更具体的示例。在这个示例中,hostname{mon-id}/tmp/monpap{map-path}:

    ceph-mon -i `hostname` --extract-monmap /tmp/monmap
    
  4. 删除非存活的或有其他问题的监控器:

    monmaptool {map-path} --rm {mon-id}
    

    例如,假设有三个监控器—mon.a, mon.b,并mon.c—并且只有mon.a会存活:

    monmaptool /tmp/monmap --rm b
    monmaptool /tmp/monmap --rm c
    
  5. 将包含已删除监控器的存活的地图注入到存活的监控器

    ceph-mon -i {mon-id} --inject-monmap {map-path}
    

    继续上述示例,将一个地图注入到监控器mon.a:

    ceph-mon -i a --inject-monmap /tmp/monmap
    
  6. 中:

  7. 通过运行命令ceph -s.

  8. 来验证监控器是否形成多数派。/var/lib/ceph/mon:要么将此数据目录存档到安全位置,要么删除此数据目录。但是,除非您确信剩余的监控器是健康的并且冗余足够,否则不要删除它。确保有足够的空间供实时数据库扩展和压缩,并确保还有空间用于存档的数据库副本。存档副本可以压缩。

更改监控器的 IP 地址

重要

现有监控器不应更改其 IP 地址。

监控器是 Ceph 集群的关键组件。只有当监控器维护多数派时,整个系统才能正常工作,而多数派只有在监控器通过其 IP 地址发现彼此时才能建立。Ceph 对监控器的发现有严格的要求。

虽然该ceph.conf文件被 Ceph 客户端和其他 Ceph 守护进程用来发现监控器,监控器地图被监控器用来发现彼此。这就是为什么在创建新监控器时需要获取当前的monmap:如上所述在添加监控器(手动)的情况下升级 MDS(s),monmap中,是ceph-mon -i {mon-id} --mkfs命令所需的参数之一。下一节将解释 Ceph 监控器的连续性要求,并解释一些更改监控器 IP 地址的安全方法。

连续性要求

当监控器在集群中发现其他监控器时,它始终参考本地监控器地图副本。使用监控器地图而不是使用ceph.conf文件可以避免可能破坏集群的错误(例如,ceph.conf中指定监控器地址或端口时的其他轻微错误)。由于监控器使用监控器地图进行发现,并且它们与 Ceph 客户端和其他 Ceph 守护进程共享监控器地图,因此监控器地图为监控器提供了严格的保证,即它们的共识是有效的。

严格的连续性也适用于 monmap 的更新。与监控器上的任何其他更新一样,monmap 的更改始终通过一个分布式共识算法Paxos运行。监控器必须就 monmap 的每个更新达成一致,例如添加或删除监控器,以确保多数派中的每个监控器都具有相同的 monmap 版本。monmap 的更新是增量式的,以便监控器具有最新约定的版本,以及一组以前的版本,允许具有较旧 monmap 版本的监控器赶上集群的当前状态。

与使用监控器地图而不是ceph.conf相比,监控器发现彼此时还有其他优势。因为ceph.conf没有自动更新和分发,使用它将带来一定的风险:监控器可能会使用过时的ceph.conf文件,可能会无法识别特定的监控器,可能会失去多数派,并且可能会出现Paxos无法准确确定系统当前状态的情况。由于这些风险,对现有监控器 IP 地址的任何更改都必须非常小心。

更改监控器 IP 地址(首选方法)

如果监控器的 IP 地址仅在ceph.conf文件中更改,则无法保证集群中的其他监控器会收到更新。为此,更改监控器 IP 地址的首选方法如下:添加具有所需 IP 地址的新监控器(如添加中所述),确保新监控器成功加入多数派,删除使用旧 IP 地址的监控器,并更新ceph.conf文件,以确保客户端和其他守护进程知道新监控器的 IP 地址。

例如,假设有三个监控器:

[mon.a]
    host = host01
    addr = 10.0.0.1:6789
[mon.b]
    host = host02
    addr = 10.0.0.2:6789
[mon.c]
    host = host03
    addr = 10.0.0.3:6789

要更改mon.c以使其名称为host04并其 IP 地址为10.0.0.4:(1) 跟随添加监控器(手动)中的步骤添加新监控器mon.d,(2) 在删除mon.d正在运行,否则多数派将被破坏,(3) 跟随mon.c之前确保删除中的步骤删除mon.c。要将所有三个监控器移动到新的 IP 地址,请重复此过程。

更改监控器 IP 地址(高级方法)

在某些情况下,不能使用更改监控器 IP 地址(首选方法)中概述的方法。例如,可能需要将集群的监控器移动到不同的网络、数据中心的不同部分或完全不同的数据中心。仍然可以更改监控器的 IP 地址,但必须使用不同的方法。

对于这种情况,必须生成一个包含集群中每个监控器更新 IP 地址的新监控器地图,并在每个监控器上注入。虽然这种方法并不容易,但如此重大的迁移不太可能成为常规任务。如本节开头所述,现有监控器不应更改其 IP 地址。

继续在更改监控器 IP 地址(首选方法)中的示例中的监控器配置。假设所有监控器都要从10.0.0.x范围移动到10.1.0.x范围,并且这些网络无法通信。执行以下程序:

  1. 检索监控器地图{tmp}是检索到的监控器地图的路径,而{filename}是包含检索到的监控器地图的文件名:

    ceph mon getmap -o {tmp}/{filename}
    
  2. 检查监控器地图的内容:

    monmaptool --print {tmp}/{filename}
    
    monmaptool: monmap file {tmp}/{filename}
    epoch 1
    fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
    last_changed 2012-12-17 02:46:41.591248
    created 2012-12-17 02:46:41.591248
    0: 10.0.0.1:6789/0 mon.a
    1: 10.0.0.2:6789/0 mon.b
    2: 10.0.0.3:6789/0 mon.c
    
  3. 从监控器地图中删除现有监控器:

    monmaptool --rm a --rm b --rm c {tmp}/{filename}
    
    monmaptool: monmap file {tmp}/{filename}
    monmaptool: removing a
    monmaptool: removing b
    monmaptool: removing c
    monmaptool: writing epoch 1 to {tmp}/{filename} (0 monitors)
    
  4. 将新的监控器位置添加到监控器地图:

    monmaptool --add a 10.1.0.1:6789 --add b 10.1.0.2:6789 --add c 10.1.0.3:6789 {tmp}/{filename}
    
    monmaptool: monmap file {tmp}/{filename}
    monmaptool: writing epoch 1 to {tmp}/{filename} (3 monitors)
    
  5. 检查新的监控器地图内容:

    monmaptool --print {tmp}/{filename}
    
    monmaptool: monmap file {tmp}/{filename}
    epoch 1
    fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
    last_changed 2012-12-17 02:46:41.591248
    created 2012-12-17 02:46:41.591248
    0: 10.1.0.1:6789/0 mon.a
    1: 10.1.0.2:6789/0 mon.b
    2: 10.1.0.3:6789/0 mon.c
    

在此点,我们假设监控器(和存储)已安装在新位置。接下来,传播修改后的监控器地图到新的监控器,并将修改后的监控器地图注入到每个新的监控器。

  1. 确保所有监控器都已停止。在监控器守护进程运行时,切勿向监控器注入。

  2. 注入监控器地图:

    ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
    
  3. 重新启动所有监控器。

现在已经完成了迁移到新位置。监控器应该可以成功运行。

使用 cephadm 更改公共网络

概述

本概述部分中提供的程序仅提供了使用cephadm更改公共网络的大致轮廓。

  1. 创建所有密钥环、配置文件和当前 monmap 的备份。

  2. 停止集群并禁用ceph.target以防止守护进程启动。

  3. 移动服务器并启动它们。

  4. 按照所需更改网络设置。

示例程序

Note

在此程序中,“旧网络”的地址形式为10.10.10.0/24,而“新网络”的地址形式为192.168.160.0/24.

  1. 。进入第一个监控器的 shell:

    cephadm shell --name mon.reef1
    
  2. mon.reef1:

    ceph-mon -i reef1 --extract-monmap monmap
    
  3. 中提取当前 monmap:

    monmaptool --print monmap
    
    monmaptool: monmap file monmap
    epoch 5
    fsid 2851404a-d09a-11ee-9aaa-fa163e2de51a
    last_changed 2024-02-21T09:32:18.292040+0000
    created 2024-02-21T09:18:27.136371+0000
    min_mon_release 18 (reef)
    election_strategy: 1
    0: [v2:10.10.10.11:3300/0,v1:10.10.10.11:6789/0] mon.reef1
    1: [v2:10.10.10.12:3300/0,v1:10.10.10.12:6789/0] mon.reef2
    2: [v2:10.10.10.13:3300/0,v1:10.10.10.13:6789/0] mon.reef3
    
  4. 打印 monmap 的内容:

    monmaptool --rm reef1 --rm reef2 --rm reef3 monmap
    
  5. 删除具有旧地址的监控器:

    monmaptool --addv reef1 [v2:192.168.160.11:3300/0,v1:192.168.160.11:6789/0] --addv reef2 [v2:192.168.160.12:3300/0,v1:192.168.160.12:6789/0] --addv reef3 [v2:192.168.160.13:3300/0,v1:192.168.160.13:6789/0] monmap
    
  6. 添加具有新地址的监控器:

    monmaptool --print monmap
    
    monmaptool: monmap file monmap
    epoch 4
    fsid 2851404a-d09a-11ee-9aaa-fa163e2de51a
    last_changed 2024-02-21T09:32:18.292040+0000
    created 2024-02-21T09:18:27.136371+0000
    min_mon_release 18 (reef)
    election_strategy: 1
    0: [v2:192.168.160.11:3300/0,v1:192.168.160.11:6789/0] mon.reef1
    1: [v2:192.168.160.12:3300/0,v1:192.168.160.12:6789/0] mon.reef2
    2: [v2:192.168.160.13:3300/0,v1:192.168.160.13:6789/0] mon.reef3
    
  7. 验证 monmap 的更改是否已成功完成:

    ceph-mon -i reef1 --inject-monmap monmap
    
  8. 将新的 monmap 注入到 Ceph 集群:

  9. 更新/var/lib/ceph/{FSID}/mon.{MON}/config.

  10. 重新启动监控器。

  11. 更新 cephpublic_network:

    ceph config set mon public_network 192.168.160.0/24
    
  12. 更新管理器的配置文件/var/lib/ceph/{FSID}/mgr.{mgr}/config并重新启动它们。Orchestrator 现在可用,但它将尝试连接到旧网络,因为主机列表包含旧地址。

  13. 通过运行以下形式的命令更新主机地址:

    ceph orch host set-addr reef1 192.168.160.11
    ceph orch host set-addr reef2 192.168.160.12
    ceph orch host set-addr reef3 192.168.160.13
    
  14. 等待几分钟,让 orchestrator 连接到每个主机。

  15. 重新配置 OSD,以便其配置文件自动更新:

    ceph orch reconfig osd
    

上述程序由 Eugen Block 开发,并于 2024 年 2 月在 Ceph 版本 18.2.1 (Reef) 上成功测试。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.