How to change MON IP

2017-06-21 17:12:32

Ceph 客户端和其他 Ceph 守护进程通过 ceph.conf 来发现 monitor。但是 monitor 之间是通过 mon map 而非 ceph.conf 来发现彼此

修改 MON IP (推荐)方法一

仅修改 ceoh.conf 中 mon 的 IP 是不足以确保集群中的其他 monitor 收到更新的。
要修改一个 mon 的 IP,你必须先新增一个使用新 IP 的 monitor,确保这个新 mon 成功加入集群并形成法定人数。
然后,删除使用旧 IP 的 mon。最后,更新 ceph.conf ,以便客户端和其他守护进程可以知道新 mon 的 IP。
比如,假设现有 3 个 monitors:
[mon.node1]
host = node1
addr = 192.168.138.141:6789
[mon.node2]
host = node2
addr = 192.168.138.142:6789
[mon.node3]
host = node3
addr = 192.168.138.143:6789

把 mon.node3 变更为 mon.node4 。增加一个 mon.node4 ,host 设为 node4,IP 地址设为 192.168.138.144。先启动 mon.node4 ,再 删除 mon.node3 ,否则会破坏法定人数。

修改 MON IP 方法二

有时,monitor 需要迁移到一个新的网络中、数据中心的其他位置或另一个数据中心。这时,需要为集群中所有的 monitors 生成一个新的 mon map (指定了新的 MON IP),再注入每一个 monitor 中

还以前面的 mon 配置为例。假定想把 monitor 从 192.168.138.x 网段改为 192.168.139.x 网段,这两个网段直接是不通的。执行下列步骤:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
1、获取 mon map
ceph mon getmap -o {tmp}/{filename}
2、下面的例子说明了 monmap 的内容。
monmaptool --print {tmp}/{filename}
3、删除已有的 monitors
monmaptool --rm a --rm b --rm c {tmp}/{filename}

monmaptool: monmap file {tmp}/{filename}
monmaptool: removing a
monmaptool: removing b
monmaptool: removing c
monmaptool: writing epoch 1 to {tmp}/{filename} (0 monitors)
4、新增 monitor
monmaptool --add node1 192.168.139.141:6789 --add node2 192.168.139.142:6789 --add node3 192.168.139.143:6789 {tmp}/{filename}

monmaptool: monmap file {tmp}/{filename}
monmaptool: writing epoch 1 to {tmp}/{filename} (3 monitors)
5、检查 monmap 的新内容
$ monmaptool --print {tmp}/{filename}
monmaptool: monmap file {tmp}/{filename}

此时,我们假定 monitor 已在新位置安装完毕。下面的步骤就是分发新的 monmap 并注入到各新 monitor 中。
1、停止所有的 monitor 。必须停止 mon 守护进程才能进行 monmap 注入。
2、注入 monmap。
ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
3、重启各 monitors


[root@admin ~]# ceph mon getmap -o /tmp/map
got monmap epoch 5
[root@admin ~]# monmaptool --print /tmp/map
monmaptool: monmap file /tmp/map
epoch 5
fsid d6d92de4-2a08-4bd6-a749-6c104c88fc40
last_changed 2017-06-21 12:59:00.947896
created 2017-05-27 11:43:56.428001
0: 192.168.138.141:6789/0 mon.node1
1: 192.168.138.142:6789/0 mon.node2
2: 192.168.138.143:6789/0 mon.node3
[root@admin ~]# monmaptool --rm node1 --rm node2 --rm node3 /tmp/map
monmaptool: removing node1
monmaptool: removing node2
monmaptool: removing node3
monmaptool: writing epoch 5 to tmp/map (0 monitors)
[root@admin ~]# monmaptool --add node1 192.168.139.141:6789 --add node2 192.168.139.142:6789 --add node3 192.168.139.143:6789 /tmp/map
monmaptool: monmap file /tmp/map
monmaptool: writing epoch 5 to /tmp/map (3 monitors)

[root@admin ~]# monmaptool --print /tmp/map
epoch 5
fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
last_changed 2017-06-21 12:59:00.947896
created 2017-05-27 11:43:56.428001
0: 192.168.139.141:6789/0 mon.node1
1: 192.168.139.142:6789/0 mon.node2
2: 192.168.139.143:6789/0 mon.node3


systemctl stop ceph-mon@node1
systemctl stop ceph-mon@node2
systemctl stop ceph-mon@node3
ceph-mon -i node1 --inject-monmap tmp/map
ceph-mon -i node2 --inject-monmap tmp/map
ceph-mon -i node3 --inject-monmap tmp/map
systemctl restart ceph-mon@node1
systemctl restart ceph-mon@node2
systemctl restart ceph-mon@node3

修改 MON IP 方法三

假如我们在机房迁移时候没有导出monmap,我们如何修改ip呢
这里我放弃使用导出monmap的方法而选择新建monmap,因为新建可以解决这里MON修改IP后无法启动提取monmap的问题。

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

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[root@node1 ~]# cat /etc/ceph/ceph.conf |grep fsid
fsid = d6d92de4-2a08-4bd6-a749-6c104c88fc40
[root@node1 ~]# monmaptool -h
usage: [--print] [--create [--clobber][--fsid uuid]] [--generate] [--set-initial-members] [--add name 1.2.3.4:567] [--rm name] <mapfilename>

[root@node1 ~]# monmaptool --create --fsid d6d92de4-2a08-4bd6-a749-6c104c88fc40 --add node1 172.16.56.141 --add node2 172.16.56.142 --add node3 172.16.56.143 /tmp/monmap
monmaptool: monmap file /tmp/monmap
monmaptool: set fsid to d6d92de4-2a08-4bd6-a749-6c104c88fc40
monmaptool: writing epoch 0 to /tmp/monmap (3 monitors)

[root@ceph-1 ~]# monmaptool --print /tmp/monmap
monmaptool: monmap file /tmp/monmap
epoch 0
fsid d6d92de4-2a08-4bd6-a749-6c104c88fc40
last_changed 2017-06-21 12:59:00.947896
created 2017-05-27 11:43:56.428001
0: 172.16.56.141:6789/0 mon.node1
1: 172.16.56.142:6789/0 mon.node2
2: 172.16.56.143:6789/0 mon.node3

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

[root@node1 ~]# scp /tmp/monmap node2:/tmp/monmap
[root@node1 ~]# scp /tmp/monmap node3:/tmp/monmap
[root@node1 ~]# ceph-mon -i node1 --inject-monmap /tmp/monmap
[root@node2 ~]# ceph-mon -i node2 --inject-monmap /tmp/monmap
[root@node3 ~]# ceph-mon -i node3 --inject-monmap /tmp/monmap

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

[root@node1 cluster]# vim ceph.conf
[root@node1 cluster]# cat /root/cluster/ceph.conf |grep mon
mon_initial_members = node1,node2,node3
mon_host = 172.16.56.141,172.16.56.142,172.16.56.143
[root@node1 cluster]# ceph-deploy --overwrite-conf config push node1 node2 node3
[root@node1 ~]# systemctl start ceph.target
[root@node2 ~]# systemctl start ceph.target
[root@node3 ~]# systemctl start ceph.target
[root@node1 cluster]# ceph -s
cluster d6d92de4-2a08-4bd6-a749-6c104c88fc40
health HEALTH_WARN
clock skew detected on mon.node2, mon.node3
Monitor clock skew detected
monmap e6: 3 mons at {node1=172.16.56.141:6789/0,node2=172.16.56.142:6789/0,node3=172.16.56.143:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
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 IP 方法四

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

Monitor的备份

备份,重要的事情强调三遍.简单讲基本思路就是,停止一个MON,然后将这个MON的数据库压缩保存到其他路径,再开启MON,文中提到了之所以要停止MON是要保证levelDB数据库的完整性.

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

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

ref

monitor的增删改备
修改 MON IP
Systemd script for CEPH object storage


您的鼓励是我写作最大的动力

俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。