monitor的添加或删除

2017-06-15 19:09:13

一般来说,在实际运行中,ceph monitor的个数是2n+1(n>=0)个,在线上至少3个,只要正常的节点数>=n+1,ceph的paxos算法能保证系统的正常运行。所以,对于3个节点,同时只能挂掉一个。建议(但不是强制)部署奇数个 monitor ,不建议把监视器和 OSD 置于同一主机上,后续如果要增加,请一次增加 2 个

一般来说,同时挂掉2个节点的概率比较小,但是万一挂掉2个呢?
如果ceph的monitor节点超过半数挂掉,paxos算法就无法正常进行仲裁(quorum),此时,ceph集群会阻塞对集群的操作,直到超过半数的monitor节点恢复

  • 如果挂掉的2个节点至少有一个可以恢复,也就是monitor的监控数据还是OK的,那么只需要重启ceph-mon进程即可。所以,对于monitor,最好运行在RAID的机器上。这样,即使机器出现故障,恢复也比较容易
  • 如果挂掉的2个节点的监控数据都损坏了呢?

带着这些疑问,后续几篇文章我们来提供了一些常见场景的处理方法,包括增加monitor,移除某个monitor,机房搬迁需要修改IP,备份MON的数据库等

本文讲一下如何对一个已经存在的ceph storage cluster添加或删除一个监控节点.
用 ceph-deploy 增加和删除监视器很简单,只要一个命令就可以增加或删除一或多个监视器
大致步骤:
1.环境准备
2.安装软件
3.添加节点

添加一个monitor(ceph-deploy )
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
[neo@admin cluster]$ sudo ceph -s
cluster d6d92de4-2a08-4bd6-a749-6c104c88fc40
health HEALTH_OK
monmap e2: 2 mons at {node1=192.168.138.141:6789/0,node2=192.168.138.142:6789/0}
election epoch 62, quorum 0,1 node1,node2
osdmap e246: 9 osds: 9 up, 9 in
flags sortbitwise,require_jewel_osds
pgmap v1167: 256 pgs, 1 pools, 4 bytes data, 1 objects
350 MB used, 18377 GB / 18378 GB avail
256 active+clean
[neo@admin cluster]$ cat ~/cluster/ceph.conf |grep mon
mon_initial_members = node1, node2
mon_host = 192.168.138.141,192.168.138.142

#修改配置文件,添加新的节点
[neo@admin cluster]$ vi ceph.conf
[neo@admin cluster]$ cat ~/cluster/ceph.conf |grep mon
mon_initial_members = node1, node2, node3
mon_host = 192.168.138.141,192.168.138.142,192.168.138.143

[neo@admin cluster]$ ceph-deploy --overwrite-conf config push node1 node2

#添加MON,注意如果如果要添加多个MON,需要一个个add
需要注意,往存在的cluster里添加monitor时,需要修改配置文件ceph.conf在global章节中
指定public network或者mon.nodeX中指定public addr,配置文件中写成代
下划线的public_network =也是可以的

[neo@admin cluster]$ ceph-deploy --overwrite-conf mon add node3
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/neo/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy --overwrite-conf mon add node3
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : True
[ceph_deploy.cli][INFO ] subcommand : add
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x164fc68>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] mon : ['node3']
[ceph_deploy.cli][INFO ] func : <function mon at 0x1647320>
[ceph_deploy.cli][INFO ] address : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.mon][INFO ] ensuring configuration of new mon host: node3
[ceph_deploy.admin][DEBUG ] Pushing admin keys and conf to node3
[node3][DEBUG ] connection detected need for sudo
[node3][DEBUG ] connected to host: node3
[node3][DEBUG ] detect platform information from remote host
[node3][DEBUG ] detect machine type
[node3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.mon][DEBUG ] Adding mon to cluster ceph, host node3
[ceph_deploy.mon][DEBUG ] using mon address by resolving host: 192.168.138.143
[ceph_deploy.mon][DEBUG ] detecting platform for host node3 ...
[node3][DEBUG ] connection detected need for sudo
[node3][DEBUG ] connected to host: node3
[node3][DEBUG ] detect platform information from remote host
[node3][DEBUG ] detect machine type
[node3][DEBUG ] find the location of an executable
[ceph_deploy.mon][INFO ] distro info: CentOS Linux 7.3.1611 Core
[node3][DEBUG ] determining if provided host has same hostname in remote
[node3][DEBUG ] get remote short hostname
[node3][DEBUG ] adding mon to node3
[node3][DEBUG ] get remote short hostname
[node3][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[node3][DEBUG ] create the mon path if it does not exist
[node3][DEBUG ] checking for done path: /var/lib/ceph/mon/ceph-node3/done
[node3][DEBUG ] create a done file to avoid re-doing the mon deployment
[node3][DEBUG ] create the init path if it does not exist
[node3][INFO ] Running command: sudo systemctl enable ceph.target
[node3][INFO ] Running command: sudo systemctl enable ceph-mon@node3
[node3][INFO ] Running command: sudo systemctl start ceph-mon@node3
[node3][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node3.asok mon_status
[node3][WARNIN] monitor node3 does not exist in monmap
[node3][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node3.asok mon_status
[node3][DEBUG ] ********************************************************************************
[node3][DEBUG ] status for monitor: mon.node3
[node3][DEBUG ] {
[node3][DEBUG ] "election_epoch": 0,
[node3][DEBUG ] "extra_probe_peers": [],
[node3][DEBUG ] "monmap": {
[node3][DEBUG ] "created": "2017-05-27 11:43:56.428001",
[node3][DEBUG ] "epoch": 2,
[node3][DEBUG ] "fsid": "d6d92de4-2a08-4bd6-a749-6c104c88fc40",
[node3][DEBUG ] "modified": "2017-06-20 11:52:25.801159",
[node3][DEBUG ] "mons": [
[node3][DEBUG ] {
[node3][DEBUG ] "addr": "192.168.138.141:6789/0",
[node3][DEBUG ] "name": "node1",
[node3][DEBUG ] "rank": 0
[node3][DEBUG ] },
[node3][DEBUG ] {
[node3][DEBUG ] "addr": "192.168.138.142:6789/0",
[node3][DEBUG ] "name": "node2",
[node3][DEBUG ] "rank": 1
[node3][DEBUG ] }
[node3][DEBUG ] ]
[node3][DEBUG ] },
[node3][DEBUG ] "name": "node3",
[node3][DEBUG ] "outside_quorum": [],
[node3][DEBUG ] "quorum": [],
[node3][DEBUG ] "rank": -1,
[node3][DEBUG ] "state": "synchronizing",
[node3][DEBUG ] "sync": {
[node3][DEBUG ] "sync_cookie": 1040187393,
[node3][DEBUG ] "sync_provider": "mon.0 192.168.138.141:6789/0",
[node3][DEBUG ] "sync_start_version": 2944
[node3][DEBUG ] },
[node3][DEBUG ] "sync_provider": []
[node3][DEBUG ] }
[node3][DEBUG ] ********************************************************************************
[node3][INFO ] monitor: mon.node3 is currently at the state of synchronizing

错误1:

1
2
3
4
5
6
7
[node3][ERROR ] admin_socket: exception getting command descriptions: [Errno 2] No such file or directory
[node3][WARNIN] monitor: mon.node3, might not be running yet
[node3][INFO ] Running command: sudo ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.node3.asok mon_status
[node3][ERROR ] admin_socket: exception getting command descriptions: [Errno 2] No such file or directory
[node3][WARNIN] monitor node3 does not exist in monmap
[node3][WARNIN] neither `public_addr` nor `public_network` keys are defined for monitors
[node3][WARNIN] monitors may not be able to form quorum

原因: 未配置public network

添加一个monitor(手动)
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
添加之前查看当前节点 ceph mon stat

1、在目标节点上,新建 mon 的默认目录。{mon-id} 一般取为节点的 hostname 。
ssh {new-mon-host}
sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
2、创建一个临时目录(和第 1 步中的目录不同,添加 mon 完毕后需要删除该临时目录),来存放新增 mon 所需的各种文件,
mkdir {tmp}
3、获取 mon 的 keyring 文件,保存在临时目录下。
ceph auth get mon. -o {tmp}/{key-filename}
4、获取集群的 mon map 并保存到临时目录下。
ceph mon getmap -o {tmp}/{map-filename}
5.Optional. 更新所有mon节点的配置文件,添加新节点的IP地址到ceph.conf [global]字段的mon_host
[mon.node3]
host = node3
mon addr = 192.168.138.143:6789

6、格式化在第 1 步中建立的 mon 数据目录。需要指定 mon map 文件的路径(获取法定人数的信息和集群的 fsid )和 keyring 文件的路径。
sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
7、启动节点上的 mon 进程,它会自动加入集群。守护进程需要知道绑定到哪个 IP 地址,可以通过 --public-addr {ip:port} 选择指定,或在 ceph.conf 文件中进行配置 mon addr。
ceph-mon -i {mon-id} --public-addr {ip:port}

[root@node3 ~]# mkdir /var/lib/ceph/mon/ceph-node3/ -p
[root@node3 ~]# mkdir /var/lib/ceph/tmp -p
[root@node3 ~]# cd /var/lib/ceph/mon/ceph-node3/
[root@node3 ceph-node3]# ceph auth get mon. -o ../../tmp/key-node3
exported keyring for mon.
[root@node3 ceph-node3]# ceph mon getmap -o ../../tmp/map-node3
2017-06-21 12:56:30.078870 7fd654086700 0 -- :/2208778235 >> 192.168.138.143:6789/0 pipe(0x7fd65805cc80 sd=3 :0 s=1 pgs=0 cs=0 l=1 c=0x7fd65805df40).fault
got monmap epoch 4
[root@node3 ceph-node3]# ceph-mon -i node3 --mkfs --monmap ../../tmp/map-node3 --keyring ../../tmp/key-node3
ceph-mon: set fsid to d6d92de4-2a08-4bd6-a749-6c104c88fc40
ceph-mon: created monfs at /var/lib/ceph/mon/ceph-node3 for mon.node3

#启动节点上的 mon 进程,它会自动加入集群,此步骤可略
[root@node3 ceph-node3]# ceph mon add node3 192.169.138.143:6789
[root@node3 ceph-node3]# ceph-mon -i node3 --public-addr 192.169.138.143:6789
删除一个monitor(ceph-deploy )

这里我们删除node3节点的mon,修改部署目录的配置文件,去除node3及其IP,再推送到三个节点

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
[neo@admin cluster]$ cat ~/cluster/ceph.conf |grep mon     
mon_initial_members = node1, node2, node3
mon_host = 192.168.138.141,192.168.138.142,192.168.138.143

[neo@admin cluster]$ ceph-deploy --overwrite-conf config push node1 node2 node3
[neo@admin cluster]$ ceph-deploy mon destroy node3
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/neo/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy mon destroy node3
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : destroy
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x1481c68>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] mon : ['node3']
[ceph_deploy.cli][INFO ] func : <function mon at 0x1479320>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.mon][DEBUG ] Removing mon from node3
[node3][DEBUG ] connection detected need for sudo
[node3][DEBUG ] connected to host: node3
[node3][DEBUG ] detect platform information from remote host
[node3][DEBUG ] detect machine type
[node3][DEBUG ] find the location of an executable
[node3][DEBUG ] get remote short hostname
[node3][INFO ] Running command: sudo ceph --cluster=ceph -n mon. -k /var/lib/ceph/mon/ceph-node3/keyring mon remove node3
[node3][WARNIN] removing mon.node3 at 192.168.138.143:6789/0, there will be 2 monitors
[node3][INFO ] polling the daemon to verify it stopped
[node3][INFO ] Running command: sudo systemctl stop ceph-mon@node3.service
[node3][INFO ] Running command: sudo mkdir -p /var/lib/ceph/mon-removed
[node3][DEBUG ] move old monitor data

[neo@admin cluster]$ sudo ceph -s
cluster d6d92de4-2a08-4bd6-a749-6c104c88fc40
health HEALTH_OK
monmap e2: 2 mons at {node1=192.168.138.141:6789/0,node2=192.168.138.142:6789/0}
election epoch 62, quorum 0,1 node1,node2
osdmap e246: 9 osds: 9 up, 9 in
flags sortbitwise,require_jewel_osds
pgmap v1167: 256 pgs, 1 pools, 4 bytes data, 1 objects
350 MB used, 18377 GB / 18378 GB avail
256 active+clean

备注:
ceph-deploy删除MON的时候调用的指令是ceph mon remove node3,删除的MON的文件夹被移到了/var/lib/ceph/mon-removed

注意: 确保你删除某个 Mon 后,其余 Mon 仍能达成一致。如果不可能,删除它之前可能需要先增加一个

删除一个monitor(手动)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、停止 mon 进程。
[neo@admin cluster]$ sudo systemctl stop ceph-mon@node3
2、从集群中删除 monitor。
[neo@admin cluster]$ sudo ceph mon remove node3
removing mon.node3 at 192.168.138.143:6789/0, there will be 2 monitors
[neo@admin cluster]$ sudo ceph -s
cluster d6d92de4-2a08-4bd6-a749-6c104c88fc40
health HEALTH_OK
monmap e4: 2 mons at {node1=192.168.138.141:6789/0,node2=192.168.138.142:6789/0}
election epoch 74, quorum 0,1 node1,node2
osdmap e264: 9 osds: 9 up, 9 in
flags sortbitwise,require_jewel_osds
pgmap v1218: 256 pgs, 1 pools, 4 bytes data, 1 objects
354 MB used, 18377 GB / 18378 GB avail
256 active+clean

3、从 ceph.conf 中移除 mon 的入口部分(如果有)。
删除 Monitor(从不健康的集群中)

从一个不健康的集群(比如集群中的 monitor 无法达成法定人数)中删除 ceph-mon 守护进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1、停止集群中所有的 ceph-mon 守护进程。
ssh {mon-host}
systemctl stop ceph-mon@mon-host
# and repeat for all mons
2、确认存活的 mon 并登录该节点。
ssh {mon-host}
3、提取 mon map。
ceph-mon -i {mon-id} --extract-monmap {map-path}
# in most cases, that's
ceph-mon -i `hostname` --extract-monmap /tmp/monmap
4、删除未存活或有问题的的 monitor。比如,有 3 个 monitors,mon.node1 、mon.node2 和 mon.node3,现在仅有 mon.node1 存活,执行下列步骤:
monmaptool {map-path} --rm {mon-id}
# for example,
monmaptool /tmp/monmap --rm node2
monmaptool /tmp/monmap --rm node3
5、向存活的 monitor(s) 注入修改后的 mon map。比如,把 mon map 注入 mon.node1,执行下列步骤:
ceph-mon -i {mon-id} --inject-monmap {map-path}
# for example,
ceph-mon -i a --inject-monmap /tmp/monmap
6、启动存活的 monitor。
7、确认 monitor 是否达到法定人数( ceph -s )。
8、你可能需要把已删除的 monitor 的数据目录 /var/lib/ceph/mon 归档到一个安全的位置。或者,如果你确定剩下的 monitor 是健康的且数量足够,也可以直接删除数据目录。
挂掉的2个节点的监控数据的恢复

前边我们说如果挂掉的2个节点的监控数据都损坏了呢?恢复方法请参考这里

ref
monitor的增删改备
Ceph Monitor挂了之后对集群的影响
增加/删除 Monitor
thesues/cephdoc
Ceph集群


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

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