MMM简介
MMM(Master-Master Replication Manager for MySQL)MySQL主主复制管理器,实现了对MySQL双主复制架构的监控,故障转移和管理。mysql-mmm在实现过程中提供了多个虚拟IP,包括用于写操作的虚拟IP和用于读操作的虚拟IP。在双主复制架构中仅有其中的一台主节点可用于写操作,所有节点包括从节点对外提供读操作。当其中的一个从节点故障时,它持有的虚拟IP会自动转移至其他节点上。若故障的是主节点,它持有的写操作的虚拟IP和读操作的虚拟IP都会自动转移至另外一个主节点,向它同步数据的从节点也会将主服务器指向另一个主节点。
另外用于监控的monitor需要单独部署,可以对monitor节点部署高可用以解决其单点故障。mysql-mmm仅能对mysql数据库实现高可用,若要实现读写分离,负载均衡可以使用Ameoba或mysql-proxy。
实现过程
服务器架构
实验环境:
服务器 | 主机名 | IP地址 | server-id |
master1 | node1 | 192.168.1.106 | 1 |
master2 | node2 | 192.168.1.126 | 2 |
slave1 | node3 | 192.168.1.127 | 3 |
slave2 | node4 | 192.168.1.131 | 4 |
monitor | node5 | 192.168.1.132 |
虚拟IP:
write:192.168.1.200
read:192.168.1.201,192.168.1.202,192.168.1.203
配置过程
1)首先在master和slave节点上安装mariadb-10数据库,5个节点实现时间同步。
2)node1和node2实现双主复制架构
node1上配置文件(以实现半同步复制):
[root@node1 ~]# vim /etc/mysql/my.cnf server-id = 1 binlog_format = row datadir = /data/mydata sync_binlog = 1 autocommit = off relay-log = /data/relaylog/relay-log innodb_support_xa = 1 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 auto-increment-increment = 2 auto-increment-offset = 1 slave_parallel_threads = 3 rpl_semi_sync_master_enabled = 1 rpl_semi_sync_master_timeout = 1000 rpl_semi_sync_slave_enabled = 1 log_slave_updates = 1
node2上配置文件(已实现半同步复制,其余配参数与node1上相同):
server-id = 2 ........... auto-increment-increment = 2 auto-increment-offset = 2
在两个节点上创建授权账号:
MariaDB [(none)]> grant replication slave,replication client on *.* to repuser@'192.168.1.%' identified by 'repuser'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges;
相互以对方为主服务器:
node1上:
MariaDB [(none)]> change master to master_host='192.168.1.126',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;
node2上:
MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;
node1,node2上启动线程:
MariaDB [(none)]> start slave;
3)从服务器node3和node4向node1同步数据
node3配置文件:
server-id = 3 datadir = /data/mydata relay-log = /data/relaylog/relay-log read_only = 1 slave_parallel_threads = 3 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 rpl_semi_sync_slave_enabled = 1
node4配置文件(省略部分与node3一致):
server-id = 4 ....... .......
将node3和node4的主服务器指向node1:
MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;
node3,node4上启动线程:
MariaDB [(none)]> start slave;
4)部署MMM
mysql-mmm工作时,有如下几个服务进程:
mmm_agentd:运行在各mysql服务器上,代理进程。
mmm_control:运行在监控节点上,通过命令行管理mmm_mond进程
mmm_mond:运行在监控节点上,监控守护进程,执行节点的移除等
首先在各个mysql服务器上安装mysql-mmm-agent,在监控节点上安装mysql-mmm-monitor。
在node1-4上:
yum install mysql-mmm-agent
在node5上:
yum install mysql-mmm-monitor
添加代理、监控账号,在其中一个主节点上完成即可。
MariaDB [(none)]> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY 'mmm_monitor'; MariaDB [(none)]> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%' IDENTIFIED BY 'mmm_agent'; MariaDB [(none)]> flush privileges;
所有主机上配置/etc/mysql-mmm/mmm_common.conf(node1-5上),简单起见通过ansible完成。
active_master_role writer <host default> cluster_interface eth0 pid_path /var/run/mysql-mmm/mmm_agentd.pid bin_path /usr/libexec/mysql-mmm/ replication_user repuser #复制用户 replication_password repuser #复制用户密码 agent_user mmm_agent #代理用户 agent_password mmm_agent #代理用户密码 </host> <host db1> ip 192.168.1.106 mode master peer db2 </host> <host db2> ip 192.168.1.126 mode master peer db1 </host> <host db3> ip 192.168.1.127 mode slave </host> <host db4> ip 192.168.1.131 mode slave </host> <role writer> hosts db1, db2 #用于写操作的节点 ips 192.168.1.200 #用于写操作的虚拟IP mode exclusive #db1,db2仅有一个被用于写操作 </role> <role reader> hosts db1, db2, db3, db4 #用于读操作的节点 ips 192.168.1.201, 192.168.1.202, 192.168.1.203 #用于读操作的虚拟IP mode balanced #虚拟IP会被均匀分配给以上节点 </role>
在monitor节点上(node5)配置/etc/mysql-mmm/mmm_mon.conf:
[root@node5 ~]# vim /etc/mysql-mmm/mmm_mon.conf include mmm_common.conf <monitor> ip 127.0.0.1 pid_path /var/run/mysql-mmm/mmm_mond.pid bin_path /usr/libexec/mysql-mmm status_path /var/lib/mysql-mmm/mmm_mond.status ping_ips 192.168.1.106,192.168.1.126,192.168.1.127,192.168.1.131 #被监控的服务器IP地址 auto_set_online 60 </monitor> <host default> monitor_user mmm_monitor #监控用户 monitor_password mmm_monitor #监控用户密码 </host> debug 0
在各个被监控节点上配置mmm_agent.conf(如果是db2则最后行为this db2,对应于mmm_common.conf文件中的配置)
[root@node1 mysql-mmm]# vim /etc/mysql-mmm/mmm_agent.conf include mmm_common.conf # The 'this' variable refers to this server. Proper operation requires # that 'this' server (db1 by default), as well as all other servers, have the # proper IP addresses set in mmm_common.conf. this db1
在各个mysql服务器节点上启动服务:
[root@node1 mysql-mmm]# service mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ]
在monitor上启动服务:
[root@node5 ~]# service mysql-mmm-monitor start Starting MMM Monitor Daemon: [ OK ]
在monitor节点上查看mysql服务器状态:
对应节点上的虚拟IP也已经启用:
指向master1(node1)的从服务器有3台,现在停止master1上的mysql服务。
[root@node1 ~]# service mysqld stop Shutting down MySQL.. [ OK ]
由图可见master1已显示为offline,且用于写操作的虚拟IP(192.168.1.200)已转移至master2上。在master2上查看有多少个从服务器向本机同步数据。
可以看到两台从服务器已经指向master2(Master_id为2),完成部署.................^_^