千家信息网

MySQL架构——mmm部署实例

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,mmm架构的来源众所周知,MySQL自身提供了主从复制,然后可以很轻松实现master-master双向复制,同时再为其中一个Master节点搭建一个Slave库。这样就实现了MySQL-MMM架构的
千家信息网最后更新 2024年11月17日MySQL架构——mmm部署实例

mmm架构的来源

  • 众所周知,MySQL自身提供了主从复制,然后可以很轻松实现master-master双向复制,同时再为其中一个Master节点搭建一个Slave库。这样就实现了MySQL-MMM架构的基础:master1和master2之间双向复制,同时Master1和Slave1之间是主从复制。
  • 这样整个体系中存在两个Master,正常情况下只有一个master对外提供写服务。如果对外提供服务的master意外宕机了,这是MySQL本身并不具备failover切换的能力,尽管集群中仍然有一个正常的master节点,但应用仍不可用。mysql-mmm就是为了解决这个问题诞生的。

mmm架构的原理

  • MySQL-MMM是Master-Master Replication Manager for MySQL(mysql主主复制管理器)的简称,是Google的开源项目(Perl脚本),主要用来监控mysql主主复制并做失败转移
  • 其原理是将真实数据库节点的IP(RIP)映射为虚拟IP(VIP)集,在这个虚拟的IP集中,有一个专用于write的IP,多个用于read的IP,这个用于Write的VIP映射着数据库集群中的两台master的真实IP(RIP),以此来实现Failover的切换,其他read的VIP可以用来均衡读(balance)。

mmm机构优缺点

优点

  • 使用Perl脚本语言开发及完全开源
  • 提供了读写VIP(虚拟IP),使服务器角色的变更对前端应用透明
  • MMM提供了从服务器的延迟监控
  • MMM提供了主数据库故障转移后从服务器对新主的重新同步功能
  • 很容易对发生故障的主数据库重新上线

缺点

  • 发布时间比较早不支持MySQL新的复制功能(基于GTID的复制)
  • 没有读负载均衡的功能
  • 在进行主从切换时,容易造成数据丢失
  • MMM监控服务存在单点故障

mmm架构原理图

实验部署

环境部署

master1IP地址:192.168.144.167master2IP地址:192.168.144.151slave1IP地址:192.168.144.168slave2IP地址:192.168.144.145monitorIP地址:192.168.144.164

在master1\master2\slave1\slave2服务器中安装MYSQL数据库

[root@master1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo   //获取源地址[root@master1 ~]# yum -y install epel-release      //安装epel源[root@master1 ~]# yum clean all && yum makecache     //yum缓存清空[root@master1 ~]# yum -y install mariadb-server mariadb      //安装mariadb数据库[root@master1 ~]# systemctl stop firewalld.service       //关闭防火墙[root@master1 ~]# setenforce 0[root@master1 ~]# systemctl start mariadb.service        //开启数据库

修改master1数据库配置文件

[root@master1 ~]# vim /etc/my.cnf        //进入编辑配置文件[mysqld]log_error=/var/lib/mysql/mysql.err        //错误日志文件log=/var/lib/mysql/mysql_log.log           //主从日志存放位置log_slow_queries=/var/lib/mysql_slow_queris.log     //man日志binlog-ignore-db=mysql,information_schema         //二进制文件character_set_server=utf8        //字符集log_bin=mysql_bin             //二进制日志文件server_id=11            //服务id(不能相同)log_slave_updates=true   //允许从服务器更新sync_binlog=1            //同步日志auto_increment_increment=2    //自增列auto_increment_offset=1               //起始点[root@master1 ~]# systemctl restart mariadb.service   //重启数据库

使用scp复制数据库配置文件到其他MySQL服务,并在其他MySQL服务器中修改server_id

[root@master1 ~]# scp /etc/my.cnf root@192.168.144.151:/etc/   (server-id=22)[root@master1 ~]# scp /etc/my.cnf root@192.168.144.168:/etc/   (server-id=33)[root@master1 ~]# scp /etc/my.cnf root@192.168.144.145:/etc/   (server-id=44)[root@master1 ~]# netstat -anpt | grep 3306       //查看端口3306tcp      0   0 0.0.0.0:3306     0.0.0.0:*         LISTEN      4235/mysqld  

配置主主复制

master1
[root@master1 ~]# mysql   ##进入数据库MariaDB [(none)]> show master status;   ##查看主服务器的状态信息+------------------+----------+--------------+--------------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         |+------------------+----------+--------------+--------------------------+| mysql_bin.000001 |      245 |              | mysql,information_schema |+------------------+----------+--------------+--------------------------+1 row in set (0.00 sec)MariaDB [(none)]> grant replication slave on *.* to 'replication'@'192.168.144.%' identified by '123456';     //授权给144段的网段复制的权限用户名replication密码123456Query OK, 0 rows affected (0.00 sec)
master2
MariaDB [(none)]> change master to master_host='192.168.144.167',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=245;     //在master2上同步master1服务器Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> grant replication slave on *.* to 'replication'@'192.168.144.%' identified by '123456';    //在master2上授权复制权限Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> show master status;       //查看master2的服务器的状态信息+------------------+----------+--------------+--------------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         |+------------------+----------+--------------+--------------------------+| mysql_bin.000001 |      410 |              | mysql,information_schema |+------------------+----------+--------------+--------------------------+1 row in set (0.00 sec)MariaDB [(none)]> flush privileges;     //刷新权限Query OK, 0 rows affected (0.00 sec)
master1
MariaDB [(none)]> change master to master_host='192.168.144.151',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=410;       //master1同步master2服务器数据库Query OK, 0 rows affected (0.03 sec)MariaDB [(none)]> flush privileges;Query OK, 0 rows affected (0.00 sec)
master1,master2上开启同步
MariaDB [(none)]> start slave;              //开启同步Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> show slave status\G;       //查看同步状态信息                         ...                         Slave_IO_Running: Yes                        Slave_SQL_Running: Yes                        ...

slave1,slave2做主从同步

MariaDB [(none)]> change master to master_host='192.168.144.167',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=245;       //在从服务器上同步master1主服务器Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> flush privileges;       //刷新权限Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> start slave;       //开启同步Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> show slave status\G;        //查看同步的状态信息                             ...                             Slave_IO_Running: Yes                            Slave_SQL_Running: Yes                            ...

测试主主,主从的同步状态

主服务器master1
MariaDB [(none)]> create database school;   //创建数据库Query OK, 1 row affected (0.00 sec)MariaDB [(none)]> show databases;   //查看数据库+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || school             || test               |+--------------------+5 rows in set (0.00 sec)
slave服务器上查看数据库
MariaDB [(none)]> show databases;    //实现主主,主从同步+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || school             || test               |+--------------------+5 rows in set (0.00 sec)

monitor服务器上配置epel-release源清空缓存,然后安装MMM

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoyum -y install epel-releaseyum clean all && yum makecacheyum -y install mysql-mmm*

所有MySQL服务器上安装mmm

yum -y install mysql-mmm*

所有服务器上对mmm进行配置

 [root@master1 ~]# vim /etc/mysql-mmm/mmm_common.conf     //所有主机上都要配置,直接复制多份……        cluster_interface       ens33    //修改网卡        …        replication_user        replication      //修改用户名        replication_password    123456         //密码        agent_user              mmm_agent        agent_password          123456         //密码        ip      192.168.144.167   //master1地址        mode    master        peer    db2        ip      192.168.144.151   //master2地址        mode    master        peer    db1        ip      192.168.144.168   //slave1地址        mode    slave        ip      192.168.144.145   //slave2地址        mode    slave        hosts   db1, db2      ##写服务器虚拟ip        ips     192.168.144.250        mode    exclusive         hosts   db3, db4    ##读服务器虚拟ip        ips     192.168.144.251, 192.168.144.252        mode    balanced##复制到其他的服务器中[root@master1 ~]# scp /etc/mysql-mmm/mmm_common.conf root@192.168.144.151:/etc/mysql-mmm/root@192.168.144.151's password: mmm_common.conf                               100%  836   267.1KB/s   00:00    [root@master1 ~]# scp /etc/mysql-mmm/mmm_common.conf root@192.168.144.168:/etc/mysql-mmm/root@192.168.144.168's password: mmm_common.conf                               100%  836   863.2KB/s   00:00    [root@master1 ~]# scp /etc/mysql-mmm/mmm_common.conf root@192.168.144.145:/etc/mysql-mmm/root@192.168.144.145's password: mmm_common.conf                               100%  836   904.7KB/s   00:00    [root@master1 ~]# scp /etc/mysql-mmm/mmm_common.conf root@192.168.144.164:/etc/mysql-mmm/

在monitor服务器上配置

[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf        monitor_user        mmm_monitor        monitor_password    123456    ##修改monitor的密码

在所有数据库上为mmm_agent代理授权,为mmm_monitor授权监控

MariaDB [(none)]> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.144.%' identified by '123456';     //授权代理Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> grant replication client on *.* to 'mmm_monitor'@'192.168.144.%' identified by '123456';        //授权监控Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> flush privileges;       //刷新权限Query OK, 0 rows affected (0.00 sec)

修改所有数据库的mmm_agent.conf

[root@master1 ~]# vim /etc/mysql-mmm/mmm_agent.confthis db1 //根据规划进行逐一调整[root@master2 ~]# vim /etc/mysql-mmm/mmm_agent.confthis db2 //根据规划进行逐一调整[root@slave1 ~]# vim /etc/mysql-mmm/mmm_agent.confthis db3 //根据规划进行逐一调整[root@slave2 ~]# vim /etc/mysql-mmm/mmm_agent.confthis db4 //根据规划进行逐一调整##所有数据库开启[root@master1 ~]systemctl start mysql-mmm-agent.service        //开启代理服务[root@master1 ~]systemctl enable mysql-mmm-agent.service        //加入开机自启动

在monitor上配置

[root@monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf        ip                  127.0.0.1        pid_path            /run/mysql-mmm-monitor.pid        bin_path            /usr/libexec/mysql-mmm        status_path         /var/lib/mysql-mmm/mmm_mond.status        ping_ips            192.168.144.167,192.168.144.151,192.168.144.168,192.168.144.145    //所有数据库服务器地址        auto_set_online     10        //自动在线时间[root@monitor ~]# systemctl stop firewalld.service        //关闭防火墙[root@monitor ~]# setenforce 0[root@monitor ~]# systemctl start mysql-mmm-monitor.service       /开启监控服务[root@monitor ~]# mmm_control show            //查看主从的飘逸地址    db1(192.168.144.167) master/ONLINE. Roles: writer(192.168.144.250)    db2(192.168.144.151) master/ONLINE. Roles:     db3(192.168.144.168) slave/ONLINE. Roles: reader(192.168.144.252)    db4(192.168.144.145) slave/ONLINE. Roles: reader(192.168.144.251)

测试漂移地址

[root@master1 ~]# systemctl stop mariadb.service     //模拟停止master1服务器

monitor服务器上查看

[root@monitor ~]# mmm_control show    db1(192.168.144.167) master/HARD_OFFLINE. Roles:     db2(192.168.144.151) master/ONLINE. Roles: writer(192.168.144.250)    db3(192.168.144.168) slave/ONLINE. Roles: reader(192.168.144.252)    db4(192.168.144.145) slave/ONLINE. Roles: reader(192.168.144.251)(重启master1数据库服务,虚拟地址不会被抢占到master1)mmm_control checks all //需要各种OKmmm_control move_role writer db1      //可以切换虚拟地址

在monitor上安装MySQL作为测试机用虚拟ip登录数据库

[root@monitor ~]# yum install mysql -y//master1服务器上授权monitor地址访问//MariaDB [(none)]> grant all on *.* to 'testdba'@'192.168.144.164' identified by '123456';##授权monitor地址访问Query OK, 0 rows affected (0.01 sec)MariaDB [(none)]> flush privileges;   ##刷新权限Query OK, 0 rows affected (0.00 sec)[root@monitor ~]# mysql -utestdba -p -h 192.168.144.250   ##使用虚拟地址即可登录数据库Enter password: MariaDB [(none)]> 
0