MySQL 高可用MMM

一、MMM简介:

MMM即Multi-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.2(64位)         数据库系统: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文件,添加如下内容:
192.168.31.83 master1
192.168.31.141 master2
192.168.31.250 slave1
192.168.31.225 slave2
192.168.31.106 monitor1
在所有主机上安装perl、perl-devel  perl-CPANlibart_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、在master1、master2、slave1、slave2主机上安装mysql5.7和配置复制
master1和master2互为主从,slave1、slave2为master1的从
在每个mysql的配置文件/etc/my.cnf中加入以下内容, 注意server_id 不能重复。
master1主机:
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log= relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
master2主机:
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log= relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
slave1主机:
server-id = 3
relay-log= relay-bin
relay-log-index = slave-relay-bin.index
read_only   = 1
slave2主机:
server-id = 4
relay-log= relay-bin
relay-log-index = slave-relay-bin.index
read_only   = 1
在完成了对my.cnf的修改后,通过systemctl restart mysqld重新启动mysql服务
4台数据库主机若要开启防火墙,要么关闭防火墙或者创建访问规则:
firewall-cmd --permanent--add-port=3306/tcp
firewall-cmd --reload
主从配置(master1和master2配置成主主,slave1和slave2配置成master1的从):
在master1上授权:
mysql> grant replication slave on *.*to [email protected]‘192.168.31.%‘ identified by ‘123456‘;
在master2上授权:
mysql> grant replication slave on *.*to [email protected]‘192.168.31.%‘ identified by ‘123456‘;
把master2、slave1和slave2配置成master1的从库:
在master1上执行show master status; 获取binlog文件和Position点
mysql> show master status;
+------------------+----------+--------------+------------------+--------------------------------------------------+
| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+---------------------------------------------------+
| mysql-bin.000001 |      452 |              |           |                   |
+------------------+----------+--------------+------------------+-----------------------------------------------------+
在master2、slave1和slave2执行
mysql>change master tomaster_host=‘192.168.31.83‘,master_port=3306,master_user=‘rep‘,master_password=‘123456‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=452;
mysql>slave start;
验证主从复制:
master2主机:
mysql> show slave status\G;
*************************** 1. row***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: 192.168.31.83
                 Master_User: rep
                 Master_Port: 3306
                Connect_Retry: 60
             Master_Log_File: mysql-bin.000001
         Read_Master_Log_Pos: 452
              Relay_Log_File: relay-bin.000002
               Relay_Log_Pos: 320
       Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
           Slave_SQL_Running: Yes
slave1主机:
mysql> showslave status\G;
***************************1. row ***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host:192.168.31.83
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 452
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running:Yes
            Slave_SQL_Running: Yes
slave2主机:
mysql> showslave status\G;
***************************1. row ***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host:192.168.31.83
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 452
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running:Yes
            Slave_SQL_Running: Yes
如果Slave_IO_Running和Slave_SQL_Running都为yes,那么主从就已经配置OK了
把master1配置成master2的从库:
在master2上执行show master status ;获取binlog文件和Position点
mysql> show master status;
+------------------+----------+--------------+------------------+--------------------------------------------------+
| File             | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+---------------------------------------------------+
| mysql-bin.000001 |      452 |              |          |                   |
+------------------+----------+--------------+------------------+----------------------------------------------------+
在master1上执行:
mysql>change master to master_host=‘192.168.31.141‘,master_port=3306,master_user=‘rep‘,master_password=‘123456‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=452;
mysql> start slave;
验证主从复制:
master1主机:
mysql> showslave status\G;
***************************1. row ***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host:192.168.31.141
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 452
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running:Yes
            Slave_SQL_Running: Yes
如果Slave_IO_Running和Slave_SQL_Running都为yes,那么主从就已经配置OK了
4、mysql-mmm配置:
在4台mysql节点上创建用户
创建代理账号:
mysql> grant super,replicationclient,process on *.* to ‘mmm_agent‘@‘192.168.31.%‘ identified by ‘123456‘;
创建监控账号:
mysql> grant replication client on*.* to ‘mmm_monitor‘@‘192.168.31.%‘ identified by ‘123456‘;
注1:因为之前的主从复制,以及主从已经是ok的,所以我在master1服务器执行就ok了。
检查master2和slave1、slave2三台db上是否都存在监控和代理账号
mysql> select user,host frommysql.user where user in (‘mmm_monitor‘,‘mmm_agent‘);
+-------------+----------------------------+
| user        | host         |
+-------------+----------------------------+
| mmm_agent   | 192.168.31.% |
| mmm_monitor | 192.168.31.% |
+-------------+------------------------------+
或
mysql> show grants for‘mmm_agent‘@‘192.168.31.%‘;
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                             |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT PROCESS, SUPER, REPLICATIONCLIENT ON *.* TO ‘mmm_agent‘@‘192.168.31.%‘ |
+-----------------------------------------------------------------------------------------------------------------------------+
mysql> show grants for‘mmm_monitor‘@‘192.168.31.%‘;
+-----------------------------------------------------------------------------------------------------------------------------+
| Grants [email protected]%                                           |
+-----------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION CLIENT ON *.* TO‘mmm_monitor‘@‘192.168.31.%‘                 |
注2:
mmm_monitor 用户:mmm监控用于对mysql服务器进程健康检查
mmm_agent 用户:mmm代理用来更改只读模式,复制的主服务器等
5、mysql-mmm安装
在monitor主机(192.168.31.106) 上安装监控程序
cd /tmp
wgethttp://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install
在数据库服务器(master1、master2、slave1、slave2)上安装代理
cd /tmp
wgethttp://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -zxf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1
make install
6、配置mmm
编写配置文件,五台主机必须一致:
完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:
active_master_role           writer #积极的master角色的标示,所有的db服务器要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。
<host default>
       cluster_interface        eno16777736  #群集的网络接口
       pid_path       /var/run/mmm_agentd.pid   #pid路径
       bin_path       /usr/lib/mysql-mmm/  #可执行文件路径
   replication_user        rep    #复制用户
   replication_password    123456   #复制用户密码
       agent_user       mmm_agent #代理用户
       agent_password      123456   #代理用户密码
</host>
<host master1>     #master1的host名
       ip     192.168.31.83  #master1的ip
       mode       master   #角色属性,master代表是主
       peer    master2  #与master1对等的服务器的host名,也就是master2的服务器host名
</host>
<host master2>   #和master的概念一样
       ip       192.168.31.141 
       mode       master
       peer     master1
</host>
<host slave1>    #从库的host名,如果存在多个从库可以重复一样的配置
       ip      192.168.31.250  #从的ip
       mode     slave   #slave的角色属性代表当前host是从
</host>
<host slave2>   #和slave的概念一样
       ip      192.168.31.225
       mode    slave
</host>
<role writer>  #writer角色配置
       hosts      master1,master2 #能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
       ips    192.168.31.2  #对外提供的写操作的虚拟IP
       mode   exclusive   #exclusive代表只允许存在一个主,也就是只能提供一个写的IP
</role>
<role reader>   #read角色配置
       hosts   master2,slave1,slave2  #对外提供读操作的服务器的host名,当然这里也可以把master加进来
       ips      192.168.31.3,192.168.31.4, 192.168.31.5   #对外提供读操作的虚拟ip,这三个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ip
       mode      balanced  #balanced代表负载均衡
</role>
同时将这个文件拷贝到其它的服务器,配置不变
#for host in master1 master2 slave1slave2 ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done
代理文件配置
编辑 4台mysql节点机上的/etc/mysql-mmm/mmm_agent.conf 
在数据库服务器上,还有一个mmm_agent.conf需要修改,其内容是:
include mmm_common.conf
this master1
注意:这个配置只配置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 。那么说明在作为服务启动的时候,可能是由于缺少环境变量
服务启动失败,报错信息如下:
Daemon bin: ‘/usr/sbin/mmm_agentd‘
Daemon pid: ‘/var/run/mmm_agentd.pid‘
Starting MMM Agent daemon... Can‘tlocate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5/usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl/usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_agentd line 7.
BEGIN failed--compilation aborted at/usr/sbin/mmm_agentd line 7.
failed
解决方法:
# cpanProc::Daemon
# cpan Log::Log4perl
# /etc/init.d/mysql-mmm-agent start
Daemon bin: ‘/usr/sbin/mmm_agentd‘
Daemon pid: ‘/var/run/mmm_agentd.pid‘
Starting MMM Agent daemon... Ok
# netstat -antp | grep mmm_agentd
tcp 0   0 192.168.31.83:9989    0.0.0.0:*  LISTEN      9693/mmm_agentd
配置防火墙
firewall-cmd --permanent--add-port=9989/tcp
firewall-cmd --reload
编辑 monitor主机上的/etc/mysql-mmm/mmm_mon.conf 
include mmm_common.conf
 
<monitor>
       ip    127.0.0.1  ##为了安全性,设置只在本机监听,mmm_mond默认监听9988
       pid_path     /var/run/mmm_mond.pid
       bin_path      /usr/lib/mysql-mmm/
       status_path   /var/lib/misc/mmm_mond.status
ping_ips                               192.168.31.83,192.168.31.141,192.168.31.250,192.168.31.225  #用于测试网络可用性 IP 地址列表,只要其中有一个地址 ping 通,就代表网络正常,这里不要写入本机地址
       auto_set_online  0  #设置自动online的时间,默认是超过60s就将它设置为online,默认是60s,这里将其设为0就是立即online
</monitor>
 
<check default>
   check_period    5
   trap_period     10
   timeout         2
   #restart_after     10000
   max_backlog     86400
</check>
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  123456   #监控db服务器的密码
</host>
debug 0  #debug 0正常模式,1为debug模式
启动监控进程:
在 /etc/init.d/mysql-mmm-monitor的脚本文件的#!/bin/sh下面,加入如下内容 
source /root/.bash_profile 
添加成系统服务并设置为自启动
#chkconfig --add mysql-mmm-monitor
#chkconfig  mysql-mmm-monitor on
#/etc/init.d/mysql-mmm-monitor start
启动报错:
Starting MMM Monitor daemon: Can notlocate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5/usr/local/share/perl5 /usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_mondline 11.
BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line 11.
failed
解决方法:安装下列perl的库
#cpan Proc::Daemon
#cpan Log::Log4perl
[[email protected] ~]#/etc/init.d/mysql-mmm-monitor start
Daemon bin: ‘/usr/sbin/mmm_mond‘
Daemon pid: ‘/var/run/mmm_mond.pid‘
Starting MMM Monitor daemon: Ok
[[email protected] ~]# netstat -anpt | grep9988
tcp 0  0 127.0.0.1:9988   0.0.0.0:*      LISTEN      8546/mmm_mond
注1:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。
注2:MMM启动顺序:先启动monitor,再启动 agent
检查集群状态:
[[email protected] ~]# mmm_control show
 master1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)
 master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
 slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
 slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
如果服务器状态不是ONLINE,可以用如下命令将服务器上线,例如:
#mmm_control set_online 主机名
例如:[[email protected] ~]#mmm_control set_online master1
从上面的显示可以看到,写请求的VIP在master1上,所有从节点也都把master1当做主节点。
查看是否启用vip
[[email protected] ~]# ip addr show deveno16777736
eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 00:0c:29:6d:2f:82 brd ff:ff:ff:ff:ff:ff
   inet 192.168.31.83/24 brd 192.168.31.255 scope global eno16777736
      valid_lft forever preferred_lft forever
   inet192.168.31.2/32 scope global eno16777736
      valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe6d:2f82/64 scope link
      valid_lft forever preferred_lft forever
[[email protected] ~]# ip addr show dev eno16777736
eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 00:0c:29:75:1a:9c brd ff:ff:ff:ff:ff:ff
   inet 192.168.31.141/24 brd 192.168.31.255 scope global dynamiceno16777736
      valid_lft 35850sec preferred_lft 35850sec
   inet 192.168.31.5/32 scope globaleno16777736
      valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe75:1a9c/64 scope link
      valid_lft forever preferred_lft forever
[[email protected] ~]# ip addr show dev eno16777736
eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 00:0c:29:02:21:19 brd ff:ff:ff:ff:ff:ff
   inet 192.168.31.250/24 brd 192.168.31.255 scope global dynamiceno16777736
      valid_lft 35719sec preferred_lft 35719sec
   inet 192.168.31.4/32 scope globaleno16777736
      valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe02:2119/64 scope link
      valid_lft forever preferred_lft forever
[[email protected] ~]# ip addr show deveno16777736
eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 00:0c:29:e2:c7:fa brd ff:ff:ff:ff:ff:ff
   inet 192.168.31.225/24 brd 192.168.31.255 scope global dynamiceno16777736
      valid_lft 35930sec preferred_lft 35930sec
   inet 192.168.31.3/32 scope globaleno16777736
      valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fee2:c7fa/64 scope link
      valid_lft forever preferred_lft forever
在master2,slave1,slave2主机上查看主mysql的指向
mysql> show slave status\G;
*************************** 1. row***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 192.168.31.83
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
MMM高可用性测试:
服务器读写采有VIP地址进行读写,出现故障时VIP会漂移到其它节点,由其它节点提供服务。
首先查看整个集群的状态,可以看到整个集群状态正常
[[email protected] ~]# mmm_control show
 master1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)
 master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
 slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
 slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
模拟master1宕机,手动停止mysql服务,观察monitor日志,master1的日志如下:
[[email protected] ~]# tail -f/var/log/mysql-mmm/mmm_mond.log
2017/01/09 22:02:55  WARN Check ‘rep_threads‘ on ‘master1‘ is inunknown state! Message: UNKNOWN: Connect error (host = 192.168.31.83:3306, user= mmm_monitor)! Can‘t connect to MySQL server on ‘192.168.31.83‘ (111)
2017/01/09 22:02:55  WARN Check ‘rep_backlog‘ on ‘master1‘ is inunknown state! Message: UNKNOWN: Connect error (host = 192.168.31.83:3306, user= mmm_monitor)! Can‘t connect to MySQL server on ‘192.168.31.83‘ (111)
2017/01/09 22:03:05 ERROR Check ‘mysql‘on ‘master1‘ has failed for 10 seconds! Message: ERROR: Connect error (host =192.168.31.83:3306, user = mmm_monitor)! Can‘t connect to MySQL server on‘192.168.31.83‘ (111)
2017/01/09 22:03:07 FATAL State of host‘master1‘ changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
2017/01/09 22:03:07  INFO Removing all roles from host ‘master1‘:
2017/01/09 22:03:07  INFO    Removed role ‘writer(192.168.31.2)‘ from host ‘master1‘
2017/01/09 22:03:07  INFO Orphaned role ‘writer(192.168.31.2)‘ hasbeen assigned to ‘master2‘
查看群集的最新状态
[[email protected] ~]# mmm_control show
 master1(192.168.31.83) master/HARD_OFFLINE.Roles:
 master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5),writer(192.168.31.2)
 slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
 slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
从显示结果可以看出master1的状态有ONLINE转换为HARD_OFFLINE,写VIP转移到了master2主机上。
检查所有的db服务器群集状态
[[email protected] ~]# mmm_control checksall
master1  ping        [last change: 2017/01/09 21:31:47] OK
master1  mysql       [last change: 2017/01/09 22:03:07] ERROR: Connect error (host = 192.168.31.83:3306, user = mmm_monitor)!Can‘t connect to MySQL server on ‘192.168.31.83‘ (111)
master1 rep_threads  [last change: 2017/01/0921:31:47]  OK
master1 rep_backlog  [last change:2017/01/09 21:31:47]  OK: Backlog is null
slave1  ping         [last change:2017/01/09 21:31:47]  OK
slave1  mysql        [last change:2017/01/09 21:31:47]  OK
slave1  rep_threads  [last change: 2017/01/0921:31:47]  OK
slave1  rep_backlog  [last change:2017/01/09 21:31:47]  OK: Backlog is null
master2 ping         [last change:2017/01/09 21:31:47]  OK
master2 mysql        [last change:2017/01/09 21:57:32]  OK
master2 rep_threads  [last change:2017/01/09 21:31:47]  OK
master2 rep_backlog  [last change:2017/01/09 21:31:47]  OK: Backlog is null
slave2  ping         [last change:2017/01/09 21:31:47]  OK
slave2  mysql        [last change:2017/01/09 21:31:47]  OK
slave2  rep_threads  [last change:2017/01/09 21:31:47]  OK
slave2  rep_backlog  [last change:2017/01/09 21:31:47]  OK: Backlog is null
从上面可以看到master1能ping通,说明只是服务死掉了。
查看master2主机的ip地址:
[[email protected] ~]# ip addr show deveno16777736
eno16777736:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 00:0c:29:75:1a:9c brd ff:ff:ff:ff:ff:ff
   inet 192.168.31.141/24 brd 192.168.31.255 scope global dynamiceno16777736
      valid_lft 35519sec preferred_lft 35519sec
   inet 192.168.31.5/32 scope global eno16777736
      valid_lft forever preferred_lft forever
   inet 192.168.31.2/32 scope globaleno16777736
      valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe75:1a9c/64 scope link
      valid_lft forever preferred_lft forever
slave1主机:
mysql> show slave status\G;
*************************** 1. row***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 192.168.31.141
                  Master_User: rep
                  Master_Port: 3306
slave2主机:
mysql> show slave status\G;
*************************** 1. row***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 192.168.31.141
                  Master_User: rep
                  Master_Port: 3306
启动master1主机的mysql服务,观察monitor日志,master1的日志如下:
[[email protected] ~]# tail -f/var/log/mysql-mmm/mmm_mond.log
2017/01/09 22:16:56  INFO Check ‘mysql‘ on ‘master1‘ is ok!
2017/01/09 22:16:56  INFO Check ‘rep_backlog‘ on ‘master1‘ is ok!
2017/01/09 22:16:56  INFO Check ‘rep_threads‘ on ‘master1‘ is ok!
2017/01/09 22:16:59 FATAL State of host‘master1‘ changed from HARD_OFFLINE to AWAITING_RECOVERY
从上面可以看到master1的状态由hard_offline改变为awaiting_recovery状态
用如下命令将服务器上线:
[[email protected] ~]#mmm_control set_onlinemaster1
查看群集最新状态
[[email protected] ~]# mmm_control show
 master1(192.168.31.83) master/ONLINE. Roles:
 master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5),writer(192.168.31.2)
 slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
 slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
可以看到主库启动不会接管主,只到现有的主再次宕机。
总结
(1)master2备选主节点宕机不影响集群的状态,就是移除了master2备选节点的读状态。
(2)master1主节点宕机,由master2备选主节点接管写角色,slave1,slave2指向新master2主库进行复制,slave1,slave2会自动change master到master2.
(3)如果master1主库宕机,master2复制应用又落后于master1时就变成了主可写状态,这时的数据主无法保证一致性。
如果master2, slave1,slave2延迟于master1主,这个时master1宕机,slave1,slave2将会等待数据追上db1后,再重新指向新的主node2进行复制操作,这时的数据也无法保证同步的一致性。
(4)如果采用MMM高可用架构,主,主备选节点机器配置一样,而且开启半同步进一步提高安全性或采用MariaDB/mysql5.7进行多线程从复制,提高复制的性能。
附:
1、日志文件:
日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。
db端:/var/log/mysql-mmm/mmm_agentd.log
监控端:/var/log/mysql-mmm/mmm_mond.log
2、命令文件:
     mmm_agentd :db代理进程的启动文件
     mmm_mond :监控进程的启动文件   
     mmm_backup :备份文件 
     mmm_restore :还原文件
      mmm_control:监控操作命令文件    
db服务器端只有mmm_agentd程序,其它的都是在monitor服务器端。
3、mmm_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
检查项包括:ping、mysql是否正常运行、复制线程是否正常等
检查群集环境在线状况:
[[email protected] ~]# mmm_control show
对指定的host执行offline操作:
[[email protected] ~]# mmm_controlset_offline slave2
对指定的host执行onine操作:
[[email protected] ~]# mmm_control set_onlineslave2
执行write切换(手动切换):
查看当前的slave对应的master
[[email protected] ~]# mysql -uroot -p123456-e ‘show slave status\G;‘
mysql: [Warning] Using a password on thecommand line interface can be insecure.
*************************** 1. row***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 192.168.31.141
writer切换,要确保mmm_common.conf文件中的writer属性有配置对应的host,否则无法切换
[[email protected] ~]# mmm_control move_rolewriter master1
OK: Role ‘writer‘ has been moved from‘master2‘ to ‘master1‘. Now you can wait some time and check new roles info!
[[email protected] ~]# mmm_control show
 master1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)
 master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)
 slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)
 slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)
save从库自动切换到了新的master
[[email protected] ~]# mysql -uroot -p123456-e ‘show slave status\G;‘
mysql: [Warning] Using a password on thecommand line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting formaster to send event
                  Master_Host: 192.168.31.83
4、其它处理问题
 如果不想让writer从master切换到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=1由monitor控制来控制writer和read,root用户和复制用户不受read_only参数的影响。

时间: 2024-08-10 23:22:33

MySQL 高可用MMM的相关文章

第22章 mysql 高可用MMM、MHA

2015-10-25 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 分享MYSQL中的各种高可用技术(源自姜承尧大牛) [4] MHA工作原理 [5] 技术实战:基于 MHA 方式实现 MySQL 的高可用(1) [6] mysql HA方案: MHA [7] mysql高可用方案MHA介绍 [8] Mysql5.5

MySQL高可用MMM

一.MMM简介: MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),MMM也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份.节点之间重新同步功能的脚本.MySQL本身没有提供replication failover的解决方案,通过MMM方案能实

MySQL 高可用MMM安装部署以及故障转移详细资料汇总

1,      mmm简介 MMM(Master-Masterreplication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的r

mysql高可用集群方案

这里有一篇关于Mysql高可用方案的干货文章:[干货分享] 一文了解数据库高可用容灾方案的设计与实现 网友们公司中的使用方案讨论:想问各位大大 MySQL 是怎么做高可用的? 一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+Heartbeat) 方案三:主从复制架构 主从复制(一主多从) MMM架构(双主多从) MHA架构(多主多从) 方案四:数

通过MMM构建MYSQL高可用集群系统

本文为南非蚂蚁的书籍<循序渐进linux-第二版>-8.4的读笔记 MMM集群套件(MYSQL主主复制管理器) MMM套件主要的功能是通过下面三个脚本实现的 1)mmm_mond 这是一个监控进程,运行在管理节点上,主要负责都所有数据库的监控工作,同时决定和处理所有节点的角色切换 2)mmm_agentd 这是一个代理进程,运行在每个MYSQL服务器上,主要完成监控的测试工作以及执行简单的远端服务设置 3)mmm_control 简单的管理脚本,用来查看和管理集群运行状态,同事管理mmm_mo

MySQL高可用群集--MMM高可用架构

为什么要使用MySQL高可用群集 在实际生产环境中,当普通的MySQL主从复制和读写分离不能满足实际需求时,就需要考虑MySQL的高可用群集,出于安全角度考虑,当数据访问量过大带来主服务器负载增大,当出现主服务器宕机一个时,保证数据服务不会中断的情况下,从服务器会自动寻找另一主服务器,而从服务器也会像主服务器一样,当其中一个宕机时,依旧可以保证服务不会中断. MMM高可用架构 什么是MMM? MMM(Master-Master replication manager for MySQL)是一套支

# IT明星不是梦 # MySQL高可用集群之MMM

MySQL高可用集群之MMM 一.MMM简介 MMM即Multi-Master Replication Manager for MySQL(mysql多主复制管理器),基于perl实现,关于mysql主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),MMM也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟IP,除此之外,它还有实现数据备份.节点之间重新同步功能的脚本.MySQL本身没有提供replication failover

mysql高可用

1 mmm架构 mysql高可用集群    (mysql MMM   +  mysql主从同步) 1.公共配置 配置固定物理Ip地址   237   42   101   102    77 所有机器之间彼此可以ping通 服务器237   42   101   102 运行mysql数据库服务. 配置YUM源 在所有服务器237   42   101   102    77上安装 rpm  -q  perl  ||  yum  -y  perl yum  -y  install  perl-*

优酷土豆资深工程师:MySQL高可用之MaxScale与MHA

本文根据DBAplus社群第67期线上分享整理而成 本次分享主要包括以下内容: 1.MySQL高可用方案 2.为什么选择MHA 3.读写分离方案的寻找以及为什么选择Maxscale 一.MySQL  Failover的方案 常见的Failover方案 MMM MMM缺点: Monitor节点是单点,可以结合Keepalived实现高可用目前MySQL Failover 的方案 Keepalived会有脑裂的风险 在读写繁忙的业务中可能丢数据 MHA + ssh -o 测试心跳 + masterM