Mysql高可用之MMM架构
MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。
在本地环境搭建并验证测试,结构图如下:
一、搭建主主(192.168.65.153和192.168.65.154),主从(192.168.65.153和192.168.65.155),步骤省略
具体的配置信息如下所示:
角色 ip地址 主机名字 server-id
monitoring 192.168.65.155 db3 -
master1 192.168.65.153 db1 1
master2 192.168.65.154 db2 2
slave 192.168.65.155 db3 3
业务中的服务ip信息如下所示:
ip地址 角色 描述
192.168.65.250 write 应用程序连接该ip对主库进行写请求
192.168.65.251 read 应用程序连接该ip进行读请求
192.168.65.252 read 应用程序连接该ip进行读请求
192.168.65.253 read 应用程序连接该ip进行读请求
二、安装和配置MMM以及数据库节点
1、三台服务器安装epel源,然后yum -y install mysql-mmm*来安装MMM
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#下载epel源,这个链接适用于Redhat/Centos的7或者7以上的版本
wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
#下载remi源,这个链接适用于Redhat/Centos的7或者7以上的版本
rpm -ivh epel-release-latest-7.noarch.rpm
#使用rpm的方式进行安装
rpm -ivh remi-release-7.rpm
#使用rpm的方式进行安装
#安装了这两个yum源工具后,会在/etc/yum.repo.d/的目录下生成repo文件
vim /etc/yum.repo.d/epel.repo
enable=1
vim /etc/yum.repo.d/remi.repo
注释掉mirrorlist开头的那一行配置
#安装MMM架构的代理功能
yum -y install mysql-mmm-agent.noarch
#安装MMM的所有包
yum -y install mysql-mmm-*
2、在192.168.65.153中创建监控用户,代理用户(一台服务器做即可)
mysql -uroot -proot@2020 -S data3307/my3307.sock
#创建一个用于监控的用户,用户名为mmm_mon,密码为1234
mysql> grant replication client on *.* to 'mmm_mon'@'192.168.65.%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#创建一个用于代理的用户,用户名为mmm_agent,密码为1234
mysql> grant super,replication client, process on *.* to 'mmm_agent'@'192.168.65.%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
exit
3、在192.168.56.153修改MMM共享配置信息(三台主机均需要)
[mysql@db1 ~]# cd /etc/mysql-mmm/
[mysql@db1 mysql-mmm]# ll
总用量 20
-rw-r-----. 1 root root 230 5月 5 2018 mmm_agent.conf
-rw-r-----. 1 root root 777 5月 5 2018 mmm_common.conf
-rw-r-----. 1 root root 680 5月 5 2018 mmm_mon.conf
-rw-r-----. 1 root root 827 5月 5 2018 mmm_mon_log.conf
-rw-r--r--. 1 root root 1432 5月 5 2018 mmm_tools.conf
[mysql@db1 mysql-mmm]#vim mmm_common.conf
active_master_role writer
<host default>
cluster_interface ens33 #用于三台服务器ping通的网卡名
mysql_port 3307 #监听的mysql端口
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user rep #主从复制的用户名
replication_password rep123 #主从复制用户的密码
agent_user mmm_agent #MMM架构的代理用户
agent_password 1234 #代理用户的密码
</host>
<host db1> #db1的信息
ip 192.168.65.153 #IP
mode master #模式是主节点
peer db2 #相关联的是db2
</host>
<host db2> #db2的信息
ip 192.168.65.154 #IP
mode master #模式是主节点
peer db1 #相关联的是db3
</host>
<host db3> #db3的信息
ip 192.168.65.155 #IP
mode slave #模式是从节点
</host>
<role writer> #写操作的服务器信息
hosts db1, db2 #db1和db2是主节点
ips 192.168.65.250 #设置一个虚拟写ip
mode exclusive #模式是只写
</role>
<role reader> #读操作的服务器信息
hosts db1, db2, db3 #有db1,db2,db3
ips 192.168.65.251, 192.168.65.252, 192.168.65.253 #设置三个虚拟的读IP
mode balanced #模式是均衡
</role>
4、将配置文件同步到其他两台服务器
scp /etc/mysql-mmm/mmm_common.conf 192.168.65.154:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf 192.168.65.155:/etc/mysql-mmm/
5、三台服务器均修改mmm_agent.conf配置文件
在db1上vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
在db2上vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db2
在db3上vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3
6、在192.168.65.155服务器上配置监控节点服务
在192.168.65.155服务器上配置监控节点服务,用于监控这个集群的状态.并且在三台服务器上启动MMM的代理服务
vim /etc/mysql-mmm/mmm_mon.conf
在<monitor>下的
ping_ips 192.168.65.153,192.168.65.154,192.168.65.155
在<host default>下的
monitor_user mmm_mon #监控用户名
monitor_password 1234 #监控用户的密码
保存并退出
7、三台服务器上启动MMM架构的代理服务
systemctl start mysql-mmm-agent.service
8、192.168.65.155启动MMM架构的监控服务
systemctl start mysql-mmm-monitor.service
9、在monitor(192.168.65.155)主机上检查集群主机的状态
mmm_control checks all
db2 ping [last change: 2020/10/09 17:14:42] OK
db2 mysql [last change: 2020/10/09 17:15:11] OK
db2 rep_threads [last change: 2020/10/09 17:15:11] OK
db2 rep_backlog [last change: 2020/10/09 17:15:11] OK: Backlog is null
db3 ping [last change: 2020/10/09 17:14:42] OK
db3 mysql [last change: 2020/10/09 17:15:11] OK
db3 rep_threads [last change: 2020/10/09 17:15:11] OK
db3 rep_backlog [last change: 2020/10/09 17:15:11] OK: Backlog is null
db1 ping [last change: 2020/10/09 17:14:42] OK
db1 mysql [last change: 2020/10/09 17:14:42] OK
db1 rep_threads [last change: 2020/10/09 17:14:42] OK
db1 rep_backlog [last change: 2020/10/09 17:14:42] OK: Backlog is null
10、在monitor(192.168.65.155)主机上检查集群环境在线状况:
mmm_control show
db1(192.168.65.153) master/ONLINE. Roles: reader(192.168.65.252), writer(192.168.65.250)
db2(192.168.65.154) master/ONLINE. Roles: reader(192.168.65.253)
db3(192.168.65.155) slave/ONLINE. Roles: reader(192.168.65.251)
到这里整个集群就配置完成了。从输出中可以看到虚拟ip 192.168.65.250已经顺利添加到主机192.168.65.153上作为主对外提供写服务,虚拟ip 192.168.65.252添加到主机192.168.65.153上对外提供读服务,而虚拟ip 192.168.65.253添加到192.168.65.154上对外提供读服务,而虚拟ip 192.168.65.251添加到192.168.65.155上对外提供读服务.
三、MMM高可用测试
1、模拟db1主库宕机:
查看集群状态:
mmm_control show
db1(192.168.65.153) master/HARD_OFFLINE. Roles:
db2(192.168.65.154) master/ONLINE. Roles: reader(192.168.65.253), writer(192.168.65.250)
db3(192.168.65.155) slave/ONLINE. Roles: reader(192.168.65.251), reader(192.168.65.252)
查看MMM日志
[mysql@db3 ~]# tail -30 /var/log/mysql-mmm/mmm_mond.log
2020/10/09 17:51:54 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
重新启动db1的mysql服务,查看集群状态:
mmm_control show
db1(192.168.65.153) master/ONLINE. Roles: reader(192.168.65.251)
db2(192.168.65.154) master/ONLINE. Roles: reader(192.168.65.253), writer(192.168.65.250)
db3(192.168.65.155) slave/ONLINE. Roles: reader(192.168.65.252)
注意:db1由以前的ONLINE转化为HARD_OFFLINE,移除了写角色,因为db2是备选主,所以接管了写角色,db3指向新的主库db2,应该说db3实际上找到了db2的sql现在的位置,即db2 show master返回的值,然后直接在db3上change master to到db2。
db1,db2,db3之间为一主两从的复制关系,一旦发生db2,db3延时于db1时,这个时刻db1 mysql宕机,db3将会等待数据追上db1后,再重新指向新的主db2,进行change master to db2操作,在db1宕机的过程中,一旦db2落后于db1,这时发生切换,db2变成了可写状态,数据的一致性将会无法保证。
MMM不适用于对数据一致性要求很高的环境。但是高可用完全做到了。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。
在本地环境搭建并验证测试,结构图如下:
![](http://media.teamshub.com/10000/tm/2020/10/09/0520d01f-cba1-4617-96ad-25b0702d1fa8/cb633b40-f656-4357-91a2-d8c067a1e212.png)
具体的配置信息如下所示:
角色 ip地址 主机名字 server-id
monitoring 192.168.65.155 db3 -
master1 192.168.65.153 db1 1
master2 192.168.65.154 db2 2
slave 192.168.65.155 db3 3
业务中的服务ip信息如下所示:
ip地址 角色 描述
192.168.65.250 write 应用程序连接该ip对主库进行写请求
192.168.65.251 read 应用程序连接该ip进行读请求
192.168.65.252 read 应用程序连接该ip进行读请求
192.168.65.253 read 应用程序连接该ip进行读请求
二、安装和配置MMM以及数据库节点
1、三台服务器安装epel源,然后yum -y install mysql-mmm*来安装MMM
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#下载epel源,这个链接适用于Redhat/Centos的7或者7以上的版本
wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
#下载remi源,这个链接适用于Redhat/Centos的7或者7以上的版本
rpm -ivh epel-release-latest-7.noarch.rpm
#使用rpm的方式进行安装
rpm -ivh remi-release-7.rpm
#使用rpm的方式进行安装
#安装了这两个yum源工具后,会在/etc/yum.repo.d/的目录下生成repo文件
vim /etc/yum.repo.d/epel.repo
enable=1
vim /etc/yum.repo.d/remi.repo
注释掉mirrorlist开头的那一行配置
#安装MMM架构的代理功能
yum -y install mysql-mmm-agent.noarch
#安装MMM的所有包
yum -y install mysql-mmm-*
2、在192.168.65.153中创建监控用户,代理用户(一台服务器做即可)
mysql -uroot -proot@2020 -S data3307/my3307.sock
#创建一个用于监控的用户,用户名为mmm_mon,密码为1234
mysql> grant replication client on *.* to 'mmm_mon'@'192.168.65.%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#创建一个用于代理的用户,用户名为mmm_agent,密码为1234
mysql> grant super,replication client, process on *.* to 'mmm_agent'@'192.168.65.%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)
exit
3、在192.168.56.153修改MMM共享配置信息(三台主机均需要)
[mysql@db1 ~]# cd /etc/mysql-mmm/
[mysql@db1 mysql-mmm]# ll
总用量 20
-rw-r-----. 1 root root 230 5月 5 2018 mmm_agent.conf
-rw-r-----. 1 root root 777 5月 5 2018 mmm_common.conf
-rw-r-----. 1 root root 680 5月 5 2018 mmm_mon.conf
-rw-r-----. 1 root root 827 5月 5 2018 mmm_mon_log.conf
-rw-r--r--. 1 root root 1432 5月 5 2018 mmm_tools.conf
[mysql@db1 mysql-mmm]#vim mmm_common.conf
active_master_role writer
<host default>
cluster_interface ens33 #用于三台服务器ping通的网卡名
mysql_port 3307 #监听的mysql端口
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user rep #主从复制的用户名
replication_password rep123 #主从复制用户的密码
agent_user mmm_agent #MMM架构的代理用户
agent_password 1234 #代理用户的密码
</host>
<host db1> #db1的信息
ip 192.168.65.153 #IP
mode master #模式是主节点
peer db2 #相关联的是db2
</host>
<host db2> #db2的信息
ip 192.168.65.154 #IP
mode master #模式是主节点
peer db1 #相关联的是db3
</host>
<host db3> #db3的信息
ip 192.168.65.155 #IP
mode slave #模式是从节点
</host>
<role writer> #写操作的服务器信息
hosts db1, db2 #db1和db2是主节点
ips 192.168.65.250 #设置一个虚拟写ip
mode exclusive #模式是只写
</role>
<role reader> #读操作的服务器信息
hosts db1, db2, db3 #有db1,db2,db3
ips 192.168.65.251, 192.168.65.252, 192.168.65.253 #设置三个虚拟的读IP
mode balanced #模式是均衡
</role>
4、将配置文件同步到其他两台服务器
scp /etc/mysql-mmm/mmm_common.conf 192.168.65.154:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf 192.168.65.155:/etc/mysql-mmm/
5、三台服务器均修改mmm_agent.conf配置文件
在db1上vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
在db2上vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db2
在db3上vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3
6、在192.168.65.155服务器上配置监控节点服务
在192.168.65.155服务器上配置监控节点服务,用于监控这个集群的状态.并且在三台服务器上启动MMM的代理服务
vim /etc/mysql-mmm/mmm_mon.conf
在<monitor>下的
ping_ips 192.168.65.153,192.168.65.154,192.168.65.155
在<host default>下的
monitor_user mmm_mon #监控用户名
monitor_password 1234 #监控用户的密码
保存并退出
7、三台服务器上启动MMM架构的代理服务
systemctl start mysql-mmm-agent.service
8、192.168.65.155启动MMM架构的监控服务
systemctl start mysql-mmm-monitor.service
9、在monitor(192.168.65.155)主机上检查集群主机的状态
mmm_control checks all
db2 ping [last change: 2020/10/09 17:14:42] OK
db2 mysql [last change: 2020/10/09 17:15:11] OK
db2 rep_threads [last change: 2020/10/09 17:15:11] OK
db2 rep_backlog [last change: 2020/10/09 17:15:11] OK: Backlog is null
db3 ping [last change: 2020/10/09 17:14:42] OK
db3 mysql [last change: 2020/10/09 17:15:11] OK
db3 rep_threads [last change: 2020/10/09 17:15:11] OK
db3 rep_backlog [last change: 2020/10/09 17:15:11] OK: Backlog is null
db1 ping [last change: 2020/10/09 17:14:42] OK
db1 mysql [last change: 2020/10/09 17:14:42] OK
db1 rep_threads [last change: 2020/10/09 17:14:42] OK
db1 rep_backlog [last change: 2020/10/09 17:14:42] OK: Backlog is null
10、在monitor(192.168.65.155)主机上检查集群环境在线状况:
mmm_control show
db1(192.168.65.153) master/ONLINE. Roles: reader(192.168.65.252), writer(192.168.65.250)
db2(192.168.65.154) master/ONLINE. Roles: reader(192.168.65.253)
db3(192.168.65.155) slave/ONLINE. Roles: reader(192.168.65.251)
到这里整个集群就配置完成了。从输出中可以看到虚拟ip 192.168.65.250已经顺利添加到主机192.168.65.153上作为主对外提供写服务,虚拟ip 192.168.65.252添加到主机192.168.65.153上对外提供读服务,而虚拟ip 192.168.65.253添加到192.168.65.154上对外提供读服务,而虚拟ip 192.168.65.251添加到192.168.65.155上对外提供读服务.
三、MMM高可用测试
1、模拟db1主库宕机:
查看集群状态:
mmm_control show
db1(192.168.65.153) master/HARD_OFFLINE. Roles:
db2(192.168.65.154) master/ONLINE. Roles: reader(192.168.65.253), writer(192.168.65.250)
db3(192.168.65.155) slave/ONLINE. Roles: reader(192.168.65.251), reader(192.168.65.252)
查看MMM日志
[mysql@db3 ~]# tail -30 /var/log/mysql-mmm/mmm_mond.log
2020/10/09 17:51:54 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
重新启动db1的mysql服务,查看集群状态:
mmm_control show
db1(192.168.65.153) master/ONLINE. Roles: reader(192.168.65.251)
db2(192.168.65.154) master/ONLINE. Roles: reader(192.168.65.253), writer(192.168.65.250)
db3(192.168.65.155) slave/ONLINE. Roles: reader(192.168.65.252)
注意:db1由以前的ONLINE转化为HARD_OFFLINE,移除了写角色,因为db2是备选主,所以接管了写角色,db3指向新的主库db2,应该说db3实际上找到了db2的sql现在的位置,即db2 show master返回的值,然后直接在db3上change master to到db2。
db1,db2,db3之间为一主两从的复制关系,一旦发生db2,db3延时于db1时,这个时刻db1 mysql宕机,db3将会等待数据追上db1后,再重新指向新的主db2,进行change master to db2操作,在db1宕机的过程中,一旦db2落后于db1,这时发生切换,db2变成了可写状态,数据的一致性将会无法保证。
MMM不适用于对数据一致性要求很高的环境。但是高可用完全做到了。