monitor的增删改备

实验目的

主要是为了说明MON的IP和OSD不一样的修改方法,介绍一下monmaptool这个工具,提供了一些常见场景的处理方法,包括增加monitor,机房搬迁需要修改IP,移除某个monitor,备份MON的数据库等。

实验过程

添加一个monitor

由于某个萌新在部署ceph的时候搭建了两个MON,现在想要增加到三个,我们先构建一个有两个MON(ceph-1, ceph-2)的集群,这时候我们把ceph-3添加进来,查看ceph.conf,可见当前集群和配置中都只有两个MON:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ceph-1 cluster]# ceph -s
cluster 844daf70-cdbc-4954-b6c5-f460d25072e0
health HEALTH_OK
monmap e1: 2 mons at {ceph-1=192.168.56.101:6789/0,ceph-2=192.168.56.102:6789/0}
election epoch 4, quorum 0,1 ceph-1,ceph-2
osdmap e13: 3 osds: 3 up, 3 in
pgmap v18: 64 pgs, 1 pools, 0 bytes data, 0 objects
100 MB used, 6125 GB / 6125 GB avail
64 active+clean
[root@ceph-1 cluster]# cat /root/cluster/ceph.conf |grep mon
mon_initial_members = ceph-1, ceph-2
mon_host = 192.168.56.101,192.168.56.102

首先修改配置文件,添加新的MON,注意mon_host段IP和逗号之间不要有空格,然后推送到这两台MON节点:

1
2
3
4
5
[root@ceph-1 cluster]# cat /root/cluster/ceph.conf |grep mon
mon_initial_members = ceph-1, ceph-2, ceph-3
mon_host = 192.168.56.101,192.168.56.102,192.168.56.103
[root@ceph-1 cluster]# ceph-deploy --overwrite-conf config push ceph-1 ceph-2

添加MON,注意如果如果要添加多个MON,需要一个个add

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@ceph-1 cluster]# ceph-deploy --overwrite-conf mon add ceph-3
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
...
[ceph-3][DEBUG ] status for monitor: mon.ceph-3
...
[ceph-3][DEBUG ] "mons": [
[ceph-3][DEBUG ] {
[ceph-3][DEBUG ] "addr": "192.168.56.101:6789/0",
[ceph-3][DEBUG ] "name": "ceph-1",
[ceph-3][DEBUG ] "rank": 0
[ceph-3][DEBUG ] },
[ceph-3][DEBUG ] {
[ceph-3][DEBUG ] "addr": "192.168.56.102:6789/0",
[ceph-3][DEBUG ] "name": "ceph-2",
[ceph-3][DEBUG ] "rank": 1
[ceph-3][DEBUG ] },
[ceph-3][DEBUG ] {
[ceph-3][DEBUG ] "addr": "192.168.56.103:6789/0",
[ceph-3][DEBUG ] "name": "ceph-3",
[ceph-3][DEBUG ] "rank": 2
[ceph-3][DEBUG ] }
[ceph-3][DEBUG ] ]
[ceph-3][DEBUG ] },
...
[ceph-3][INFO ] monitor: mon.ceph-3 is running
[root@ceph-1 cluster]# ceph -s
cluster 844daf70-cdbc-4954-b6c5-f460d25072e0
health HEALTH_OK
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}
election epoch 8, quorum 0,1,2 ceph-1,ceph-2,ceph-3
osdmap e13: 3 osds: 3 up, 3 in
pgmap v20: 64 pgs, 1 pools, 0 bytes data, 0 objects
102340 kB used, 6125 GB / 6125 GB avail
64 active+clean

查看ceph -s可以看到新的MON已经添加进来了。

需要注意的是,如果新增节点ceph-3上之前部署过MON,必须清理干净之前的MON数据库,否则会有异常发生,因为ceph会在创建MON之前检测/var/lib/ceph/mon/$CLUSTER-$HOSTNAME目录下是否有done文件,如果有的话,就不会新建而沿用原来的:

1
2
3
4
5
ps aux|grep ceph-mon |awk '{print $2}'|xargs kill -9
rm -rf /var/run/ceph/*
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/bootstrap-mon/*
rm -rf /etc/ceph/*

删除一个monitor

在上面这个实验的基础上,我们再删除ceph-3这个MON,首先当然是修改部署目录的配置文件,去除ceph-3及其IP,再推送到三个节点:

1
2
3
4
[root@ceph-1 cluster]# cat /root/cluster/ceph.conf |grep mon
mon_initial_members = ceph-1, ceph-2
mon_host = 192.168.56.101,192.168.56.102
[root@ceph-1 cluster]# ceph-deploy --overwrite-conf config push ceph-1 ceph-2 ceph-3

然后通过ceph-deploy移除ceph-3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@ceph-1 cluster]# ceph-deploy mon destroy ceph-3
...
[ceph-3][INFO ] Running command: ceph --cluster=ceph -n mon. -k /var/lib/ceph/mon/ceph-ceph-3/keyring mon remove ceph-3
[ceph-3][WARNIN] removed mon.ceph-3 at 192.168.56.103:6789/0, there are now 2 monitors
[ceph-3][INFO ] polling the daemon to verify it stopped
[ceph-3][INFO ] Running command: service ceph status mon.ceph-3
[ceph-3][INFO ] Running command: mkdir -p /var/lib/ceph/mon-removed
[ceph-3][DEBUG ] move old monitor data
[root@ceph-1 cluster]# ceph -s
cluster 844daf70-cdbc-4954-b6c5-f460d25072e0
health HEALTH_OK
monmap e3: 2 mons at {ceph-1=192.168.56.101:6789/0,ceph-2=192.168.56.102:6789/0}
election epoch 10, quorum 0,1 ceph-1,ceph-2
osdmap e13: 3 osds: 3 up, 3 in
pgmap v20: 64 pgs, 1 pools, 0 bytes data, 0 objects
102340 kB used, 6125 GB / 6125 GB avail
64 active+clean

查看ceph -s,可以发现ceph-3这个MON已经被删除了,这里我列出了删除时的log,有两点提一下:

  • ceph-deploy删除MON的时候调用的指令是ceph mon remove ceph-3同时需要keyring,如果某个时候把cephx设置成了none这个MON的keyring是不会生成的。
  • 删除的MON的文件夹被移到了/var/lib/ceph/mon-removed,并不是真的删除了,有时候这个文件夹能救ceph一命,暂且记住这一点下文会详述。

修改MON的IP

这是最常见的MON需要改动的场景了,某天机房搬迁,所有的IP需要平移,OSD的IP只需要修改配置文件里面的cluster_network即可,OSD会在启动时动态加载这个IP值,而MON的IP不能仅仅通过修改public_network来实现,并且此时ceph-deploy工具不具备修改IP的功能了,需要手动调用monmaptool这个工具来修改。

实验之前我再多说一句,正常的顺序应该是MON正常运行时导出monmap,然后再修改monmap内的IP,然后注入到各个MON的数据库中,但是忽然有一天:

  • 某同事:我们已经把所有主机的IP修改完了,你去把ceph启动下!
  • 我: 一(M)脸(D)懵(Z)逼(Z),咋不跟我事先说下,能不能改回去,我备份点东西。
  • 某同事:这好麻烦啊,我们已经施工完了,你再想想办法?
  • 我:好(he)的(he)。

然后游戏难度从普通升级到了困难,不过也还可以搞定,这里我放弃使用导出monmap的方法而选择新建monmap,因为新建可以解决这里MON修改IP后无法启动提取monmap的问题。

假定,MON的IP从192.168.56.*迁到了172.23.0.*,我们首先创建一个使用新的IP的monmap,这里还是使用了三个MON:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@ceph-1 ~]# cat /etc/ceph/ceph.conf |grep fsid
fsid = 844daf70-cdbc-4954-b6c5-f460d25072e0
[root@ceph-1 ~]# monmaptool -h
usage: [--print] [--create [--clobber][--fsid uuid]] [--generate] [--set-initial-members] [--add name 1.2.3.4:567] [--rm name] <mapfilename>
[root@ceph-1 ~]# monmaptool --create --fsid 844daf70-cdbc-4954-b6c5-f460d25072e0 --add ceph-1 172.23.0.101 --add ceph-2 172.23.0.102 --add ceph-3 172.23.0.103 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: set fsid to 844daf70-cdbc-4954-b6c5-f460d25072e0
monmaptool: writing epoch 0 to /tmp/monmap (3 monitors)
[root@ceph-1 ~]# monmaptool --print /tmp/monmap
monmaptool: monmap file /tmp/monmap
epoch 0
fsid 844daf70-cdbc-4954-b6c5-f460d25072e0
last_changed 2016-10-25 05:03:30.629941
created 2016-10-25 05:03:30.629941
0: 172.23.0.101:6789/0 mon.ceph-1
1: 172.23.0.102:6789/0 mon.ceph-2
2: 172.23.0.103:6789/0 mon.ceph-3

通过打印monmap可以看到已经成功添加了三个MON,只是这里的epoch为0,实际的epoch肯定大于0的,不用担心,monmaptool的代码里面写死了是0,并且不影响注入到MON的数据库里:

1
2
3
4
5
[root@ceph-1 ~]# scp /tmp/monmap ceph-2:/tmp/monmap
[root@ceph-1 ~]# scp /tmp/monmap ceph-3:/tmp/monmap
[root@ceph-1 ~]# ceph-mon -i ceph-1 --inject-monmap /tmp/monmap
[root@ceph-2 ~]# ceph-mon -i ceph-2 --inject-monmap /tmp/monmap
[root@ceph-3 ~]# ceph-mon -i ceph-3 --inject-monmap /tmp/monmap

注意这里是在三个主机上分别注入的,最后修改配置文件,发放到各个节点,开启MON服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@ceph-1 cluster]# vim ceph.conf
[root@ceph-1 cluster]# cat /root/cluster/ceph.conf |grep mon
mon_initial_members = ceph-1,ceph-2,ceph-3
mon_host = 172.23.0.101,172.23.0.102,172.23.0.103
[root@ceph-1 cluster]# ceph-deploy --overwrite-conf config push ceph-1 ceph-2 ceph-3
[root@ceph-1 ~]# service ceph start
[root@ceph-2 ~]# service ceph start
[root@ceph-3 ~]# service ceph start
[root@ceph-1 cluster]# ceph -s
cluster 844daf70-cdbc-4954-b6c5-f460d25072e0
health HEALTH_WARN
clock skew detected on mon.ceph-2, mon.ceph-3
Monitor clock skew detected
monmap e6: 3 mons at {ceph-1=172.23.0.101:6789/0,ceph-2=172.23.0.102:6789/0,ceph-3=172.23.0.103:6789/0}
election epoch 6, quorum 0,1,2 ceph-1,ceph-2,ceph-3
osdmap e30: 3 osds: 3 up, 3 in
pgmap v48: 64 pgs, 1 pools, 0 bytes data, 0 objects
101 MB used, 6125 GB / 6125 GB avail
64 active+clean

这样我们就完成了困难难度的MON的IP迁移,但是:

  • 甲同事: 我把两台MON的服务器给洒水了,开不了机了。
  • 我:我这有辞职信模板,你拿去抄一份。
  • 乙同事:报告!坏了一台MON的服务器,系统盘挂了,开不了机。
  • 我:莫慌,去换个盘,换好告诉我下。
  • 丙同事:我把三个MON的系统盘都给带回来啦!
  • 我:真棒!帮我插到随便一台机器里。

于是就开始了噩梦难度,这时候,我采取的是我自己真实使用过的方法来恢复MON,但是会不会有后遗症我暂且不能保证,至少能保证以上情况都能把所有的MON给恢复过来,并且正常运行。

首先,简单说下恢复的思想,每个MON的数据都是保存在数据库内的,这个数据库位于/var/lib/ceph/mon/$cluster-$hostname/store.db,这里的$cluster是集群的名字,$hostname为主机名,MON的所有数据即目录/var/lib/ceph/mon/$cluster-$hostname/,备份好这个目录之后,就可以在任一主机上恢复MON了,具体步骤如下:

ceph-1/var/lib/ceph/mon/ceph-ceph-1/目录内的所有内容拷贝到新的节点ceph-4/var/lib/ceph/mon/ceph-ceph-4/目录,一定要注意目录的名称!这里ceph-1的IP为172.23.0.101,ceph-4的IP为192.168.56.104ceph-4节点为一干净节点只安装了ceph程序。注意下面指令执行的节点。

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

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

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

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

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

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

这时候,再回来看三个萌萌哒同事的问题处理方法:
- 甲:洒水的那个,有个常识是三个MON挂掉两个集群是不能运行的,这里我们在仅存的一个MON节点新建只包含这个节点的monmap,再注入,修改配置,推送到其他节点,重启OSD。
- 乙:坏了一个MON系统盘的那个,这里我推荐换好盘再将好的节点的数据库拷贝过去,然后再启动MON就好了。
- 丙:方法一样,将任意一个MON的数据拷贝到任意一个节点,然后创建monmap注入。推送config,重启OSD即可。

再次强调下,这只是我实验出来的现象,用于解决一些紧急情况,具体原理还不清楚,只能说是一个土法子。

Monitor的备份

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

大致思路就是这样,我还想说的是,根据我的经验,这个其他路径最好是放到其他节点上,不要保存到本地,因为一般MON节点要坏就坏一台机器。

备份完了数据库有什么用呢,根据上一节的实验,当某个集群的所有的MON节点都挂掉之后,我们可以将最新的备份的数据库解压到任意一个节点上,用同样的方法新建monmap,注入,开启MON,推送config,重启OSD就好了。

另外一个小经验就是,最好把/etc/ceph/目录页备份一下,这样万一出了故障能省很多事,不用关cephx了就。

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

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

如果三个MON的数据库都被损坏了,可以参考磨磨重建MON这篇文章,主要使用新工具ceph-monstore-tool来重建丢失的MON数据库。当然,如果你每天备份一次MON数据库,就不用担心故障了。

实验总结

本文主要给出了操作MON的正确流程,介绍了monmaptool的强大功能,给出了一个恢复MON的土法子。希望大家能事先练习下,不要等真的出了故障再纠结该怎么办。

Enjoy It!