CEPH集群MON全部挂掉后恢复方法
2017/11/14 恩松
本文介绍ceph集群中所有mon服务均无法启动或者说mon节点所在服务器os全部无法启动情况下的恢复方法,当然,这种极端情况出现的概率非常低,这里前提是要做好mon节点的配置文件和元数据备份,不然就没办法恢复了。我的环境是使用kolla部署的,恢复方法也都是基于kolla工具下才有效,如果采用物理机部署,具体操作上会有所区别,但大致的思路和原理是一样的。
采用kolla部署,默认的元数据存储路径如下
[root@node01 mon]# cd /var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/
[root@node01 ceph-172.21.196.11]# ls
keyring store.db
将该目录完整备份
[root@node01 ~]# cp -r /var/lib/docker/volumes/ceph_mon/_data/ /root/ceph-mon-bak/
另外还有 配置文件,里面保存了key,默认路径如下:
[root@node01 ~]# cd /etc/kolla/ceph-mon/
[root@node01 ceph-mon]# ls
ceph.client.admin.keyring ceph.client.mon.keyring ceph.client.radosgw.keyring ceph.conf ceph.monmap config.json
同样,将该目录完整备份
[root@node01 ceph-mon]# cp -r /etc/kolla/ceph-mon /root/ceph-mon-bak/
我这里所有的相关进程都是跑在docker里,删除mon服务和数据之前先看下集群的整体状态
[root@node01 kolla]# docker exec -ti ceph_mon /bin/bash
(ceph-mon)[root@node01 /]# ceph -s
cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd
health HEALTH_OK
monmap e4: 2 mons at {172.21.196.11=172.21.196.11:6789/0,172.21.196.12=172.21.196.12:6789/0}
election epoch 44, quorum 0,1 172.21.196.11,172.21.196.12
osdmap e491: 15 osds: 15 up, 15 in
flags sortbitwise,require_jewel_osds
pgmap v679746: 7096 pgs, 25 pools, 184 GB data, 50069 objects
555 GB used, 39643 GB / 40199 GB avail
7096 active+clean
有2个mon节点,15个osd。现在我们将mon数据和容器都删除掉
[root@node01 kolla]# docker rm ceph-mon -f
[root@node01 kolla]# rm -rf /var/lib/docker/volumes/ceph_mon/
[root@node01 kolla]# rm -rf /etc/kolla/ceph-mon/
另外一个节点执行同样的操作。删除完之后,修改kolla的配置文件,执行部署命令,会发现有错误,在ceph创建keyring时中断了,报错信息如下:
TASK [ceph : Fetching Ceph keyrings] *******************************************
fatal: [controller01]: FAILED! => {“failed”: true, “msg”: “The conditional check ‘{{ (ceph_files_json.stdout | from_json).changed }}’ failed. The error was: No JSON object could be decoded”
原因是在我删除容器和配置文件后,kolla生成的相关volume是没有删除的。其还存在于/var/lib/docker/volume下。因此当再次构建kolla时,这些已经存在的volume会阻止ceph_mon的启动,会导致上述错误Ceph keyring无法获取而产生的一些错误。因此 删除掉docker volume ls下的卷。再次部署就能够成功的解决问题。
[root@node02 kolla]# docker volume ls
DRIVER VOLUME NAME
local ceph_mon
local ceph_mon_config
local kolla_logs
local libvirtd
local nova_compute
local nova_libvirt_qemu
local openvswitch_db
[root@node02 kolla]# docker volume rm ceph_mon ceph_mon_config
这时再部署即可成功。这里有2个mon节点,我是一个一个的加入的,添加完一个mon节点后,查看集群状态
(ceph-mon)[root@node02 /]# ceph -s
cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd
health HEALTH_ERR
no osds
monmap e1: 1 mons at {172.21.196.12=172.21.196.12:6789/0}
election epoch 3, quorum 0 172.21.196.12
osdmap e2: 0 osds: 0 up, 0 in
flags sortbitwise,require_jewel_osds
pgmap v3: 320 pgs, 2 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
320 creating
这其实 是一个全新的ceph集群,现在把之前备份的数据拷贝过来,覆盖新的数据
[root@node02 ~]# cp -r ceph-mon-bak/_data/* /var/lib/docker/volumes/ceph_mon/_data/
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/store.db/LOCK’? y
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/store.db/CURRENT’? y
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.12/keyring’? y
[root@node02 ~]# cp -r ceph-mon-bak/ceph-mon/* /etc/kolla/ceph-mon/
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.admin.keyring’? y
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.mon.keyring’? y
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.client.radosgw.keyring’? y
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.conf’? y
cp: overwrite ‘/etc/kolla/ceph-mon/ceph.monmap’? y
cp: overwrite ‘/etc/kolla/ceph-mon/config.json’? y
重启mon服务后,查看集群状态
(ceph-mon)[root@node02 /]# ceph -s
Error connecting to cluster: TimedOut
这里只启动了一个mon节点,整个集群状态还不正常,需要把另外一个mon节点再恢复,整个集群状态才能恢复
恢复第二个节点的配置文件
[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/ceph-mon/* .
cp: overwrite ‘./ceph.client.admin.keyring’? y
cp: overwrite ‘./ceph.client.mon.keyring’? y
cp: overwrite ‘./ceph.client.radosgw.keyring’? y
cp: overwrite ‘./ceph.conf’? y
cp: overwrite ‘./ceph.monmap’? y
cp: overwrite ‘./config.json’? y
[root@node01 ceph-mon]#
[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/_data/
bootstrap-mds/ bootstrap-osd/ bootstrap-rgw/ mds/ mon/ osd/ radosgw/ tmp/
[root@node01 ceph-mon]# cp -r /root/ceph-mon-bak/_data/* /var/lib/docker/volumes/ceph_mon/_data/
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/store.db/LOCK’? y
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/store.db/CURRENT’? y
cp: overwrite ‘/var/lib/docker/volumes/ceph_mon/_data/mon/ceph-172.21.196.11/keyring’? y
再次查看集群状态
[root@node01 ceph-mon]# docker exec -ti ceph_mon bash
(ceph-mon)[root@node01 /]# ceph -s
cluster 84ff3941-2337-40ca-bd76-fb3be71b0fdd
health HEALTH_OK
monmap e4: 2 mons at {172.21.196.11=172.21.196.11:6789/0,172.21.196.12=172.21.196.12:6789/0}
election epoch 44, quorum 0,1 172.21.196.11,172.21.196.12
osdmap e491: 15 osds: 15 up, 15 in
flags sortbitwise,require_jewel_osds
pgmap v679711: 7096 pgs, 25 pools, 184 GB data, 50069 objects
555 GB used, 39643 GB / 40199 GB avail
7096 active+clean