MySql高可用之MMM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql高可用之MMM相关的知识,希望对你有一定的参考价值。

防伪码:向着太阳出发

一、MMM简介:

MMMMulti-MasterReplication Manager for mysql:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入)MMM也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。这个方案是目前比较成熟的解决方案。详情请看官网:http://mysql-mmm.org

                             技术分享

优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。当主服务器挂掉以后,另一个主立即接管,其他的从服务器能自动切换,不用人工干预。

缺点:monitor节点是单点,不过这个你也可以结合keepalived或者haertbeat做成高可用;至少三个节点,对主机的数量有要求,需要实现读写分离,还需要在前端编写读写分离程序。在读写非常繁忙的业务系统下表现不是很稳定,可能会出现复制延时、切换失效等问题。MMM方案并不太适应于对数据安全性要求很高,并且读、写繁忙的环境中。

适用场景:

MMM的适用场景为数据库访问量大,并且能实现读写分离的场景。

MMM主要功能由下面三个脚本提供:

mmm_mond  负责所有的监控工作的监控守护进程,决定节点的移除(mmm_mond进程定时心跳检测,失败则将write ip浮动到另外一台master)等等

mmm_agentd  运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点

mmm_control  通过命令行管理mmm_mond进程

在整个监管过程中,需要在mysql中添加相关授权用户,授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。

二、部署实施

1、环境介绍

OS:centos7.264位)数据库系统:mysql5.7.13

关闭selinux

配置ntp,同步时间

角色

IP

hostname

Server-id

Write vip

Read vip

Master1

192.168.31.83

master1

1

192.168.31.2


Master2(backup)

192.168.31.141

master2

2


192.168.31.3

Slave1

192.168.31.250

slave1

3


192.168.31.4

Slave2

192.168.31.225

slave2

4


192.168.31.5

monitor

192.168.31.106

monitor1



2、在所有主机上配置/etc/hosts文件,添加如下内容:

技术分享

在所有主机上安装perlperl-develperl-CPAN libart_lgpl.x86_64 rrdtool.x86_64  rrdtool-perl.x86_64

#yum -y install perl-*  libart_lgpl.x86_64  rrdtool.x86_64  rrdtool-perl.x86_64

注:使用centos7在线yum源安装

安装perl的相关库

#cpan -iAlgorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perlMail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP

3、在master1master2slave1slave2主机上安装mysql5.7和配置复制

master1master2互为主从,slave1slave2master1的从

在每个mysql的配置文件/etc/my.cnf中加入以下内容, 注意server_id不能重复。

master1主机:

技术分享

master2主机:

技术分享

slave1主机:

技术分享

slave2主机:

技术分享

在完成了对my.cnf的修改后,通过systemctl restart mysqld重新启动mysql服务

4台数据库主机若要开启防火墙,要么关闭防火墙或者创建访问规则:

firewall-cmd --permanent--add-port=3306/tcp

firewall-cmd --reload

主从配置(master1master2配置成主主,slave1slave2配置成master1的从):

master1上授权:

技术分享

master2上授权:

技术分享

master2slave1slave2配置成master1的从库:

master1上执行show master status; 获取binlog文件和Position

技术分享

master2slave1slave2执行

技术分享

技术分享

技术分享

验证主从复制:

master2主机:

技术分享

Slave1主机

技术分享

slave2主机

技术分享

如果Slave_IO_RunningSlave_SQL_Running都为yes,那么主从就已经配置OK

master1配置成master2的从库:

master2上执行show master status ;获取binlog文件和Position

技术分享

master1上执行:

技术分享

验证主从复制:

master1主机:

技术分享

如果Slave_IO_RunningSlave_SQL_Running都为yes,那么主从就已经配置OK

4mysql-mmm配置:

4mysql节点上创建用户

创建代理账号:

技术分享

创建监控账号:

技术分享

1:因为之前的主从复制,以及主从已经是ok的,所以我在master1服务器执行就ok了。

检查master2slave1slave2三台db上是否都存在监控和代理账号

 

技术分享

技术分享

2

mmm_monitor用户:mmm监控用于对mysql服务器进程健康检查

mmm_agent用户:mmm代理用来更改只读模式,复制的主服务器等

5mysql-mmm安装

monitor主机(192.168.31.106) 上安装监控程序

技术分享

在数据库服务器(master1master2slave1slave2)上安装代理

技术分享

6、配置mmm

编写配置文件,五台主机必须一致:

完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:

技术分享

技术分享

相关解释:

active_master_rolewriter#积极的master角色的标示,所有的db服务器要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。

<hostdefault>

cluster_interface       eno16777736#群集的网络接口

pid_path              /var/run/mmm_agentd.pid#pid路径

bin_path              /usr/lib/mysql-mmm/#可执行文件路径

replication_user        rep#复制用户

replication_password    123.abc#复制用户密码

agent_user             mmm_agent#代理用户

agent_password         123.abc#代理用户密码

</host>

<hostmaster1>          #master1host

ip          192.168.31.83#master1ip

        mode          master#角色属性,master代表是主

        peer                      master2#master1对等的服务器的host名,也就是master2的服务器host

</host>

<hostmaster2>         #master的概念一样

ip               192.168.31.141

mode              master

peer               master1

</host>

<hostslave1>            #从库的host,如果存在多个从库可以重复一样的配置

ip                  192.168.31.250#从的ip

    mode               slave#slave的角色属性代表当前host是从

</host>

<hostslave2>             #slave的概念一样

ip                 192.168.31.225

mode                slave

</host>

<rolewriter>              #writer角色配置

     hosts               master1,master2#能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。

ips               192.168.31.2#对外提供的写操作的虚拟IP

      mode           exclusive#exclusive代表只允许存在一个主,也就是只能提供一个写的IP

</role>

<rolereader>          #read角色配置

      hosts           master2,slave1,slave2#对外提供读操作的服务器的host,当然这里也可以把master加进来

ips            192.168.31.3, 192.168.31.4,192.168.31.5#对外提供读操作的虚拟ip,这三个iphost不是一一对应的,并且ipshosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ip

      mode          balanced#balanced代表负载均衡

</role>

同时将这个文件拷贝到其它的服务器,配置不变

技术分享

代理文件配置

编辑 4mysql节点机上的/etc/mysql-mmm/mmm_agent.conf 
在数据库服务器上,还有一个mmm_agent.conf需要修改,其内容是:

技术分享

注意:这个配置只配置db服务器,监控服务器不需要配置,this后面的host名改成当前服务器的主机名。

启动代理进程

/etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容 
source /root/.bash_profile 

技术分享

添加成系统服务并设置为自启动

#chkconfig --add mysql-mmm-agent

#chkconfig  mysql-mmm-agent on

#/etc/init.d/mysql-mmm-agent start

注:添加source /root/.bash_profile目的是为了mysql-mmm-agent服务能启机自启。

自动启动和手动启动的唯一区别,就是激活一个console 。那么说明在作为服务启动的时候,可能是由于缺少环境变量

服务启动失败,报错信息如下:

技术分享

解决方法:

技术分享

技术分享

配置防火墙

技术分享

编辑 monitor主机上的/etc/mysql-mmm/mmm_mon.conf 

技术分享

check_period

描述:检查周期默认为5s

默认值:5s

trap_period

描述:一个节点被检测不成功的时间持续trap_period秒,就慎重的认为这个节点失败了。

默认值:10s

timeout

描述:检查超时的时间

默认值:2s

restart_after

描述:在完成restart_after次检查后,重启checker进程

默认值:10000

max_backlog

描述:记录检查rep_backlog日志的最大次数

默认值:60

 

<host default>

monitor_user  mmm_monitor#监控db服务器的用户

monitor_password  123.abc#监控db服务器的密码

</host>

debug 0#debug 0正常模式,1debug模式

启动监控进程:

/etc/init.d/mysql-mmm-monitor的脚本文件的#!/bin/sh下面,加入如下内容 
source /root/.bash_profile 

技术分享

添加成系统服务并设置为自启动

#chkconfig --add mysql-mmm-monitor

#chkconfigmysql-mmm-monitor on

启动报错:

技术分享

解决方法:安装下列perl的库

技术分享

技术分享

建立防火墙规则:

技术分享

1:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。

2MMM启动顺序:先启动monitor,再启动 agent

检查集群状态:

技术分享

如果服务器状态不是ONLINE,可以用如下命令将服务器上线,例如:

#mmm_controlset_online主机名

例如:[[email protected] ~]#mmm_control set_onlinemaster1

从上面的显示可以看到,写请求的VIPmaster1上,所有从节点也都把master1当做主节点。

查看是否启用vip

技术分享

技术分享

技术分享

技术分享

master2slave1slave2主机上查看主mysql的指向

技术分享

MMM高可用性测试:

服务器读写采有VIP地址进行读写,出现故障时VIP会漂移到其它节点,由其它节点提供服务。

首先查看整个集群的状态,可以看到整个集群状态正常

技术分享

模拟master1宕机,手动停止mysql服务,观察monitor日志,master1的日志如下:

技术分享

查看群集的最新状态

技术分享

从显示结果可以看出master1的状态有ONLINE转换为HARD_OFFLINE,写VIP转移到了master2主机上。

检查所有的db服务器群集状态

技术分享

从上面可以看到master1ping通,说明只是服务死掉了。

查看master2主机的ip地址:

技术分享

Slave1 主机

技术分享

Slave2 主机

技术分享

启动master1主机的mysql服务,观察monitor日志,master1的日志如下:

技术分享

从上面可以看到master1的状态由hard_offline改变为awaiting_recovery状态

用如下命令将服务器上线:

[[email protected] ~]#mmm_control set_onlinemaster1

查看群集最新状态

技术分享

可以看到主库启动不会接管主,直到现有的主再次宕机。

总结

(1)master2备选主节点宕机不影响集群的状态,就是移除了master2备选节点的读状态。
(2)master1主节点宕机,由master2备选主节点接管写角色,slave1,slave2指向新master2主库进行复制,slave1,slave2会自动change mastermaster2.
(3)如果master1主库宕机,master2复制应用又落后于master1时就变成了主可写状态,这时的数据主无法保证一致性。
如果master2,slave1,slave2延迟于master1主,这个时master1宕机,slave1,slave2将会等待数据追上master1后,再重新指向新的主node2进行复制操作,这时的数据也无法保证同步的一致性。
(4)如果采用MMM高可用架构,主,主备选节点机器配置一样,而且开启半同步进一步提高安全性或采用MariaDB/mysql5.7进行多线程从复制,提高复制的性能。

附:

1、日志文件:

日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。

db端:/var/log/mysql-mmm/mmm_agentd.log

监控端:/var/log/mysql-mmm/mmm_mond.log

2、命令文件:

     mmm_agentddb代理进程的启动文件

     mmm_mond:监控进程的启动文件   

     mmm_backup:备份文件 

     mmm_restore:还原文件

      mmm_control:监控操作命令文件    

db服务器端只有mmm_agentd程序,其它的都是在monitor服务器端。

3mmm_control用法

mmm_control程序可以用于监控群集状态、切换writer、设置online\offline操作等。

Valid commands are:

 help       - show this message #帮助信息

 ping       - ping monitor #ping当前的群集是否正常

 show       - show status #群集在线状态检查

 checks [<host>|all [<check>|all]]- show checks status#执行监控检查操作

set_online<host>     - set host <host> online #host设置为online

set_offline<host>    - set host <host> offline #host设置为offline

mode        - print current mode. #打印输出当前的mode

set_active      - switch into active mode.

 

set_manual      - switch into manual mode.

set_passive      - switch into passive mode.

move_role [--force]<role><host> - move exclusive role <role> to host<host> #移除writer服务器为指定的host服务器(Only use --force if you know what you are doing!)

set_ip<ip><host>    - set role with ip<ip> to host<host>

检查所有的db服务器群集状态:

[[email protected] ~]# mmm_control checksall

检查项包括:pingmysql是否正常运行、复制线程是否正常等

检查群集环境在线状况:

[[email protected] ~]# mmm_control show

对指定的host执行offline操作:

[[email protected] ~]#mmm_controlset_offline slave2

对指定的host执行onine操作:

[[email protected] ~]# mmm_controlset_onlineslave2

执行write切换(手动切换):

查看当前的slave对应的master

技术分享

writer切换,要确保mmm_common.conf文件中的writer属性有配置对应的host,否则无法切换

技术分享 

技术分享

slave从库自动切换到了新的master

技术分享

4、其它处理问题

 如果不想让writermaster切换到backup(包括主从的延时也会导致写VIP的切换),那么可以在配置/etc/mysql-mmm/mmm_common.conf时,去掉<role write>中的backup

<role writer>#writer角色配置

 hosts master1 #这里只配置一个Hosts

ips 192.168.31.2#对外提供的写操作的虚拟IP

 mode exclusive #exclusive代表只允许存在一个主,也就是只能提供一个写的IP

</role>

 这样的话当master1出现故障了writer写操作不会切换到master2服务器,并且slave也不会指向新的master,此时当前的MMM之前对外提供写服务。

5总结

       1).对外提供读写的虚拟IP是由monitor程序控制。如果monitor没有启动那么db服务器不会被分配虚拟ip,但是如果已经分配好了虚拟ip,当monitor程序关闭了原先分配的虚拟ip不会立即关闭外部程序还可以连接访问(只要不重启网络),这样的好处就是对于monitor的可靠性要求就会低一些,但是如果这个时候其中的某一个db服务器故障了就无法处理切换,也就是原先的虚拟ip还是维持不变,挂掉的那台DB的虚拟ip会变的不可访问。

      2).agent程序受monitor程序的控制处理write切换,从库切换等操作。如果monitor进程关闭了那么agent进程就起不到什么作用,它本身不能处理故障。

      3).monitor程序负责监控db服务器的状态,包括Mysql数据库、服务器是否运行、复制线程是否正常、主从延时等;它还用于控制agent程序处理故障。

      4).monitor会每隔几秒钟监控db服务器的状态,如果db服务器已经从故障变成了正常,那么monitor会自动在60s之后将其设置为online状态(默认是60s可以设为其它的值),有监控端的配置文件参数“auto_set_online”决定,群集服务器的状态有三种分别是:HARD_OFFLINE→AWAITING_RECOVERY→online

       5).默认monitor会控制mmm_agent会将writer db服务器read_only修改为OFF,其它的db服务器read_only修改为ON,所以为了严谨可以在所有的服务器的my.cnf文件中加入read_only=1monitor控制来控制writerread,root用户和复制用户不受read_only参数的影响。

 

 

 


本文出自 “你好阳光” 博客,谢绝转载!

以上是关于MySql高可用之MMM的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 高可用架构之MMM

MySql高可用之MMM

MySQL 高可用之MMM

MySQL 8.0高可用之MMM

mysql系列之9--------mmm高可用集群

MySQL 高可用性之MySQL-MMM