MMM介绍
MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主平常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,能够说是mysql主主复制管理器。虽然叫作双主复制,可是业务上同一时刻只容许对一个主进行写入,另外一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,能够说MMM这套脚本程序一方面实现了故障切换的功能,另外一方面其内部附加的工具脚本也能够实现多个slave的read负载均衡。关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任什么时候候只有一个节点能够被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,因此你能够用它来在一组居于复制的服务器启动虚拟ip,除此以外,它还有实现数据备份、节点之间从新同步功能的脚本。html
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还能够备份数据,实现两节点之间的数据同步等。因为MMM没法彻底的保证数据一致性,因此MMM适用于对数据的一致性要求不是很高,可是又想最大程度的保证业务可用性的场景。MySQL自己没有提供replication failover的解决方案,经过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。对于那些对数据的一致性要求很高的业务,很是不建议采用MMM这种高可用架构。mysql
从网上分享一个Mysql-MMM的内部架构图:sql
MySQL-MMM优缺点shell
1
2
|
优势:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操做,保证的数据的一致性。
缺点:Monitor节点是单点,能够结合Keepalived实现高可用。
|
MySQL-MMM工做原理数据库
1
2
3
4
5
6
7
8
9
|
MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,
并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)。
mmm_mond:监控进程,负责全部的监控工做,决定和处理全部节点角色活动。此脚本须要在监管机上运行。
mmm_agentd:运行在每一个mysql服务器上(Master和Slave)的代理进程,完成监控的探针工做和执行简单的远端服务设置。此脚本须要在被监管机上运行。
mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。
mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,经过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移
至其余mysql。在整个监管过程当中,须要在mysql中添加相关受权用户,以便让mysql能够支持监理机的维护。受权的用户包括一个mmm_monitor用户和一个mmm_agent用户,若是
想使用mmm的备份工具则还要添加一个mmm_tools用户。
|
MySQL-MMM高可用架构环境部署记录(自动切换读写分离)vim
0)机器配置信息bash
1
2
3
4
5
6
7
8
9
10
11
|
角色 ip地址 主机名字 server-
id
monitoring 182.48.115.233 mmm-monit -
master1 182.48.115.236 db-master1 1
master2 182.48.115.237 db-master2 2
slave1 182.48.115.238 db-slave 3
业务中的服务ip(vip)信息以下所示:
ip地址 角色 描述
182.48.115.234 write 应用程序链接该ip对主库进行写请求
182.48.115.235
read
应用程序链接该ip进行读请求
182.48.115.239
read
应用程序链接该ip进行读请求
|
1)配置/etc/hosts(全部机器都要操做)服务器
1
2
3
4
5
6
|
[root@mmm-monit ~]
# cat /etc/hosts
.......
182.48.115.233 mmm-monit
182.48.115.236 db-master1
182.48.115.237 db-master2
182.48.115.238 db-slave
|
2)首先在3台主机上安装mysql,部署复制环境架构
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
|
其中:182.48.115.236和182.48.115.237互为主从,182.48.115.238为1182.48.115.236的从
........................................................................
mysql安装参考:http:
//www
.cnblogs.com
/kevingrace/p/6109679
.html
mysql主从/主主配置参考:http:
//www
.cnblogs.com
/kevingrace/p/6256603
.html
........................................................................
---------182.48.115.236的my.cnf添加配置---------
server-
id
= 1
log-bin = mysql-bin
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
---------182.48.115.237的my.cnf添加配置---------
server-
id
= 2
log-bin = mysql-bin
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
---------182.48.115.238的my.cnf添加配置---------
server-
id
= 3
log-bin = mysql-bin
log_slave_updates = 1
注意:
上面的server-
id
不必定要按顺序来,只要没有重复便可。
而后182.48.115.236和182.48.115.237相互受权链接;182.48.115.236受权给182.48.115.238链接。
最后经过
"change master...."
作对应的主主和主从复制,具体操做步骤在此省略,能够参考上面给出的文档。
|
3)安装MMM(全部机器上都要执行)app
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
|
.......先安装MMM所须要的Perl模块.......
[root@db-master1 ~]
# vim install.sh //在全部机器上执行下面的安装脚本
#!/bin/bash
wget http:
//xrl
.us
/cpanm
--no-check-certificate
mv
cpanm
/usr/bin
chmod
755
/usr/bin/cpanm
cat
>
/root/list
<< EOF
install
Algorithm::Diff
install
Class::Singleton
install
DBI
install
DBD::mysql
install
File::Basename
install
File::stat
install
File::Temp
install
Log::Dispatch
install
Log::Log4perl
install
Mail::Send
install
Net::ARP
install
Net::Ping
install
Proc::Daemon
install
Thread::Queue
install
Time::HiRes
EOF
for
package
in
`
cat
/root/list
`
do
cpanm $package
done
[root@db-master1 ~]
# chmod 755 install.sh
[root@db-master1 ~]
# ./install.sh
.........下载mysql-mmm软件,在全部服务器上安装............
[root@db-master1 ~]
# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
[root@db-master1 ~]
# mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
[root@db-master1 ~]
# tar -zvxf mysql-mmm-2.2.1.tar.gz
[root@db-master1 ~]
# cd mysql-mmm-2.2.1
[root@db-master1 mysql-mmm-2.2.1]
# make install
mysql-mmm安装后的主要拓扑结构以下所示(注意:yum安装的和源码安装的路径有所区别):
/usr/lib/perl5/vendor_perl/5
.8.8
/MMM
MMM使用的主要perl模块
/usr/lib/mysql-mmm
MMM使用的主要脚本
/usr/sbin
MMM使用的主要命令的路径
/etc/init
.d/ MMM的agent和monitor启动服务的目录
/etc/mysql-mmm
MMM配置文件的路径,默认因此的配置文件位于该目录下
/var/log/mysql-mmm
默认的MMM保存日志的位置
到这里已经完成了MMM的基本需求,接下来须要配置具体的配置文件,其中mmm_common.conf,mmm_agent.conf为agent端的配置文件,mmm_mon.conf为monitor端的配置文件。
|
4)配置agent端的配置文件,须要在db-master1 ,db-master2,db-slave上分别配置(配置内容同样)
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
|
先在db-master1主机上配置agent的mmm_common.conf文件(这个在全部机器上都要配置,包括monitor机器)
[root@db-master1 ~]
# cd /etc/mysql-mmm/
[root@db-master1 mysql-mmm]
# cp mmm_common.conf mmm_common.conf.bak
[root@db-master1 mysql-mmm]
# vim mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth0
pid_path
/var/run/mmm_agentd
.pid
bin_path
/usr/lib/mysql-mmm/
replication_user slave
//
注意这个帐号和下面一行的密码是在前面部署主主/主从复制时建立的复制帐号和密码
replication_password slave@123
agent_user mmm_agent
agent_password mmm_agent
<
/host
>
<host db-master1>
ip 182.48.115.236
mode master
peer db-master2
<
/host
>
<host db-master2>
ip 182.48.115.237
mode master
peer db-master1
<
/host
>
<host db-slave>
ip 182.48.115.238
mode slave
<
/host
>
<role writer>
hosts db-master1, db-master2
ips 182.48.115.234
mode exclusive
<
/role
>
<role reader>
hosts db-master2, db-slave
ips 182.48.115.235, 182.48.115.239
mode balanced
<
/role
>
配置解释,其中:
replication_user 用于检查复制的用户
agent_user为agent的用户
mode标明是否为主或者备选主,或者从库。
mode exclusive主为独占模式,同一时刻只能有一个主
<role write>中hosts表示目前的主库和备选主的真实主机ip或者主机名,ips为对外提供的虚拟机ip地址
<role readr>中hosts表明从库真实的ip和主机名,ips表明从库的虚拟ip地址。
能够直接把mmm_common.conf从db-master1拷贝到db-master二、db-slave和mmm-monit三台主机的
/etc/mysql-mmm
下。
[root@db-master1 ~]
# scp /etc/mysql-mmm/mmm_common.conf db-master2:/etc/mysql-mmm/
[root@db-master1 ~]
# scp /etc/mysql-mmm/mmm_common.conf db-slave:/etc/mysql-mmm/
[root@db-master1 ~]
# scp /etc/mysql-mmm/mmm_common.conf mmm-monit:/etc/mysql-mmm/
分别在db-master1,db-master2,db-slave三台主机的
/etc/mysql-mmm
配置mmm_agent.conf文件,分别用不一样的字符标识。注意这个文件的this db1这行内容要修改
为各自的主机名。好比本环境中,db-master1要配置this db-master1,db-master2要配置为this db-master2,而db-slave要配置为this db-slave。
在db-master1(182.48.115.236)上:
[root@db-master1 ~]
# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db-master1
在db-master2(182.48.115.237)上:
[root@db-master2 ~]
# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db-master2
在db-slave(182.48.115.238)上:
[root@db-slave ~]
# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db-slave
------------------------------------------------------------------------------------------------------
接着在mmm-monit(182.48.115.233)配置monitor的配置文件:
[root@mmm-monit ~]
# cp /etc/mysql-mmm/mmm_mon.conf /etc/mysql-mmm/mmm_mon.conf.bak
[root@mmm-monit ~]
# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
ip 182.48.115.233
pid_path
/var/run/mysql-mmm/mmm_mond
.pid
bin_path
/usr/libexec/mysql-mmm
status_path
/var/lib/mysql-mmm/mmm_mond
.status
ping_ips 182.48.115.238,182.48.115.237,182.48.115.236
auto_set_online 10
//
发现节点丢失,则过10秒进行切换
<
/monitor
>
<host default>
monitor_user mmm_monitor
monitor_password mmm_monitor
<
/host
>
debug 0
这里只在原有配置文件中的ping_ips添加了整个架构被监控主机的ip地址,而在<host default>中配置了用于监控的用户。
|
5)建立监控用户,这里须要建立3个监控用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
具体描述:
用户名 描述 权限
monitor user MMM的monitor端监控全部的mysql数据库的状态用户 REPLICATION CLIENT
agent user 主要是MMM客户端用于改变的master的read_only状态用户 SUPER,REPLICATION CLIENT,PROCESS
repl 用于复制的用户 REPLICATION SLAVE
在3台服务器(db-master1,db-master2,db-slave)进行受权,由于以前部署的主主复制,以及主从复制已是ok的,因此这里在其中一台服务器执行就ok了,执行后
权限会自动同步到其它两台机器上。用于复制的帐号以前已经有了,因此这里就受权两个帐号。
在db-master1上进行受权操做:
mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO
'mmm_agent'
@
'182.48.115.%'
IDENTIFIED BY
'mmm_agent'
;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION CLIENT ON *.* TO
'mmm_monitor'
@
'182.48.115.%'
IDENTIFIED BY
'mmm_monitor'
;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
而后在db-master2和db-slave两台机器上查看,发现上面在db-master1机器上受权的帐号已经同步过来了!
|
6)启动agent和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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
最后分别在db-master1,db-master2,db-slave上启动agent
[root@db-master1 ~]
# /etc/init.d/mysql-mmm-agent start //将start替换成status,则查看agent进程起来了没?
Daemon bin:
'/usr/sbin/mmm_agentd'
Daemon pid:
'/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
[root@db-master2 ~]
# /etc/init.d/mysql-mmm-agent start
Daemon bin:
'/usr/sbin/mmm_agentd'
Daemon pid:
'/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
[root@db-slave ~]
# /etc/init.d/mysql-mmm-agent start
Daemon bin:
'/usr/sbin/mmm_agentd'
Daemon pid:
'/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
接着在mmm-monit上启动monitor程序
[root@mmm-monit ~]
# mkdir /var/run/mysql-mmm
[root@mmm-monit ~]
# /etc/init.d/mysql-mmm-monitor start
Daemon bin:
'/usr/sbin/mmm_mond'
Daemon pid:
'/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
........................................................................................................
若是monitor程序启动出现以下报错:
Daemon bin:
'/usr/sbin/mmm_mond'
Daemon pid:
'/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Base class package
"Class::Singleton"
is empty.
(Perhaps you need to
'use'
the module
which
defines that package first,
or
make
that module available
in
@INC (@INC contains:
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.).
at
/usr/share/perl5/vendor_perl/MMM/Monitor/Agents
.pm line 2
BEGIN failed--compilation aborted at
/usr/share/perl5/vendor_perl/MMM/Monitor/Agents
.pm line 2.
Compilation failed
in
require at
/usr/share/perl5/vendor_perl/MMM/Monitor/Monitor
.pm line 15.
BEGIN failed--compilation aborted at
/usr/share/perl5/vendor_perl/MMM/Monitor/Monitor
.pm line 15.
Compilation failed
in
require at
/usr/sbin/mmm_mond
line 28.
BEGIN failed--compilation aborted at
/usr/sbin/mmm_mond
line 28.
failed
解决办法:
[root@mmm-monit ~]
# perl -MCPAN -e shell
...............................................
如是执行这个命令后,有以下报错:
Can't
locate
CPAN.pm
in
@INC (@INC contains:
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
.).
BEGIN failed--compilation aborted.
解决:
[root@mmm-monit ~]
# rpm -q perl-CPAN
package perl-CPAN is not installed
[root@mmm-monit ~]
# yum install perl-CPAN
...............................................
执行上面的
"perl -MCPAN -e shell"
命令后,出现下面的安装命令
......
cpan[1]>
install
MIME::Entity
//
依次输入这些安装命令
cpan[2]>
install
MIME::Parser
cpan[3]>
install
Crypt::PasswdMD5
|