首页 > 数据库 >Mysql高可用之MMM架构

Mysql高可用之MMM架构

时间:2022-12-21 14:23:30浏览次数:72  
标签:mmm 架构 Mysql 192.168 MMM mysql db1 db3 db2

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,架构,Mysql,192.168,MMM,mysql,db1,db3,db2
From: https://www.cnblogs.com/harda/p/16996157.html

相关文章

  • mysql系统日志 (binlog, redolog, undolog, errorlog, generallog, relaylog, slowque
    mysql系统日志(binlog,redolog,undolog,errorlog,generallog,relaylog,slowquerylog) 1.错误日志errorlog错误日志记录着mysqld服务在启动,停止,和运行过程中发......
  • mysql-MDL锁
    针对****生产环境上出现过一次关于MDL锁导致DDL等待锁失败而出现连接表失败,在本地进行MDL锁复现。初始化环境,有一个test01.t1表,进行模拟MDL锁等待id14(A)id15(B......
  • mysql-表碎片清理和表空间收缩
    根据****热计费项目生产环境上,ibd文件异常大,借机梳理表碎片清理和表空间收缩的知识点 1、碎片清理的好处 降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用......
  • 基于Springboot+Mybatis+mysql+element-vue高校就业管理系统
    @目录一、系统介绍二、功能展示1.用户登陆注册2.个人信息(学生端)3.查看企业岗位信息(学生端)4.我的应聘(学生端)5.学生信息管理(辅导员)6.三方协议书审核(辅导员)7.查看班级就业......
  • 基于Java springboot+mybatis+mysql实现的校园新闻系统
    @目录一、系统介绍二、功能展示1.主页2.登录以及注册3.普通用户对新闻咨询的编辑、发布和删除4.管理员对新闻的审核发布和撤销取消发布三、代码展示四、获取源码一、系统......
  • MySQL统计某个数据库中有多少张表
    在一些命令行下无法查看某个数据库一共有多少张表的时候,可以采用下面的SQL语句SQL语句SELECTcount(*)TABLES,table_schemaFROMinformation_schema.TA......
  • MySQL 索引的创建、删除
    MySQL中索引的创建有三种方法,索引的删除有两种方法。一、创建索引(1)使用createindex#1.创建普通索引createindex索引名on表名(列名[(限制索引长度)]);#2.创建......
  • mysql 查询重复/删除重复的记录[多字段]
    #####查询重复数据SELECTt.*FROMlike_usert,(SELECTuser_id,COUNT(user_id),dynamc_id,COUNT(dynamc_id)FROMlike_userGROUPBYuser_id,dynamc_idHA......
  • MySQL 删除数据 批量删除(大量)数据
    在删除数据的时候根据不同的场景使用不同的方法,比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增ID、批量删除大量数据等,可以使用delete、truncate、drop等......
  • MySQL 表的创建、复制、修改与删除
    MySQL中如何利用代码完成表的创建、复制、修改和删除。一、创建表--创建新表,如果存在则覆盖droptable[ifexists]表名;--创建新表,如果存在则返回createtable[if......