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。


实现过程

服务器架构

基于mysql-mmm实现MySQL数据库的高可用_第1张图片

实验环境:

服务器 主机名 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
 

    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.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服务器状态:

基于mysql-mmm实现MySQL数据库的高可用_第2张图片

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

基于mysql-mmm实现MySQL数据库的高可用_第3张图片


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

基于mysql-mmm实现MySQL数据库的高可用_第4张图片

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

基于mysql-mmm实现MySQL数据库的高可用_第5张图片

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

基于mysql-mmm实现MySQL数据库的高可用_第6张图片

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