MMM(MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个Slave的read负载均衡。
创新互联2013年开创至今,先为同仁等服务建站,同仁等地企业,进行企业商务咨询服务。为同仁企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟IP,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。对于那些数据一致性要求很高的业务,非常不建议采用MMM这种高可用架构。
MMM是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理MySQL Master-Master复制的配置。
关于MMM高可用架构的说明如下
- mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上面运行
- mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在监管机上面运行
- mmm_control:一个简单的脚本,提供mmm_mond进程的命令
- mysql_mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理。这些IP会绑定在可用MySQL之上,当某一台MySQL宕机时,监管会将VIP迁移至其他MySQL。
在整个监管过程中,需要在MySQL中添加相关授权用户,以便让MySQL可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用MMM的备份工具则还要添加一个mmm_tools用户。
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。MariaDB基于事务的Maria存储引擎,替换了MySQL的MyISAM存储引擎,它使用了Percona的 XtraDB,InnoDB的变体,分支的开发者希望提供访问即将到来的MySQL 5.4 InnoDB性能。这个版本还包括了 PrimeBase XT (PBXT) 和 FederatedX存储引擎。
本次项目使用五台centos7服务器模拟搭建
主机 | 操作系统 | IP地址 | VIP | 主要软件 |
---|---|---|---|---|
MariaDB-m1 主服务器 | CentOS-7-x86_64 | 172.16.10.23 | 172.16.10.100 | MariaDB、MMM |
MariaDB-m2 主服务器 | CentOS-7-x86_64 | 172.16.10.20 | 172.16.10.100 | MariaDB、MMM |
MariaDB-m3 从服务器 | CentOS-7-x86_64 | 172.16.10.24 | 172.16.10.110 | MariaDB、MMM |
MariaDB-m4 从服务器 | CentOS-7-x86_64 | 172.16.10.22 | 172.16.10.120 | MariaDB、MMM |
MariaDB-monitor | CentOS-7-x86_64 | 172.16.10.21 | MMM |
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 //清空所有,重新更新元数据缓存
配置epel源须在五台服务器上都操作
yum -y install mariadb-server mariadb
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
以上三个步骤在另外三台数据库服务器上一摸一样,重复三遍
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
log_bin=mysql_bin //二进制日志文件功能开启
server_id=10 //id每台都不相同
log_slave_updates=true //开启同步
sync_binlog=1 //1为安全值
auto_increment_increment=2
auto_increment_offset=1
systemctl start mariadb //开启服务
netstat -anpt | grep 3306 //查看服务状态
配置文件修改时,只需将原有的[mysqld]直接删除,大约九行。替换为以上内容,四台服务器(MariaDB-m1、MariaDB-m2、MariaDB-m3、MariaDB-m4)的修改方法基本一致,唯一的不同是server_id不可相同,只要不同即可。
mysql //登陆数据库
show master status;
#MariaDB-m1
grant replication slave on *.* to 'replication'@'172.16.10.%' identified by '123456';
//使用账户为replication 密码为123456
change master to master_host='172.16.10.20',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245;
//当在MariaDB-m1上执行时,master_host地址为MariaDB-m2地址
···
#MariaDB-m2
grant replication slave on *.* to 'replication'@'172.16.10.%' identified by '123456';
//在两台master上分别执行,slave不需要执行
change master to master_host='172.16.10.23',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245;
//当在MariaDB-m2上执行时,master_host地址为MariaDB-m1地址
start slave;
show slave status\G;
在主服务器上创建一个库,然后查看从服务器上是否有新创建的库,若新创建库存在;则再尝试在从服务器上删除新创建的库,若是此时主服务器上的库被成功删除,则表示主主复制创建成功。
在MariaDB-m3、MariaDB-m4上进行操作
mysql
show master status;
注意日志文件和位置参数的改变
change master to master_host='172.16.10.23',master_user='replication',master_password='123456',master_log_file='mysql_bin.000004',master_log_pos=245;
start slave;
show slave status\G;
我们在最开始的操作中已经对所有的五台服务器都安装了epel源,所以这里只需要使用yum安装即可,所有的服务器都需安装mysql-mmm*
yum -y install mysql-mmm*
五台服务器中的该配置文件都是相同的
vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
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
ip 172.16.10.23
mode master
peer db2
ip 172.16.10.20
mode master
peer db1
ip 172.16.10.24
mode slave
ip 172.16.10.22
mode slave
hosts db1, db2
ips 172.16.10.100
mode exclusive
hosts db3, db4
ips 172.16.10.110, 172.16.10.120
mode balanced
ip 172.16.10.22
mode slave
hosts db1, db2
ips 172.16.10.100
mode exclusive
hosts db3, db4
ips 172.16.10.110, 172.16.10.120
mode balanced
scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.20:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.24:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.22:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.21:/etc/mysql-mmm/
vim /etc/mysql-mmm/mmm_agent.conf
this db1 //按着顺序分别修改为db1、db2、db3、db4
grant super, replication client, process on *.* to 'mmm_agent'@'172.16.10.%' identified by '123456';
grant replication client on *.* to 'mmm_monitor'@'172.16.10.%' identified by '123456';
flush privileges;
systemctl start mysql-mmm-agent.service //开启服务
systemctl enable mysql-mmm-agent.service //加入开机自启动
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.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 172.16.10.23,172.16.10.20,172.16.10.24,172.16.10.22
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_user mmm_monitor
monitor_password 123456
debug 0
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
systemctl start mysql-mmm-monitor.service
ERROR: Can't connect to monitor daemon!,如若出现报错,可尝试重启服务解决
mmm_control checks all //检查结果需为全部ok
systemctl stop mariadb.service //关闭m1
systemctl start mariadb.service //开启m1 主不会抢占
systemctl stop mariadb.service //关闭m3
systemctl start mariadb.service //开启m3,VIP会重新回到各自服务器上