注意

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

添加/删除监视器

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

添加监视器

Ceph 监视器充当集群映射的单一事实来源。可以只运行一个监视器来运行集群,但对于生产集群,建议至少配置三个监视器并使其处于法定人数中。Ceph 监视器使用 Paxos 算法的变体来维护有关集群中映射和其他关键信息的一致性。由于 Paxos 的性质,Ceph 只有在大多数监视器处于 active 状态时才能保持法定人数(并因此建立一致性)。

最好运行奇数个监视器。这是因为运行奇数个监视器的集群比运行偶数个监视器的集群更具弹性。例如,在双监视器部署中,如果要保持法定人数,则无法容忍任何故障;在三监视器部署中,可以容忍一次故障;在四监视器部署中,可以容忍一次故障;在五监视器部署中,可以容忍两次故障。通常,运行奇数个监视器的集群是最好的,因为它避免了所谓的脑裂现象。简而言之,Ceph 只有在大多数监视器处于 active 状态并能够相互通信时才能运行(例如:必须有一个监视器、两个监视器中的两个、三个监视器中的两个、五个监视器中的三个,依此类推)。

对于多节点 Ceph 集群的小型或非关键部署,建议部署三个监视器。对于大型集群或旨在承受双重故障的集群,建议部署五个监视器。只有在极少数情况下,部署七个或更多监视器才有道理。

可以在运行 OSD 的同一主机上运行监视器。但是,这种方法有缺点:例如:内核的 fsync 问题可能会削弱性能,如果节点崩溃、重新启动或因维护而关闭,监视器和 OSD 守护程序可能会同时处于非活动状态并导致中断。由于这些风险,建议在专用主机上运行监视器和管理器。

注意

集群中的大多数监视器必须能够相互访问才能建立法定人数。

部署硬件

一些操作员选择在添加新监视器的同时添加新的监视器主机。有关监视器硬件的最低建议的详细信息,请参阅硬件建议。在将监视器主机添加到集群之前,请确保已安装最新版本的 Linux。

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

安装所需软件

在手动部署的集群中,必须手动安装 Ceph 包。有关详细信息,请参阅安装软件包。配置 SSH,以便具有无密码身份验证和 root 权限的用户可以使用它。

添加监视器(手动)

本节中的过程创建 ceph-mon 数据目录,检索监视器映射和监视器密钥环,并将 ceph-mon 守护程序添加到集群中。该过程可能会导致 Ceph 集群仅包含两个监视器守护程序。要添加更多监视器,直到有足够的 ceph-mon 守护程序来建立法定人数,请重复该过程。

这是一个定义新监视器 id 的好时机。监视器通常用单个字母命名(abc 等),但您可以根据需要自由定义 id。在本文档中,{mon-id} 指的是不带 mon. 前缀的 id:例如,如果选择 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.amon.bmon.c — 并且只有 mon.a 将幸存

    monmaptool /tmp/monmap --rm b
    monmaptool /tmp/monmap --rm c
    
  5. 将包含已删除监视器的幸存映射注入幸存监视器的 monmap 中

    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 客户端和其他 Ceph 守护程序使用 ceph.conf 文件来发现监视器,但监视器使用监视器映射来相互发现。这就是为什么在创建新监视器时需要获取当前 monmap 的原因:如上文 添加监视器(手动) 中所示,monmapceph-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 地址(首选方法)

如果仅在 ceph.conf 文件中更改监视器的 IP 地址,则无法保证集群中的其他监视器会收到更新。因此,更改监视器 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 在删除 mon.c 之前正在运行,否则法定人数将被打破,(3)按照 删除监视器(手动) 中的步骤删除 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. 根据需要更改网络设置。

示例过程

注意

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

  1. 进入第一个监视器的 shell

    cephadm shell --name mon.reef1
    
  2. mon.reef1 中提取当前 monmap

    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. 删除具有旧地址的监视器

    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. 验证对 monmap 的更改是否已成功进行

    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 集群

    ceph-mon -i reef1 --inject-monmap monmap
    
  8. 对集群中的所有其他监视器重复上述步骤。

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

  10. 启动监视器。

  11. 更新 ceph public_network

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

  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. 等待几分钟,让编排器连接到每个主机。

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

    ceph orch reconfig osd
    

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

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入