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       = 1binlog_format = rowdatadir = /data/mydatasync_binlog = 1autocommit = offrelay-log = /data/relaylog/relay-loginnodb_support_xa = 1sync_master_info = 1sync_relay_log = 1sync_relay_log_info = 1auto-increment-increment = 2auto-increment-offset = 1slave_parallel_threads = 3rpl_semi_sync_master_enabled = 1rpl_semi_sync_master_timeout = 1000rpl_semi_sync_slave_enabled = 1log_slave_updates = 1

node2上配置文件(已实现半同步复制,其余配参数与node1上相同):

server-id       = 2...........auto-increment-increment = 2auto-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       = 3datadir = /data/mydatarelay-log = /data/relaylog/relay-logread_only       = 1slave_parallel_threads = 3sync_master_info = 1sync_relay_log = 1sync_relay_log_info = 1rpl_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 
    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            #代理用户密码 
    ip      192.168.1.106    mode    master    peer    db2 
    ip      192.168.1.126    mode    master    peer    db1 
    ip      192.168.1.127    mode    slave 
    ip      192.168.1.131    mode    slave 
    hosts   db1, db2              #用于写操作的节点    ips     192.168.1.200         #用于写操作的虚拟IP    mode    exclusive             #db1,db2仅有一个被用于写操作
    hosts   db1, db2, db3, db4    #用于读操作的节点    ips     192.168.1.201, 192.168.1.202, 192.168.1.203   #用于读操作的虚拟IP    mode    balanced              #虚拟IP会被均匀分配给以上节点

在monitor节点上(node5)配置/etc/mysql-mmm/mmm_mon.conf:

[root@node5 ~]# vim /etc/mysql-mmm/mmm_mon.conf include mmm_common.conf 
    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_user        mmm_monitor          #监控用户    monitor_password    mmm_monitor          #监控用户密码 debug 0

在各个被监控节点上配置mmm_agent.conf(如果是db2则最后行为this db2,对应于mmm_common.conf文件中的配置

[root@node1 mysql-mmm]# vim /etc/mysql-mmm/mmm_agent.confinclude 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 startStarting MMM Agent Daemon:                                 [  OK  ]

在monitor上启动服务:

[root@node5 ~]# service mysql-mmm-monitor startStarting MMM Monitor Daemon:                               [  OK  ]

在monitor节点上查看mysql服务器状态:

wKioL1XbJ9eSJ3e8AAF3xR5rheg252.jpg

对应节点上的虚拟IP也已经启用:

指向master1(node1)的从服务器有3台,现在停止master1上的mysql服务。

[root@node1 ~]# service mysqld stopShutting down MySQL..                                      [  OK  ]

由图可见master1已显示为offline,且用于写操作的虚拟IP(192.168.1.200)已转移至master2上。在master2上查看有多少个从服务器向本机同步数据。

wKiom1XbKKTisVR9AAEQ4640fbs512.jpg

可以看到两台从服务器已经指向master2(Master_id为2),完成部署.................^_^