移动云计算Ceph集群添加ceph-mon

安装 ceph-mon 我们已经安装部署了1个 ceph-mon 。虽然这样也能工作,Ceph monitor可以使用Pasos算法来建立一致性映射以及集群的其他关键信息。但是,对应稳定的集群,需要一个奇数数量的monitor,所以,推荐至少3个 ceph-mon ,为了在出现更多失效能够继续服务,可以部署更多 monitor ,如5个 ceph-mon

备注

虽然 ceph-mon 是非常轻量级的监控服务,可以运行在OSD相同的服务器上。但是,对于生产集群,特别是高负载集群,建议将 ceph-monceph-osd 分开服务器运行。这是因为高负载下,有可能 ceph-osd 压力过大影响 ceph-mon 的稳定性(响应延迟),从而导致系统误判而出现雪崩。

  • 在每个服务器节点上准备环境变量:

在每个服务器节点上准备环境变量
CLUSTER=ceph
FSID=598dc69c-5b43-4a3b-91b8-f36fc403bcc5

HOST=$(hostname -s)
HOST_IP=$(hostname -i)

HOST_1=a-b-data-1
HOST_2=a-b-data-2
HOST_3=a-b-data-3

HOST_1_IP=192.168.8.204
HOST_2_IP=192.168.8.205
HOST_3_IP=192.168.8.206

HOST_NET=192.168.8.0/24

部署monitor

  • 登陆需要部署monitor的服务器,例如,我这里部署到 a-b-data-2 服务器上,执行以下命令创建mon默认目录:

添加 mon 默认目录
sudo -u ceph mkdir /var/lib/ceph/mon/${CLUSTER}-${HOST}

复制Ceph管理密钥和配置

  • $HOST_1 上 ( a-b-data-1 ) 管理密钥复制到需要部署 ceph-mon 的配置目录下:

复制admin.keyring和配置文件
sudo scp ${HOST_1}:/etc/ceph/${CLUSTER}.client.admin.keyring /etc/ceph/
sudo scp ${HOST_1}:/etc/ceph/${CLUSTER}.conf /etc/ceph/

构建Ceph集群monmap

  • ceph-mon 的主机 $HOST_1 ( a-b-data-1 )上执行以下命令获取monitors的keyring(需要读取本机的 /etc/ceph/ceph.client.admin.keyring 认证来获取 ceph-mon 的keyring):

在第一个ceph-mon服务器节点获取monitor的keyring保存到/tmp/ceph.mon.keyring
sudo ceph auth get mon. -o /tmp/${CLUSTER}.mon.keyring

显示输出:

exported keyring for mon.

此时获取到的monitor key存储在 /tmp/ceph.mon.keyring ,这个key文件实际上就是初始服务器 $HOST_1 ( a-b-data-1 ) 在 /var/lib/ceph/mon/${CLUSTER}-${HOST}/keyring ( /var/lib/ceph/mon/ceph-a-b-data-1/keyring )内容。

  • 获取monitor map:

在第一个ceph-mon服务器节点获取monitor的monitor map保存到/tmp/monmap
sudo ceph mon getmap -o /tmp/monmap

提示信息:

got monmap epoch 2

但是需要注意,这里从集群中获得的 monmap 只包含了第一台服务器 $HOST_1 ( a-b-data-1 ) ,我们还需要添加增加的 $HOST_2 ( a-b-data-2 ) 和 $HOST_3 ( a-b-data-3 ):

在第一个ceph-mon服务器节点将另外2个节点的主机配置加入到monitor map中
sudo monmaptool --add ${HOST_2} ${HOST_2_IP} --fsid $FSID /tmp/monmap
sudo monmaptool --add ${HOST_3} ${HOST_3_IP} --fsid $FSID /tmp/monmap

现在我们第一台主机 $HOST_1 ( a-b-data-1 ) 的 /tmp/monmap 是最新最全的monmap,但是我们在 $HOST_1 ( a-b-data-1 ) 上没有添加过节点2和节点3的 monmap ,我们需要把这个 /tmp/monmap 插入到 $HOST_1 ( a-b-data-1 ) 的监控目录中。所以在第一台主机 $HOST_1 ( a-b-data-1 ) 将最新 /tmp/monmap 更新到监控目录:

在第一个ceph-mon服务器节点更新过的monitor map加载到mon目录
# 在第一个CEPH_1节点上执行修订monitor map
sudo systemctl stop ceph-mon@${HOST}
sudo ceph-mon -i ${HOST} --inject-monmap /tmp/monmap
sudo systemctl start ceph-mon@${HOST}

备注

注意,在更新 a-b-data-1monmap 之前,需要先停止 ceph-mon

sudo systemctl stop ceph-mon@a-b-data-1

否则会报错无法拿到db的锁:

2021-12-02T22:37:23.236+0800 7f8227f17540 -1 rocksdb: IO error: While lock file: /var/lib/ceph/mon/ceph-a-b-data-1/store.db/LOCK: Resource temporarily unavailable
2021-12-02T22:37:23.236+0800 7f8227f17540 -1 error opening mon data directory at '/var/lib/ceph/mon/ceph-a-b-data-1': (22) Invalid argument

停止 ceph-mon 之后再执行:

sudo -u ceph ceph-mon -i a-b-data-1 --inject-monmap /tmp/monmap

我发现导入命令应该使用 ceph 用户身份执行,否则会把文件属主设置成root,需要执行 chown -R ceph:ceph /var/lib/ceph/mon/ceph-a-b-data-1 来修复。

就不再报错。等导入更新了 monmap 之后,再次启动服务:

sudo systemctl start ceph-mon@a-b-data-1

警告

当配置了3个 ceph-monmonmap ,如果只启动 a-b-data-1 而没有启动其他节点的 ceph-mon ,则会发现虽然 a-b-data-1ceph-mon 启动 ( systemctl status ceph-mon@a-b-data-1 正常 ),但是 /var/log/ceph/ceph-mon.a-b-data-1.log 日志报错:

2021-12-02T23:02:15.980+0800 7f16d5c02700  1 mon.a-b-data-1@0(probing) e3 handle_auth_request failed to assign global_id
2021-12-02T23:02:16.184+0800 7f16d5c02700  1 mon.a-b-data-1@0(probing) e3 handle_auth_request failed to assign global_id

此时:

ceph -s

无响应

不过,只要再启动 a-b-data-2 上的 ceph-mon@a-b-data-2 ,则立即恢复正常响应。

  • 准备monitor的数据目录,这里必须指定monitor map路径,这样才能够获取监控的quorum信息以及 fsid ,而且还需要提供 monitor keyring的路径,以及从第一个节点复制过来的 monmapceph.mon.keyring 文件:

在第二个ceph-mon服务器节点为该节点创建monitor数据目录
#从第一个节点复制monmap和keyring,不过更好的方法是直接从集群下载获得(已经复制/etc/ceph目录下配置和管理密钥)
#sudo scp ${HOST_1}:/tmp/monmap /tmp/monmap
#sudo scp ${HOST_1}:/tmp/ceph.mon.keyring /tmp/ceph.mon.keyring

#在没有恢复集群所有mon之前,可能无法下载
sudo ceph mon getmap -o /tmp/monmap
sudo ceph auth get mon. -o /tmp/${CLUSTER}.mon.keyring

sudo -u ceph ceph-mon --mkfs -i ${HOST} --monmap /tmp/monmap --keyring /tmp/${CLUSTER}.mon.keyring

备注

仔细对比一下,就可以看出第二个以及今后节点的 ceph-mon 部署方法和 移动云计算Ceph部署ceph-mon 差不多,只是证书是从第一台服务器导入过来不需要重新生成。

  • 在第二个节点 $HOST_2 ( a-b-data-2 ) 上执行以下命令启动服务:

在第二个ceph-mon服务器节点启动ceph-mon服务
sudo systemctl start ceph-mon@${HOST} 
sudo systemctl enable ceph-mon@${HOST}

备注

如果启动失败,可以尝试通过终端执行命令 ceph-mon -f --cluster ceph --id a-b-data-2 --setuser ceph --setgroup ceph 查看终端输出信息。我遇到失败的原因是 /var/lib/ceph/mon/a-b-data-2 目录权限错误,可以根据提示信息检查

部署第三个 ceph-mon 节点

有了上述部署 $HOST_2 ( a-b-data-2 ) 的 ceph-mon 的经验,我们现在来快速完成第三个节点 $HOST_3 ( a-b-data-3 ) 的 ceph-mon 部署

  • $HOST_1 ( a-b-data-1 ) 管理密钥复制到 $HOST_3 ( a-b-data-3 ) 部署 ceph-mon 的配置目录下:

复制admin.keyring和配置文件
sudo scp ${HOST_1}:/etc/ceph/${CLUSTER}.client.admin.keyring /etc/ceph/
sudo scp ${HOST_1}:/etc/ceph/${CLUSTER}.conf /etc/ceph/
  • $HOST_3 ( a-b-data-3 ) 上执行以下命令获取 ceph-mon 的keyring/monmap,并创建mon目录:

在第三个ceph-mon服务器节点为该节点创建monitor数据目录(需要准备集群的keyring和monmap文件)
#从第一个节点复制monmap和keyring,不过更好的方法是直接从集群下载获得(已经复制/etc/ceph目录下配置和管理密钥)
#sudo scp ${HOST_1}:/tmp/monmap /tmp/monmap
#sudo scp ${HOST_1}:/tmp/ceph.mon.keyring /tmp/ceph.mon.keyring

#在没有恢复集群所有mon之前,可能无法下载
sudo ceph mon getmap -o /tmp/monmap
sudo ceph auth get mon. -o /tmp/${CLUSTER}.mon.keyring

sudo -u ceph ceph-mon --mkfs -i ${HOST} --monmap /tmp/monmap --keyring /tmp/${CLUSTER}.mon.keyring
  • 在第三个节点 $HOST_3 ( a-b-data-3 ) 上执行以下命令启动服务:

在第三个ceph-mon服务器节点启动ceph-mon服务
sudo systemctl start ceph-mon@${HOST} 
sudo systemctl enable ceph-mon@${HOST}

调整配置添加新增 ceph-mon 节点

重要步骤

参考 Ceph Monitor Config Reference#Minimum Configuration 修订 /etc/ceph/${CLUSTER}.conf (这里是 /etc/ceph/ceph.conf )

更新 mon initial membersmon host 行匹配现有状况:

/etc/ceph/ceph.conf
[global]
fsid = 598dc69c-5b43-4a3b-91b8-f36fc403bcc5
mon initial members = a-b-data-1
mon host = 192.168.8.204
public network = 192.168.8.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
osd crush chooseleaf type = 1

[mon.a-b-data-1]
host = a-b-data-1
mon addr = 192.168.8.204:6789

[mon.a-b-data-2]
host = a-b-data-2
mon addr = 192.168.8.205:6789

[mon.a-b-data-3]
host = a-b-data-3
mon addr = 192.168.8.206:6789

[mds.a-b-data-1]
host = 192.168.8.204

[mds.a-b-data-2]
host = 192.168.8.205

[mds.a-b-data-3]
host = 192.168.8.206

异常排查

这次部署我遇到问题是虽然能启动第二和第三节点上的 ceph-mon ,但是 ceph -s 却无法正常工作(没有输出),也无法执行调整命令。这个问题困扰了我好几天,一度以为操作步骤错误,不得已 删除Ceph集群 并重新部署Ceph。

不过,最终解决这个问题,是一个低级错误: 排查Ceph部署”monclient(hunting): authenticate timed out” ,哭笑不得…

检查

  • 完成部署 ceph-mona-b-data-1 / a-b-data-2 / a-b-data-3 之后,集群就具备了3个监控

  • 观察 Ceph Dashboard 管控面板 可以看到启动了3个 mon :

../../../_images/ceph-mon_3.png

参考