MySQL高可用架构-MMM

2021年09月15日 阅读数:106
这篇文章主要向大家介绍MySQL高可用架构-MMM,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

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_MySQL

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