MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主平常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫作双主复制,可是业务上同一时刻只容许对一个主进行写入,另外一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,能够说MMM这套脚本程序一方面实现了故障切换的功能,另外一方面其内部附加的工具脚本也能够实现多个slave的read负载均衡。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还能够备份数据,实现两节点之间的数据同步等。因为MMM没法彻底的保证数据一致性,因此MMM适用于对数据的一致性要求不是很高,可是又想最大程度的保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,很是不建议采用MMM这种高可用架构。mysql
优势:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操做,保证的数据的一致性。
缺点:Monitor节点是单点,能够结合Keepalived实现高可用。sql
MMM是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)。数据库
在整个监管过程当中,须要在mysql中添加相关受权用户,以便让mysql能够支持监理机的维护。受权的用户包括一个mmm_monitor用户和一个mmm_agent用户,若是想使用mmm的备份工具则还要添加一个mmm_tools用户。vim
操做系统:CentOS 7.0 x86_64
数据库分配: 缓存
Function | IP | Hostname | Sever id |
---|---|---|---|
MySQL-monitor | 192.168.100.163 | monitor | 无 |
master1 | 192.168.100.155 | db1 | 1 |
master2 | 192.168.100.166 | db2 | 2 |
slave1 | 192.168.100.159 | db3 | 3 |
slave2 | 192.168.100.158 | db4 | 4 |
虚拟IP地址(VIP):安全
IP | role |
---|---|
192.168.100.170 | writer |
192.168.100.171 | reader |
192.168.100.172 | reader |
1.配置ALI云源,而后安装epel-release源服务器
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum -y install epel-release yum clean all && yum makecache //清空全部,从新更新元数据缓存
2.安装MariaDB架构
yum -y install mariadb-server mariadb
3.关闭防火墙及加强安全设置负载均衡
systemctl stop firewalld.service setenforce 0
在其余三台服务端上进行一样的操做 ide
4.修改m1主配置文件
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 //慢日志文件位置 binlog-ignore-db=mysql,information_schema //mysql,information_schema这两个数据库不生成二进制日志文件 character_set_server=utf8 //字体设置为utf8 log_bin=mysql_bin //二进制日志文件功能开启 server_id=1 //本台server_id为1,其余三台server_id与本台不一样 log_slave_updates=true //开启同步 sync_binlog=1 //1为安全值 auto_increment_increment=2 auto_increment_offset=1
5.开启服务并查看服务状态
systemctl start mariadb netstat -anpt | grep 3306
6.没有问题后,把配置文件复制到其它3台数据库服务器上并启动服务器,注意:配置文件中的server_id要修改
scp /etc/my.cnf root@192.168.100.166:/etc/ scp /etc/my.cnf root@192.168.100.159:/etc/ scp /etc/my.cnf root@192.168.100.158:/etc/
1.分别在两台主服务器上查看日志文件名称和位置值
mysql //登陆数据库 >show master status;
2.在m1上为m2授予从的权限,在m2上也要为m1授予从的权限
MariaDB-m1:
grant replication slave on *.* to 'replication'@'192.168.100.%' identified by '123456'; //使用帐户为replication 密码为123456 change master to master_host='192.168.100.166',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=245; //当在MariaDB-m1上执行时,master_host地址为MariaDB-m2地址
MariaDB-m2:
grant replication slave on *.* to 'replication'@'192.168.100.%' identified by '123456'; change master to master_host='192.168.100.155',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=245; //当在MariaDB-m1上执行时,master_host地址为MariaDB-m2地址
3.开启同步,查看服务器的主从状态
>start slave; >show slave status\G; //Slave_IO_Running: Yes、Slave_SQL_Running这两个条目状态为yes
4.建库测试主主同步
>create database dba; //在m1上建立dba数据库,应当在m2上能看到,不然主主同步失败 >drop database dba; //在m1上删除后,m2上的dba也应当没有
1.登陆mariadb
>mysql
2.在两台从服务器上分别执行
change master to master_host='192.168.100.155',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=245;
3.开启同步并查看从服务器状态
>start slave; >show slave status\G; //需看到slave1和slave2的Slave_IO_Running: Yes、Slave_SQL_Running参数值为yes
四、测试主从同步
在m1上建立数据库dba,须要再slave1和slave2上看到一样的数据库dba出现,则主从同步成功
1.安装mysql-mmm软件包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum -y install epel-release yum -y install mysql-mmm*
2.配置MySQL-MMM
vim /etc/mysql-mmm/mmm_common.conf active_master_role writer <host default> cluster_interface ens33 pid_path /run/mysql-mmm-agent.pid bin_path /usr/libexec/mysql-mmm/ replication_user replication replication_password 123456 agent_user mmm_agent agent_password 123456 </host> <host db1> ip 192.168.100.155 mode master peer db2 </host> <host db2> ip 192.168.100.166 mode master peer db1 </host> <host db3> ip 192.168.100.159 mode slave </host> <host db4> ip 192.168.100.158 mode slave </host> <role writer> hosts db1, db2 ips 192.168.100.170 mode exclusive </role> <role reader> hosts db3, db4 ips 192.168.100.171, 192.168.100.172 mode balanced </role>
3.其余服务器的mmm_common.conf文件内容相同,直接快速传输至其余服务器
scp /etc/mysql-mmm/mmm_common.conf root@192.168.100.166:/etc/mysql-mmm/ scp /etc/mysql-mmm/mmm_common.conf root@192.168.100.159:/etc/mysql-mmm/ scp /etc/mysql-mmm/mmm_common.conf root@192.168.100.158:/etc/mysql-mmm/ scp /etc/mysql-mmm/mmm_common.conf root@192.168.100.163:/etc/mysql-mmm/
4.在monitor服务器上编辑mmm_mon.conf配置文件
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf <monitor> 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.100.155,192.168.100.166,192.168.100.159,192.168.100.158 auto_set_online 10 # The kill_host_bin does not exist by default, though the monitor will # throw a warning about it missing. See the section 5.10 "Kill Host # Functionality" in the PDF documentation. # # kill_host_bin /usr/libexec/mysql-mmm/monitor/kill_host # </monitor> <host default> monitor_user mmm_monitor monitor_password 123456 </host> debug 0
5.启动mysql-mmm-monitor
systemctl start mysql-mmm-monitor.service //启动mysql-mmm-monitor
一、在四台mysql服务器上为mmm_agent受权
>grant super, replication client, process on *.* to 'mmm_agent'@'192.168.100.%' identified by '123456';
二、在全部数据库上为mmm_monitor受权
>grant replication client on *.* to 'mmm_monitor'@'192.168.100.%' identified by '123456';
3.刷新权限
>flush privileges;
四、修改各数据库的mmm_agent.conf的主机名分别为db一、db二、db三、db4
vi /etc/mysql-mmm/mmm_agent.conf ··· this db1 //其余三个服务器分别为db二、db三、db4
五、在全部服务器上启动mysql-mmm-agent服务
systemctl enable mysql-mmm-agent systemctl start mysql-mmm-agent
一、查看各节点状况
mmm_control show db1(192.168.100.155) master/ONLINE. Roles: writer(192.168.100.170) db2(192.168.100.166) master/ONLINE. Roles: db3(192.168.100.159) slave/ONLINE. Roles: reader(192.168.100.171) db4(192.168.100.158) slave/ONLINE. Roles: reader(192.168.100.171)
二、检查全部选项,需均为OK
mmm_control checks all
三、使用下面命令可手动切换主服务器
mmm_control move_role writer db2
一、中止m1服务器的mariadb服务,在检查服务器状态,看m2是否抢占虚拟地址
systemctl stop mariadb mmm_control show db1(192.168.100.155) master/HARD_OFFLINE. Roles: db2(192.168.100.166) master/ONLINE. Roles: writer(192.168.100.170) db3(192.168.100.159) slave/ONLINE. Roles: reader(192.168.100.171) db4(192.168.100.158) slave/ONLINE. Roles: reader(192.168.100.172)
这里db1的虚拟ip地址已经漂移到db2上
二、暂停db3服务器的mariadb服务,在检查状态
systemctl stop mariadb mmm_control show db1(192.168.100.155) master/HARD_OFFLINE. Roles: db2(192.168.100.166) master/ONLINE. Roles: writer(192.168.100.170) db3(192.168.100.159) slave/HARD_OFFLINE. Roles: db4(192.168.100.158) slave/ONLINE. Roles: reader(192.168.100.171),reader(192.168.100.172)
三、恢复db一、db3服务器mariadb服务,在检查状态
mmm_control show db1(192.168.100.155) master/ONLINE. Roles: db2(192.168.100.166) master/ONLINE. Roles: writer(192.168.100.170) db3(192.168.100.159) slave/ONLINE. Roles: reader(192.168.100.171) db4(192.168.100.158) slave/ONLINE. Roles: reader(192.168.100.172)
注:当db1恢复后,并不会抢占vip!