注意
本文档适用于 Ceph 的开发版本。
监视器引导程序
术语
cluster: 一组监视器quorum: 由集群中多数监视器组成的活动监视器集
为了初始化新的监视器,必须始终向其提供
一个逻辑名称
密钥
一个集群 fsid (uuid)
此外,监视器需要知道两件事
要绑定的地址
它的对等节点是谁(如果有)
有多种方法可以完成这两项任务。
逻辑 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 相同。它可以通过两种方式提供给监视器
通过
--fsid <uuid>命令行参数(或配置文件选项)通过 monmap,通过
--monmap <path>命令行参数提供给新监视器。
监视器地址
监视器地址可以通过多种方式提供。
通过
--public-addr <ip[:port]>命令行选项(或配置文件选项)通过
--public-network <cidr>命令行选项(或配置文件选项)通过通过
--monmap <path>提供的 monmap,如果它包含具有我们名称的监视器通过引导程序 monmap(通过
--inject-monmap <path>提供或从--mon-host <list>生成),如果它包含没有名称(noname-<something>)且在本地主机上配置了地址的监视器。
对等节点
监视器对等节点可以通过多种方式提供
通过初始 monmap,通过
--monmap <filename>提供通过从
--mon-host <list>生成的引导程序 monmap通过从配置文件中带有已弃用的
mon addr选项的[mon.*]部分生成的引导程序 monmap(请注意,此方法不推荐,并且不支持绑定到 v1 和 v2 协议地址)通过管理套接字动态提供
但是,由于创建新的监视器集群而不存在竞争条件的复杂性,这些方法不能完全互换。
集群创建
创建集群有三种基本方法
通过提前指定监视器名称和地址来创建新集群。
通过提前指定监视器名称来创建新集群,并在
ceph-mon守护程序配置自身时动态设置地址。通过提前指定监视器地址来创建新集群。
名称和地址
使用 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>
一旦它们从初始成员集中了解了足够的对等节点,它们就能够创建集群。
集群扩展
集群扩展的要求略低于创建,因为初始法定人数的创建不是问题,并且不必担心创建独立集群。
可以通过两种方式强制新节点加入现有集群
不提供初始监视器对等节点地址,并动态提供它们。
指定
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
以防止任何脑裂风险。