移动云计算Ceph集群添加ceph-mon
在 安装 ceph-mon 我们已经安装部署了1个 ceph-mon
。虽然这样也能工作,Ceph monitor可以使用Pasos算法来建立一致性映射以及集群的其他关键信息。但是,对应稳定的集群,需要一个奇数数量的monitor,所以,推荐至少3个 ceph-mon
,为了在出现更多失效能够继续服务,可以部署更多 monitor ,如5个 ceph-mon
。
备注
虽然 ceph-mon
是非常轻量级的监控服务,可以运行在OSD相同的服务器上。但是,对于生产集群,特别是高负载集群,建议将 ceph-mon
和 ceph-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默认目录:
sudo -u ceph mkdir /var/lib/ceph/mon/${CLUSTER}-${HOST}
复制Ceph管理密钥和配置
将
$HOST_1
上 (a-b-data-1
) 管理密钥复制到需要部署ceph-mon
的配置目录下:
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):
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:
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
):
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_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-1
的 monmap
之前,需要先停止 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-mon
的 monmap
,如果只启动 a-b-data-1
而没有启动其他节点的 ceph-mon
,则会发现虽然 a-b-data-1
的 ceph-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的路径,以及从第一个节点复制过来的monmap
和ceph.mon.keyring
文件:
#从第一个节点复制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
) 上执行以下命令启动服务:
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 的配置目录下:
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目录:
#从第一个节点复制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
) 上执行以下命令启动服务:
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 members
和 mon host
行匹配现有状况:
[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-mon
到a-b-data-1
/a-b-data-2
/a-b-data-3
之后,集群就具备了3个监控观察 Ceph Dashboard 管控面板 可以看到启动了3个 mon :
