Linux运维:通过MMM构建MySQL高可用集群系统

Posted 计算机与网络安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux运维:通过MMM构建MySQL高可用集群系统相关的知识,希望对你有一定的参考价值。

一次性付费进群,长期免费索取教程,没有付费教程。

 教程列表  见微信公众号底部菜单 |   本文底部有推荐书籍 

ID:Computer-network


双主互备的mysql高可用解决方案通过MySQL的主从复制功能实现了MySQL集群的数据同步功能,同时通过Keepalived实现任意节点故障后自动切换到另一个节点的故障转移功能。这个架构非常适用于对MySQL持续服务要求比较高的场合,但是此方案也有一些缺陷:首先,任意时刻只有一个节点对外提供服务,另一个节点处于数据同步状态,不对外提供任何服务,这在一定程度上浪费了资源;其次,MySQL主从复制支持一主多从架构,这对于读操作比较大的Web业务系统来说,可以将读的压力分散到多个Slave上,而双主互备架构显然没有充分发挥MySQL复制的优势;最后,如果在双主互备的基础上增加多个Slave节点,将会出现问题,因为在Master节点切换到备用Master节点后,多个Slave节点的“Master_Host”无法自动切换到备用Master节点,从而导致整个MySQL高可用架构出现问题。


要解决这些问题其实并不难,通过MMM集群套件(MySQL主主复制管理器)即可轻松实现。本文介绍通过MMM集群套件来构建高性能的MySQL集群系统。


1、MMM高可用MySQL方案简介


MMM高可用MySQL方案是一个通过Perl编写的、基于MySQL主从复制的、成熟完善的MySQL高可用集群解决方案,由一个管理端(monitor)和多个代理端(agent)构成。通过MMM可以实现监控和管理MySQL主主复制和服务状态,同时也可以监控多个Slave节点的复制以及运行状态,并且可以做到任意节点发生故障时实现自动切换的功能。MMM集群方案的出现为MySQL的读、写分离架构的应用提供了一个很好的平台,这是因为MMM集群方案将读IP(reader IP)和写IP(writer IP)从数据库层面提取出来,在业务系统只需调用即可实现读、写分离功能。


虽然MMM是一个MySQL主主复制管理器,但是在整个集群中,同一时刻只有一个Master是可写的,这样做是为了保证数据的完整性和安全性。


MMM套件主要的功能是通过下面三个脚本来实现的。


mmm_mond:这是一个监控进程,运行在管理节点上,主要负责对所有数据库的监控工作,同时决定和处理所有节点的角色切换。


mmm_agentd:这是一个代理进程,运行在每台MySQL服务器上,主要完成监控的测试工作以及执行简单的远端服务设置。


mmm_control:这是一个简单的管理脚本,用来查看和管理集群运行状态,同时管理mmm_mond进程。


MMM集群套件具有良好的稳定性、高可用性和可扩展性,当活动的Master服务器故障以后,备用Master服务器会立刻接管,而其他的Slave服务器也能自动切换到备用Master服务器继续进行同步复制,整个过程无需人为干预。


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


2、MMM典型应用方案


MMM有多种应用架构,最简单的是两个节点的运行环境,如图1所示。

Linux运维:通过MMM构建MySQL高可用集群系统

图1  MMM双Master节点应用架构


双Master节点的MySQL应用架构与MySQL双主架构完全相同,所不同的是这里的双Master架构是通过MMM管理套件实现的,而双主架构是通过Keepalived实现的。



在正常情况下(系统、网络正常,MySQL服务正常,主从复制正常,没有复制延迟等),Master1有两个虚拟IP(reader IP和writer IP),Master2有一个虚拟IP(reader IP),如果Master1发生故障,那么所有的reader和writer虚拟IP都会被分配给Master2。


在双Master节点的基础上,增加多个Slave节点,即可实现双主多从节点应用架构,如图2所示。

Linux运维:通过MMM构建MySQL高可用集群系统

图2  MMM双主多从节点应用架构


双主多从节点的MySQL架构适合读查询量非常大的业务环境,通过MMM提供的reader IP和writer IP可以轻松实现MySQL的读、写分离架构。此架构通过两个Master实现MySQL写操作的高可用,然后在Master后端又增加了多个Slave节点,所有的Slave节点只能进行读查询操作,而多个Slave节点之间可以通过LVS、HAProxy等负载均衡软件实现MySQL读操作的负载均衡。


MMM套件的优势在于:它不但可以监控两个Master节点的运行状态,还可以监控多个Slave节点的运行状态,任何一个节点出现问题,都会将失败节点对应的虚拟IP自动实现切换到其他健康的节点上,保持读、写服务的连续性和高可用性。


MMM不仅能提供虚拟IP自动转移功能,更重要的是,如果活动的Master节点发生故障,会自动将后端的多个Slave节点转向备用的Master节点继续进行同步复制,整个过程完全不需要手工更改同步复制的配置,这是其他所有MySQL高可用集群方案都不具备的功能。

3、MMM高可用MySQL方案架构


根据上面介绍的MMM应用方案,下面介绍通过MMM集群套件如何实现双主双从节点的典型应用架构,如图3所示。

Linux运维:通过MMM构建MySQL高可用集群系统

图3  双主双从的MySQL高可用集群架构


此架构需要5台独立的服务器,其中一台MMM管理节点,两台MySQL的Master节点,还有两台MySQL的Slave节点,服务器配置环境如表1所示。

Linux运维:通过MMM构建MySQL高可用集群系统

表1  双主双从集群配置环境


MMM双主双从应用架构对应的读、写分离IP列表如表2所示。

Linux运维:通过MMM构建MySQL高可用集群系统

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


4、MMM的安装与配置


(1)MMM套件的安装


出于安装方便的考虑,这里推荐通过yum源方式进行安装MMM套件,而CentOS的默认源中没有MMM的安装包,因此需要首先安装一个epel的yum源。可以通过http://fedoraproject.org/wiki/EPEL/zh-cn下载与操作系统版本对应的yum源,这里下载的是epel-release-6-8.noarch.rpm,将此RPM文件在MMM集群的所有节点安装即可,过程如下:


[root@Monitor mmm]# rpm -Uvh epel-release-6-8.noarch.rpm


完成yum源安装后,就可以直接安装MMM集群套件了,在Mnoitor节点执行如下命令:


[root@Monitor mmm]# yum -y install mysql-mmm*


在每个MySQL DB节点只需要安装mysql-mmm-agent即可,因此可执行如下命令:


[root@Master1 mysql]# yum -y install mysql-mmm-agent


完成安装后,查看下安装的mysql-mmm版本信息,执行如下命令:


[root@Monitor mmm]# rpm -qa|grep mysql-mmm

mysql-mmm-agent-2.2.1-2.el6.noarch

mysql-mmm-tools-2.2.1-2.el6.noarch

mysql-mmm-2.2.1-2.el6.noarch

mysql-mmm-monitor-2.2.1-2.el6.noarch


这里安装的MMM套件版本为mysql-mmm-2.2.1-2。至此,MMM集群套件安装完成。


(2)MMM集群套件的配置



由于MMM集群套件对数据的读、写进行了严格控制,根据MMM的管理机制,需要首先在所有的MySQL主机上设置read_only参数,也就是在/etc/my.cnf的mysqld配置段中添加如下参数:


read_only = 1


这个参数可以对所有的非临时表进行只读控制,不过它有两个例外,分别是:


对replication threads例外,因此不用担心数据无法复制到这些节点,它可以保证Slave节点能够正常进行复制。


对于拥有超级权限的用户例外,也就是说MySQL的root用户不受这个参数的控制,所以在设置此参数后,需要用一个普通用户进行读写权限的测试才有效果。


完成以上所有设置后,重新启动所有节点的MySQL服务。


要配置MMM,需要先在所有MySQL节点创建除复制账号之外的另外两个账号,即monitor user账号和monitor agent账号。其中,monitor user账号是MMM管理服务器用来对所有MySQL服务器做健康检查的,而monitor agent账号用来切换只读模式和同步Master信息。创建这两个账号的SQL语句为:


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


记住这里设置的账户名和密码,下面配置MMM时会用到。


通过yum源方式安装MMM后,默认配置文件目录为/etc/mysql-mmm。关于MMM的配置主要涉及4个配置文件,分别是mmm_mon.conf、mmm_common.conf、mysql-mmm-agent和mmm_agent.conf,其中,mmm_mon.conf仅在MMM管理端进行配置,主要用于设置一些监控参数;mmm_common.conf文件需要在所有的MMM集群节点进行配置,且内容完全一样,主要用于设置读、写节点的IP及配置虚拟IP;mmm_agent.conf也需要在所有MySQL节点进行配置,用来设置每个节点的标识。


1)配置mmm_common.conf文件


这里首先看一下mmm_common.conf文件的配置,配置好的mmm_common.conf内容如下:


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

<host default>
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 #设定更改操作用户的密码 
</host>


2)配置mmm_agent.conf文件


接下来看一下mmm_agent.conf文件,此文件非常简单,主要用来定义集群中的主机,在mmm_common.conf文件中使用的db1、db2等名称都是在此文件中定义的。下面给出Master1节点mmm_agent.conf文件的内容:


include mmm_common.conf
this db1


其中,include参数将mmm_common.conf文件引用了进来,this参数指定了Master1节点在MMM集群中对应的主机名为db1,其他节点mmm_agent.conf文件内容依此类推,即Master2节点对应的主机名为db2,Slave1节点对应的主机名为db3,Slave2节点对应的主机名为db4。这里不再给出其他三个节点中mmm_agent.conf文件的内容。


3)配置mmm_mon.conf文件


mmm_mon.conf配置文件仅在MMM管理节点上设置,配置好的mmm_mon.conf文件内容如下:


include mmm_common.conf

</monitor>

<host default>
monitor_user mmm_monitor #monitor user账号
monitor_password 123456 #monitor user密码
</host>
debug 0 #MMM管理端的运行模式,1为debug模式,0为正常模式


4)配置mysql-mmm-agent文件


最后还有一个文件/etc/default/mysql-mmm-agent,它要在MMM集群所有的MySQL节点进行设置,此文件的内容只有一行,确保此文件在所有MySQL节点的内容为:


ENABLED=1


至此,MMM集群的4个主要配置文件介绍完毕。完成所有文件配置后,将mmm_common.conf文件从MMM集群管理节点依次复制到4个MySQL节点即可。这里需要注意的是,MMM集群中所有配置文件的权限最好都设置为640,否则启动MMM服务的时候可能出错。

5、MMM的管理


(1)MMM集群服务管理


MMM集群套件在安装完成后会在系统的/etc/init.d/目录下生成mysql-mmm-monitor和mysql-mmm-agent两个服务管理脚本,其中mysql-mmm-monitor文件用来管理MMM集群控制端的服务启动与关闭,而mysql-mmm-agent负责管理MMM集群中每个agent端(所有Mysql服务节点)服务的启动和关闭。这两个脚本的相关用法如下:


[root@Monitor init.d]# /etc/init.d/mysql-mmm-monitor 

Usage: /etc/init.d/mysql-mmm-monitor {start|stop|restart|condrestart|status}

[root@Master1 init.d]# /etc/init.d/mysql-mmm-agent 

Usage: /etc/init.d/mysql-mmm-agent {start|stop|restart|condrestart|status}


在完成MMM集群配置后,就可以通过这两个脚本来启动MMM集群,首先在MMM集群管理端启动mysql-mmm-monitor服务,可执行如下命令:


[root@Monitor init.d]# /etc/init.d/mysql-mmm-monitor start


然后在每个agent端依次启动agent服务,执行操作如下:


[root@Master1 init.d]# /etc/init.d/mysql-mmm-agent start


这样MMM集群服务就可以运行了。


(2)MMM基本维护管理


查看集群的运行状态有两种方式,一种是通过MMM集群提供的mmm_control(仅在MMM管理端存在)命令,另一种是查看MMM集群的运行日志信息,MMM集群的运行日志位于每个集群节点的/var/log/mysql-mmm目录下,可通过查看日志文件了解集群的运行状态。这里重点介绍通过mmm_control工具查看和管理MMM集群。


要查看mmm_control工具的用法,执行“mmm_control help”命令即可显示,操作如下:


[root@Monitor init.d]# mmm_control help

Valid commands are:

help     #显示帮助信息

ping     #测试网络运行状态

show    #显示MMM集群中所有节点的状态

checks [<host>|all [<check>|all]] #显示MMM集群中指定节点的详细状态或显示所有节点的详细运行状态

set_online <host>  #将一个MMM集群节点设置为online状态

set_offline <host>  #将一个MMM集群节点设置为offline状态

mode    #显示MMM集群当前的运行模式,有active、manual和passive三种模式,默认是active模式

set_active       #切换MMM集群到active模式

set_manual     #切换MMM集群到manual模式

set_passive     #切换MMM集群到passive模式

move_role [--force] <role> <host> #在互斥模式下切换角色,例如将写操作从db1切换到db2


set_ip <ip> <host>  #用来在被动模式下操纵角色


下面列举几个常用的MMM集群维护管理的例子。例如,要查看集群运行状态,可执行如下命令:


[root@Monitor mysql-mmm]# mmm_control show

db1(192.168.88.20) master/ONLINE. Roles: reader(192.168.88.31), writer(192.168.88.30)

db2(192.168.88.21) master/ONLINE. Roles: reader(192.168.88.32)

db3(192.168.88.22) slave/ONLINE. Roles: reader(192.168.88.33)

db4(192.168.88.23) slave/ONLINE. Roles: reader(192.168.88.34)



ONLINE:表示节点运行正常,处于在线状态。


ADMIN_OFFLINE:表示节点是通过手动模式离线的。


HARD_OFFLINE:表示节点处于离线状态,这一般是由于MMM集群脚本执行ping操作失败或检测MySQL失败而切换的一种状态。


AWAITING_RECOVERY:表示等待恢复状态,如果MMM集群设置的是active运行模式,那么此状态将会自动恢复到ONLINE状态。


REPLICATION_FAIL:表示主从复制失败状态,一般是由于复制主线程没有运行导致的。


REPLICATION_DELAY:表示复制日志有延时,一般是由于检查日志失败导致的。


如果要查看MMM集群目前处于什么运行模式,可执行如下命令:


[root@Monitor mysql-mmm]# mmm_control mode

ACTIVE


由输出可知,MMM集群目前运行于active模式,MMM支持active、manual和passive三种模式。


active:表示主动模式,该模式是默认的,即活动的Master发生故障后另一个备份的Master可自动接管故障Master的角色,继续提供服务;如果Slave节点发生故障,其他健康的Slave节点也会自动接管故障Slave节点的服务,继续提供服务。此模式是经常使用的。


manual:表示手动模式,该模式不会执行自动切换操作,如果某个集群节点发生故障,需要手动切换到其他健康的节点。此模式一般用于特殊的场景中。


passive:表示被动模式,在被动模式下,MMM管理端不会改变集群中节点的角色,也不更新状态文件和发送任何信息给每个agent节点,在启动的节点角色发生冲突时将会进入被动模式。此模式一般不用。


如果要查看所有MMM集群节点的运行状态,可执行如下命令:


[root@Monitor mysql-mmm]# mmm_control checks all

db4  ping     [last change: 2019/09/13 15:11:34]  OK

db4  mysql   [last change: 2019/09/13 15:11:34]  OK

db4  rep_threads  [last change: 2019/09/13 15:11:34]  OK

db4  rep_backlog  [last change: 2019/09/13 15:11:34]  OK: Backlog is null

db2  ping  [last change: 2019/09/13 15:11:34]  OK

db2  mysql   [last change: 2019/09/13 15:11:34]  OK

db2  rep_threads  [last change: 2019/09/13 15:11:34]  OK

db2  rep_backlog  [last change: 2019/09/13 15:11:34]  OK: Backlog is null

db3  ping  [last change: 2019/09/13 15:11:34]  OK

db3  mysql   [last change: 2019/09/13 15:11:34]  OK

db3  rep_threads  [last change: 2019/09/13 15:11:34]  OK

db3  rep_backlog  [last change: 2019/09/13 15:11:34]  OK: Backlog is null

db1  ping   [last change: 2019/09/13 15:11:34]  OK

db1  mysql   [last change: 2019/09/13 15:11:34]  OK

db1  rep_threads  [last change: 2019/09/13 15:11:34]  OK

db1  rep_backlog  [last change: 2019/09/13 15:11:34]  OK: Backlog is null


而要单独查看某个节点的运行状态,可执行如下命令:


root@Monitor mysql-mmm]# mmm_control checks db1

db1  ping   [last change: 2019/09/13 15:11:34]  OK

db1  mysql   [last change: 2019/09/13 15:11:34]  OK

db1  rep_threads  [last change: 2019/09/13 15:11:34]  OK

db1  rep_backlog  [last change: 2019/09/13 15:11:34]  OK: Backlog is null


从这个输出可以看出,mmm_mond进程会对每个节点执行四项检查,并且确定检查是否成功,这四项检查的含义为:


ping主要用来测试网络可用性。


mysql用来检测MySQL服务器是否运行正常。


rep_threads用来检测MySQL的复制线程是否正常运行。


rep_backlog用来检测MySQL的复制日志是否有挤压。


在这四项检测中,任何一项出现问题,都会进行角色切换操作,MMM集群正是通过这四项健康检查来保证MySQL服务的高可用性。


6、测试MMM实现MySQL高可用功能


为了确保MMM集群已经正常运行,下面重点测试一下MMM所实现的读、写分离功能和故障转移功能。


(1)读、写分离测试


图4  通过写VIP测试MySQL写操作


由上面的操作可知,通过可写的VIP登录了Master1节点,这里创建了一张表mmm_test,并且插入了一条数据。此时可以登录Master2节点、Slave1节点和Slave2节点,查看下数据是否已经同步过去。


接着仍在MySQL远程客户端通过MMM提供的只读VIP登录MySQL集群,测试过程如图5所示。

图5  通过读VIP测试数据同步和读、写限制功能



(2)故障转移功能测试


故障转移分为Master节点故障转移和Slave节点故障转移。为了进行状态比较,这里首先检查下MMM目前的集群运行状态,信息如下:


[root@Monitor mysql-mmm]# mmm_control show

db1(192.168.88.20) master/ONLINE. Roles: reader(192.168.88.31), writer(192.168.88.30)

db2(192.168.88.21) master/ONLINE. Roles: reader(192.168.88.32)

db3(192.168.88.22) slave/ONLINE. Roles: reader(192.168.88.33)

db4(192.168.88.23) slave/ONLINE. Roles: reader(192.168.88.34)


接着,关闭Master1节点的MySQL服务,再次查看MMM集群运行状态,信息如下:


[root@Monitor mysql-mmm]# mmm_control show

db1(192.168.88.20) master/HARD_OFFLINE. Roles:

db2(192.168.88.21) master/ONLINE. Roles: reader(192.168.88.32),writer(192.168.88.30)

db3(192.168.88.22) slave/ONLINE. Roles: reader(192.168.88.31)

db4(192.168.88.23) slave/ONLINE. Roles: reader(192.168.88.34)


从输出信息可知,Master1目前处于HARD_OFFLINE状态,之前在Master1上面运行的写VIP自动切换到Master2,而读VIP自动切换到Slave1。为了验证切换后是否正常,还可以继续执行上面的读、写分离测试,检查一下Master节点切换后,能否正常实现数据的同步功能以及读、写分离的限制。


接着上面的测试继续进行,重新启动Master1节点上的MySQL服务,然后查看MMM集群的运行状态,信息如下:


[root@Monitor mysql-mmm]# mmm_control show

db1(192.168.88.20) master/ONLINE. Roles: reader(192.168.88.31)

db2(192.168.88.21) master/ONLINE. Roles: reader(192.168.88.32),writer(192.168.88.30)

db3(192.168.88.22) slave/ONLINE. Roles: reader(192.168.88.33)

db4(192.168.88.23) slave/ONLINE. Roles: reader(192.168.88.34)



[root@Monitor mysql-mmm]# mmm_control move_role writer db1

OK: Role 'writer' has been moved from 'db2' to 'db1'. Now you can wait some time and check new roles info!

[root@Monitor mysql-mmm]# mmm_control show

db1(192.168.88.20) master/ONLINE. Roles: reader(192.168.88.31), writer(192.168.88.30)

db2(192.168.88.21) master/ONLINE. Roles: reader(192.168.88.32)

db3(192.168.88.22) slave/ONLINE. Roles: reader(192.168.88.33)

db4(192.168.88.23) slave/ONLINE. Roles: reader(192.168.88.34)


这样,MMM集群又恢复了初始状态。


最后,再测试一下MMM集群对Slave节点的MySQL复制线程的监控和故障转移过程。首先在Slave1节点关闭复制线程,操作如下:


[root@Slave1 ~]# mysql -u root -p

Enter password:

mysql>slave stop;

Query OK, 0 rows affected(0.02 sec)


接着在MMM管理端查看MMM集群运行状态,信息如下:


[root@Monitor mysql-mmm]# mmm_control show

db1(192.168.88.20) master/ONLINE. Roles: reader(192.168.88.31), writer(192.168.88.30)

db2(192.168.88.21) master/ONLINE. Roles: reader(192.168.88.32)

db3(192.168.88.22) slave/REPLICATION_FAIL. Roles: reader(192.168.88.33)

db4(192.168.88.23) slave/ONLINE. Roles: reader(192.168.88.34)


从输出可知,Slave1的状态变为REPLICATION_FAIL,同时只读VIP切换到Master2节点,实现故障的快速转移。如果重新启动Slave1上的复制线程,那么MMM集群也会立刻检测到,进而再次将只读VIP切换到Slave1上。


ID:Computer-network


【推荐书籍】