• 2. Monitor 的备份和恢复
    • Monitor 的备份
    • Monitor 的恢复

    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 集群就可以恢复正常了。