2. Monitor 的备份和恢复


本篇内容来自 徐小胖’blog —— monitor 的增删改备

Monitor 的备份

每个 MON 的数据都是保存在数据库内的,这个数据库位于 /var/lib/ceph/mon/$cluster-$hostname/store.db ,这里的 $cluster 是集群的名字, $hostname 为主机名,MON 的所有数据即目录 /var/lib/ceph/mon/$cluster-$hostname/ ,备份好这个目录之后,就可以在任一主机上恢复 MON 了。

这里参考了下 这篇文章 里面的备份方法,简单讲基本思路就是,停止一个 MON,然后将这个 MON 的数据库压缩保存到其他路径,再开启 MON。文中提到了之所以要停止 MON 是要保证 levelDB 数据库的完整性。然后可以做个定时任务一天或者一周备份一次。

另外最好把 /etc/ceph/ 目录也备份一下。

这个备份路径最好是放到其他节点上,不要保存到本地,因为一般 MON 节点要坏就坏一台机器。

这里给出文中提到的备份方法:

  1. service ceph stop mon
  2. tar czf /var/backups/ceph-mon-backup_$(date +'%a').tar.gz /var/lib/ceph/mon
  3. service ceph start mon
  4. #for safety, copy it to other nodes
  5. scp /var/backups/* someNode:/backup/

Monitor 的恢复

现在有一个 Ceph 集群,包含 3 个 monitors: ceph-1 、ceph-2 和 ceph-3 。

  1. [root@ceph-1 cluster]# ceph -s
  2. cluster 844daf70-cdbc-4954-b6c5-f460d25072e0
  3. health HEALTH_OK
  4. monmap e2: 3 mons at {ceph-1=192.168.56.101:6789/0,ceph-2=192.168.56.102:6789/0,ceph-3=192.168.56.103:6789/0}
  5. election epoch 8, quorum 0,1,2 ceph-1,ceph-2,ceph-3
  6. osdmap e13: 3 osds: 3 up, 3 in
  7. pgmap v20: 64 pgs, 1 pools, 0 bytes data, 0 objects
  8. 101 MB used, 6125 GB / 6125 GB avail
  9. 64 active+clean

假设发生了某种故障,导致这 3 台 MON 节点全都无法启动,这时 Ceph 集群也将变得不可用。我们可以通过前面备份的数据库文件来恢复 MON。当某个集群的所有的 MON 节点都挂掉之后,我们可以将最新的备份的数据库解压到其他任意一个节点上,新建 monmap,注入,启动 MON,推送 config,重启 OSD就好了。

ceph-1/var/lib/ceph/mon/ceph-ceph-1/ 目录的文件拷贝到新节点 ceph-4/var/lib/ceph/mon/ceph-ceph-4/ 目录下(或者从备份路径拷贝到 ceph-4 节点),一定要注意目录的名称!这里 ceph-1 的 IP 为 172.23.0.101ceph-4 的 IP 为 192.168.56.104ceph-4 节点为一个只安装了 ceph 程序的干净节点。注意下面指令执行的节点。

  1. [root@ceph-1 ~]# ip a |grep 172
  2. inet 172.23.0.101/24 brd 172.23.0.255 scope global enp0s8
  3. [root@ceph-1 ~]# ping ceph-4
  4. PING ceph-4 (192.168.56.104) 56(84) bytes of data.
  5. 64 bytes from ceph-4 (192.168.56.104): icmp_seq=1 ttl=63 time=0.463 ms
  6. [root@ceph-4 ~]# mkdir /var/lib/ceph/mon/ceph-ceph-4
  7. [root@ceph-1 ~]# scp -r /var/lib/ceph/mon/ceph-ceph-1/* ceph-4:/var/lib/ceph/mon/ceph-ceph-4/
  8. done 100% 0 0.0KB/s 00:00
  9. keyring 100% 77 0.1KB/s 00:00
  10. LOCK 100% 0 0.0KB/s 00:00
  11. LOG 100% 21KB 20.6KB/s 00:00
  12. 161556.ldb 100% 2098KB 2.1MB/s 00:00
  13. ......
  14. MANIFEST-161585 100% 709 0.7KB/s 00:00
  15. CURRENT 100% 16 0.0KB/s 00:00
  16. sysvinit 100% 0 0.0KB/s 00:00

同时,将 /etc/ceph 目录文件也拷贝到 ceph-4 节点,然后将 ceph.conf 中的 mon_initial_members 修改为 ceph-4

  1. [root@ceph-1 ~]# scp /etc/ceph/* ceph-4:/etc/ceph/
  2. ceph.client.admin.keyring 100% 63 0.1KB/s 00:00
  3. ceph.conf 100% 236 0.2KB/s 00:00
  4. [root@ceph-4 ~]# vim /etc/ceph/ceph.conf
  5. [root@ceph-4 ~]# cat /etc/ceph/ceph.conf
  6. [global]
  7. fsid = 844daf70-cdbc-4954-b6c5-f460d25072e0
  8. mon_initial_members = ceph-4
  9. mon_host = 192.168.56.104

新建一个 monmap,使用原来集群的 fsid,并且将 ceph-4 加入到这个 monmap,然后将 monmap 注入到 ceph-4 的 MON 数据库中,最后启动 ceph-4 上的 MON 进程。

  1. [root@ceph-4 ~]# monmaptool --create --fsid 844daf70-cdbc-4954-b6c5-f460d25072e0 --add ceph-4 192.168.56.104 /tmp/monmap
  2. [root@ceph-4 ~]# ceph-mon -i ceph-4 --inject-monmap /tmp/monmap
  3. [root@ceph-4 ~]# ceph-mon -i ceph-4
  4. [root@ceph-4 ~]# ceph -s
  5. cluster 844daf70-cdbc-4954-b6c5-f460d25072e0
  6. health HEALTH_ERR
  7. 64 pgs are stuck inactive for more than 300 seconds
  8. 64 pgs degraded
  9. 64 pgs stuck inactive
  10. 64 pgs undersized
  11. monmap e6: 1 mons at {ceph-4=192.168.56.104:6789/0}
  12. election epoch 13, quorum 0 ceph-4
  13. osdmap e36: 3 osds: 1 up, 1 in
  14. pgmap v58: 64 pgs, 1 pools, 0 bytes data, 0 objects
  15. 34296 kB used, 2041 GB / 2041 GB avail
  16. 64 undersized+degraded+peered

好消息是,ceph -s 有了正确的输出,坏消息就是 HEALTH_ERR 了。不过不用担心,这时候将 ceph-4ceph.conf 推送到其他所有节点上,再重启 OSD 集群就可以恢复正常了。