MMM(MySQL主主复制管理器)是一套支持双主故障切换和双主平常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫作双主复制,可是业务上同一时刻只容许对一个主进行写入,另外一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,能够说MMM这套脚本程序一方面实现了故障切换的功能,另外一方面其内部附加的工具脚本也能够实现多个Slave的read负载均衡。mysql
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟IP,同时它还能够备份数据,实现两节点之间的数据同步等。因为MMM没法彻底保证数据的一致性,因此MMM适用于对数据的一致性要求不是很高,可是又想最大程度地保证业务可用性的场景。对于那些数据一致性要求很高的业务,很是不建议采用MMM这种高可用架构。linux
MMM是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理MySQL Master-Master复制的配置。sql
关于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存储引擎。vim
本次项目使用五台centos7服务器模拟搭建centos
主机 | 操做系统 | 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-m一、MariaDB-m二、MariaDB-m三、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-m三、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 <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 172.16.10.23 mode master peer db2 </host> <host db2> ip 172.16.10.20 mode master peer db1 </host> <host db3> ip 172.16.10.24 mode slave </host> <host db4> ip 172.16.10.22 mode slave </host> <role writer> hosts db1, db2 ips 172.16.10.100 mode exclusive </role> <role reader> hosts db3, db4 ips 172.16.10.110, 172.16.10.120 mode balanced </role> </host> <host db4> ip 172.16.10.22 mode slave </host> <role writer> hosts db1, db2 ips 172.16.10.100 mode exclusive </role> <role reader> hosts db3, db4 ips 172.16.10.110, 172.16.10.120 mode balanced </role>
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 //按着顺序分别修改成db一、db二、db三、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 <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 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> <host default> monitor_user mmm_monitor monitor_password 123456 </host> 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会从新回到各自服务器上