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不适用于对数据一致性要求很高的环境。但是高可用完全做到了。
posted @ 2022-12-21 14:11  Harda  阅读(115)  评论(0编辑  收藏  举报