MMM高可用mysql方案是一个通过Perl编写的、基于MySQL主从复制的、成熟完善的MySQL高可用集群解决方案,有一个管理端(monitor)和多个代理端(agent)构成。通过MMM可以实现监控和管理MySQL主主复制和服务状态,同时也可以监控多个slave节点的复制以及运行状态,并且可以做到任意节点发生故障时实现自动切换的功能。在整个集群中,同一时刻只有一个master是可写的。
MMM套件主要的功能是通过三个脚本来实现的:
1.mmm_mond
这是一个监控进程,运行在管理节点上,主要负责对所有数据库的监控工作,同时决定和处理所有节点的角色切换。
2.mmm_agentd
这是一个代理进程,运行在每台MySQL服务器上,主要完成监控的测试工作以及执行简单的远端服务设置。
3.mmm_control
这是一个简单的管理脚本,用来查看和管理集群运行状态,同时管理mmm_mond进程

缺点:
MMM架构需要多个节点,多个ip,对服务器数量有要求;其次,MMM方案在读、写非常繁忙的业务系统下表现不是很稳定,可能会出现复制延时、切换失效等问题。因此,MMM方案并不太适应于数据安全性要求很高,并且读、写频繁的环境中。

MMM有多种应用架构,最简单的是两个节点的运行环境。如下图:
MMM高可用mysql方案_第1张图片

在通过MMMt套件实现的双Master架构中,需要5个ip地址,两个maser节点各有的一个固定不变的物理ip地址,另外还有两个只读ip和一个可写ip,这三个虚拟ip不会固定在任何一个节点上,相反,她会在两个master节点之间来回切换,如何切换取决于节点的可用性。
在正常情况下(系统、网络正常,MySQL服务正常,主从复制正常,没有复制延迟等),Master1有两个虚拟IP(reader ip和wirter ip),Master2上有一个虚拟IP(reader ip),如果Master1发生故障,那么所有的reader和writer虚拟IP都会被分配至Master2。
在双Master节点的基础上,增加多个slave节点,即可实现双主多从节点应用架构。如下图:
MMM高可用mysql方案_第2张图片
双主多从节点的MySQL架构适合读查询量非常大的业务环境。此架构通过两个Master实现MySQL写操作的高可用,然后在Master后端又增加了多个Slave节点,所有的Slave节点只能进行读查询操作,而多个Slave节点之间可以通过LVS,HAProxy等负载均衡软件实现MySQL读操作的负载均衡。

此架构需要5台独立的服务器,其中一台MMM管理节点,两台mysql的Master节点,还有两台mysql的slave节点。

双主双从集群配置环境
主机名 物理IP 集群角色 Server_id
Monitor 192.168.88.11 MMM管理器
Master1 192.168.88.20 主Master可读、可写 1
Master2 192.168.88.21 备Master可读、可写 2
Slave1 192.168.88.22 Salve节点只读 3
Slave2 192.168.88.23 Salve节点只读 4

双主双从应用架构读、写分离IP列表

虚拟IP地址 IP角色 功能描述
192.168.88.30 writer IP 应用程序配置中的写入VIP,仅支持单点写入
192.168.88.31 /192.168.88.32/192.168.88.33/192.168.88.34 reader IP 应用程序配置中的读查询VIP,每个数据库节点一个读VIP,可以通过LVS,HAProxy等负载均衡软件对读VIP做负载均衡

MMM的安装与配置
1.MMM套件安装
#安装epel源https://fedoraproject.org/wiki/EPEL/zh-cn
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#在Monitor节点执行如下命令
yum -y install mysql-mmm*
#每个MySQL DB节点只要安装mysql-mmm-agent即可
yum -y install mysql-mmm-agent
2.MMM集群套件的配置
在进行MMM套件配置之前,需要配置好Master到Master2主主互为同步,Master1到Slave1、Slave2主从同步。需要注意,在配置Slave1、Slave2和Master同步时,‘master_host’的地址要填Master1节点的物理ip,而不是虚拟ip。
由于MMM集群套件对数据的读、写进行了严格控制,根据MMM的管理机制,需要首先在所有Mysql主机上设置read_only参数,也就是在/etc/my.cnf的mysqld配置段添加:
read_only = 1

在所有MySQL节点创建除复制账号之外的另外两个账号,monitor user和monitor agent:

GRANT REPLICATION CLIENT ON . TO 'mmm_monitor'@'192.168.88.%' IDENTIFIED BY '123456';
GRANT SUPER,REPLICATION CLIENT,PROCESS ON . TO 'mmm_agent'@'192.168.88.%' IDENTIFIED BY '123456';

主要涉及4个配置文件:mmm_mon.conf、mmm_common.conf、mysql-mmm-agent和mmm_agent.conf。其中,mmm_mon.conf仅在MMM管理端配置,mmm_common.conf需要在所有MMM集群节点进行配置,内容完全一样,mmm_agent.conf也需要在所有Mysql节点进行配置。
(1)配置mmm_common.conf文件

active_master_role writer #当设置这个参数时,集群中所有mysql节点都应该设置‘read_only=1’参数,这样,MMM会根据每个节点的角色进行动态判断,当MMM设置写角色的时候,会自动在可写节点执行‘set global read_only = 0’操作,也就是打开写权限,其他只读的角色保持‘read_only=1’的只读权限,


cluster_interface eth0 #配置的网络接口,这里不能指定为子接口,如eth0:0
pid_path /run/mysql-mmm-agent.pid #设定PID文件位置
bin_path /usr/libexec/mysql-mmm/ #设定MMM可执行文件路径
replication_user repl_user #设定复制的用户名
replication_password 123456 #设定复制的密码
agent_user mmm_agent #设定更改只读操作的用户
agent_password 123456 #设定更改操作用户的密码

#设定db1的配置信息,db1会在mmm_agent.conf文件中定义
ip 192.168.88.20 #设定db1的物理ip地址
mode master #设置db1的角色为Master
peer db2 #设置与db1对等的主机名,也就是db1和db2均为Master角色

#设定db2的配置信息,db2会在mmm_agent.conf文件中定义
ip 192.168.88.21 #设定db2的物理ip地址
mode master #设置db2的角色为Master
peer db1 #设置与db2对等的主机名,也就是db1和db2均为Master角色

#设定db3的配置信息,db2会在mmm_agent.conf文件中定义
ip 192.168.88.22 #设定db3的物理ip地址
mode slave #设置db3的角色为Slave

#设定db4的配置信息,db2会在mmm_agent.conf文件中定义
ip 192.168.88.23 #设定db4的物理ip地址
mode slave #设置db4的角色为Slave

#设置可写角色模式
hosts db1, db2 #设置可执行写操作的主机
ips 192.168.100.250 #设置可写的虚拟IP地址
mode exclusive #设置角色模式为互斥,互斥角色只有一个ip并且同一时间只能分配给一个主机,一般writer角色是exclusive模式

#设置可读角色模式
hosts db1,db2,db3, db4 #设置可读操作的主机
ips 192.168.88.31,192.168.88.32,192.168.88.33,192.168.88.34,#设置可读的虚拟IP地址
mode balanced #设置角色的模式为负载均衡,在负载均衡角色中,可以有多个IP,这些IP被均衡动态地分配给多台MySQL主机,一般reader角色是balanced模式

(2)配置mmm_agent.conf文件

include mmm_common.conf
this db1 #对应的主机名,Master2对应的主机名为db2

(3)配置mmm_mon.conf文件
include mmm_common.conf


ip 127.0.0.1 #为了安全性,设置只在本机监听,默认端口为9988
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.88.1,192.168.88.20,192.168.88.21,192.168.88.22,192.168.88.23 #用于测试网络可用性的ip地址列表,只要其中一个地址能ping通,就代表网络正常,这里不重要,写入本机的IP地址
flap_duration 3600 #抖动的时间范围,默认3600s
flap_count 3 #在抖动的时间范围内,最大抖动次数
auto_set_online 0 #抖动的时间范围过后,则设置自动上线


monitor_user mmm_monitor #monitor user账号
monitor_password 123456 #monitor user密码

debug 0 #MMM管理端的运行模式,1为debug模式,0为正常模式

(4)配置mysql-mmm-agent文件
/etc/default/mysql-mmm-agent,它要在MMM集群的所有Mysql节点设置,此文件内容只有一行:ENABLED=1

MMM集群中所有配置文件的权限最好设置为640,否则启动MMM服务的时候可能出错。

#在MMM集群管理端启动mysql-mmm-monitor服务
systemctl start mysql-mmm-monitor
#在每个agent端依次启动agent服务
systemctl start mysql-mmm-agent

MMM基本维护:

查看运行状态
一种是通过MMM集群提供的mmm_control(仅在管理端存在)命令,另一种是查看MMM集群的运行日志信息,MMM集群的运行日志位于每个集群节点的/var/log/mysql-mmm下。

mmm_control help #显示帮助信息
ping #测试网络运行状态
show #显示MMM集群中所有节点的状态
checks [|all []] #显示MMM集群中指定节点的详细状态或
显示所有节点的详细运行状态
set_online #将一个MMM集群节点设置为online状态
set_offline #将一个MMM集群节点设置为offline状态
mode #显示MMM集群当前的运行模式,有active、manual和
passive三种模式,默认是active模式
set_active #切换到active模式
set_manual #切换到set_manual模式
set_passive #切换到passive模式
move_role [--force] #在互斥模式下切换角色,例如将写操作
从db1切换到db2
set_ip #用来在被动模式下操作角色

MMM整合Amoeba应用架构
MMM高可用mysql方案_第3张图片

#下载amoeba-mysql-3.0.5-RC-distribution.zip
wget http://jaist.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/3.x/amoeba-mysql-3.0.5-RC-distribution.zip
#下载jdk,配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_171
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt,jar:$JAVA_HOME/lib/dr.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

Amoeba配置文件比较多,但是仅仅使用读、写分离功能,只需配置dbServers.xml和amoeba.xml,如果需要配置IP访问控制,还需要修改access_list.conf文件。