注意

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

监视器引导程序

术语

  • cluster: 一组监视器

  • quorum: 由集群中多数监视器组成的活动监视器集

为了初始化新的监视器,必须始终向其提供

  1. 一个逻辑名称

  2. 密钥

  3. 一个集群 fsid (uuid)

此外,监视器需要知道两件事

  1. 要绑定的地址

  2. 它的对等节点是谁(如果有)

有多种方法可以完成这两项任务。

逻辑 ID

逻辑 ID 在整个集群中应该是唯一的。它将附加到 mon. 以逻辑上描述 Ceph 集群中的监视器。例如,如果逻辑 ID 是 foo,则监视器的名称将是 mon.foo

对于大多数用户来说,每个主机上只有一个监视器,这使得短主机名成为合理的选择。

密钥

mon. 密钥存储在 mon data 目录中的 keyring 文件中。它可以通过类似以下的命令生成

ceph-authtool --create-keyring /path/to/keyring --gen-key -n mon.

在创建新的监视器集群时,密钥环还应包含一个 client.admin 密钥,可用于管理系统

ceph-authtool /path/to/keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'

生成的密钥环通过 --keyring <keyring> 命令行参数提供给 ceph-mon --mkfs

集群 fsid

集群 fsid 是一个普通的 uuid,与通过 uuidgen 命令生成的 uuid 相同。它可以通过两种方式提供给监视器

  1. 通过 --fsid <uuid> 命令行参数(或配置文件选项)

  2. 通过 monmap,通过 --monmap <path> 命令行参数提供给新监视器。

监视器地址

监视器地址可以通过多种方式提供。

  1. 通过 --public-addr <ip[:port]> 命令行选项(或配置文件选项)

  2. 通过 --public-network <cidr> 命令行选项(或配置文件选项)

  3. 通过通过 --monmap <path> 提供的 monmap,如果它包含具有我们名称的监视器

  4. 通过引导程序 monmap(通过 --inject-monmap <path> 提供或从 --mon-host <list> 生成),如果它包含没有名称(noname-<something>)且在本地主机上配置了地址的监视器。

对等节点

监视器对等节点可以通过多种方式提供

  1. 通过初始 monmap,通过 --monmap <filename> 提供

  2. 通过从 --mon-host <list> 生成的引导程序 monmap

  3. 通过从配置文件中带有已弃用的 mon addr 选项的 [mon.*] 部分生成的引导程序 monmap(请注意,此方法推荐,并且不支持绑定到 v1 和 v2 协议地址)

  4. 通过管理套接字动态提供

但是,由于创建新的监视器集群而不存在竞争条件的复杂性,这些方法不能完全互换。

集群创建

创建集群有三种基本方法

  1. 通过提前指定监视器名称和地址来创建新集群。

  2. 通过提前指定监视器名称来创建新集群,并在 ceph-mon 守护程序配置自身时动态设置地址。

  3. 通过提前指定监视器地址来创建新集群。

名称和地址

使用 monmaptool 生成包含初始监视器名称和地址的 monmap。生成的 monmap 还将包含集群 fsid。将该 monmap 提供给每个监视器守护程序

ceph-mon --mkfs -i <name> --monmap <initial_monmap> --keyring <initial_keyring>

当守护程序启动时,它们将确切知道自己和对等节点是谁。

仅地址

初始监视器地址可以通过 mon host 配置值指定,通过配置文件或命令行参数均可。此方法的优点是集群的单个全局配置文件可以包含如下一行

mon host = a.foo.com, b.foo.com, c.foo.com

并且还将用于通知任何 ceph 客户端或守护程序监视器是谁。

ceph-mon 守护程序将需要提供初始密钥环和集群 fsid 来初始化自身

ceph-mon --mkfs -i <name> --fsid <uuid> --keyring <initial_keyring>

当守护程序首次启动时,它们将相互共享名称并形成新的集群。

仅名称

在动态“云”环境中,集群创建者可能(尚)不知道监视器的地址是什么。相反,他们可能希望机器并行配置和启动自身,并在启动时自行形成新集群。问题是监视器集群依赖严格的多数来保持自身一致,并且为了“创建”新集群,它需要知道初始监视器集是什么。

这可以通过 mon initial members 配置选项来完成,该选项应列出允许创建集群的初始监视器的 ID

mon initial members = foo, bar, baz

然后可以通过提供其他信息(密钥环、集群 fsid 以及确定其自身地址的方法)来初始化监视器。例如

ceph-mon --mkfs -i <name> --mon-initial-hosts 'foo,bar,baz' --keyring <initial_keyring> --public-addr <ip>

当这些守护程序启动时,它们将知道自己的地址,但不知道它们的对等节点。它们可以通过管理套接字了解这些地址

ceph daemon mon.<id> add_bootstrap_peer_hint <peer ip>

一旦它们从初始成员集中了解了足够的对等节点,它们就能够创建集群。

集群扩展

集群扩展的要求略低于创建,因为初始法定人数的创建不是问题,并且不必担心创建独立集群。

可以通过两种方式强制新节点加入现有集群

  1. 不提供初始监视器对等节点地址,并动态提供它们。

  2. 指定 mon initial members 配置选项以防止新节点形成新的独立集群,并通过任何可用方法提供一些现有监视器。

最初没有对等节点的扩展

创建一个新的监视器,除了它自己的地址外,不给它任何对等节点地址。例如

ceph-mon --mkfs -i <myid> --fsid <fsid> --keyring <mon secret key> --public-addr <ip>

守护程序启动后,您可以给它一个或多个对等节点地址(最好是没有任何端口的裸 IP 地址;mon 会为您设置地址类型和端口)以加入

ceph daemon mon.<id> add_bootstrap_peer_hint <peer ip>

或者,您可以显式指定 addrvec_t

ceph daemon mon.<id> add_bootstrap_peer_hintv <peer addrvec>

例如,

ceph daemon mon.new add_bootstrap_peer_hintv v2:1.2.3.4:3300,v1:1.2.3.4:6789

此监视器永远不会参与集群创建;它只能加入现有集群。

请注意,指定的地址必须与新监视器绑定的地址完全匹配。例如,如果新的 mon 仅绑定到 v2 地址,但提供了 v2 和 v1 地址,则监视器中可能会出现一些混淆。

使用初始成员进行扩展

您可以最初向新监视器提供一些对等节点地址,并通过同时设置 mon initial members 来避免出现问题。例如

ceph-mon --mkfs -i <myid> --fsid <fsid> --keyring <mon secret key> --public-addr <ip> --mon-host foo,bar,baz

当守护程序启动时,必须通过命令行或配置文件设置 mon initial members

ceph-mon -i <myid> --mon-initial-members foo,bar,baz

以防止任何脑裂风险。

由 Ceph 基金会为您呈现

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