torlee 发表于 2018-10-10 08:33:21

Mysql高可用工具

  -------------------------------------------------------------------------------------------
  一、MMM简介:
  MMM即Multi-Master Replication Manager forMySQL: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-develperl-CPAN libart_lgpl.x86_64rrdtool.x86_64rrdtool-perl.x86_64包
  #yum -y install perl-*libart_lgpl.x86_64rrdtool.x86_64rrdtool-perl.x86_64
  注:使用centos7在线yum源安装
  安装perl的相关库

  #cpan -iAlgorithm::Diff>  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-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-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-log-index = slave-relay-bin.index
  read_only   = 1
  slave2主机:
  server-id = 4

  relay-log =>  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 rep@'192.168.31.%'>  在master2上授权:

  mysql> grant replication slave on *.* to rep@'192.168.31.%'>  把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 tosend 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_Log_Pos: 320
  Relay_Master_Log_File: mysql-bin.000001
  Slave_IO_Running:Yes
  Slave_SQL_Running:Yes
  slave1主机:
  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_Log_Pos: 320
  Relay_Master_Log_File: mysql-bin.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  slave2主机:
  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_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 tomaster_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> show slave status\G;
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master 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_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,replication client,process on *.* to 'mmm_agent'@'192.168.31.%'identified by '123456';
  创建监控账号:
  mysql> grantreplication client on *.* to 'mmm_monitor'@'192.168.31.%'>
  注1:因为之前的主从复制,以及主从已经是ok的,所以我在master1服务器执行就ok了。
  检查master2和slave1、slave2三台db上是否都存在监控和代理账号
  mysql> select user,host from mysql.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 mmm_agent@192.168.31.%                                             |
  +-----------------------------------------------------------------------------------------------------------------------------+
  | GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO'mmm_agent'@'192.168.31.%' |
  +-----------------------------------------------------------------------------------------------------------------------------+
  mysql> show grants for 'mmm_monitor'@'192.168.31.%';
  +-----------------------------------------------------------------------------------------------------------------------------+
  | Grants for mmm_monitor@192.168.31.%                           |
  +-----------------------------------------------------------------------------------------------------------------------------+
  | 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) 上安装监控程序
  【centos7】#cd /tmp
  Wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
  【centos7】# tar -zxf mysql-mmm-2.2.1.tar.gz
  【centos7】#cd mysql-mmm-2.2.1
  【centos7】#make install
  在数据库服务器(master1、master2、slave1、slave2)上安装代理
  【centos7】#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
  【centos7】#tar -zxf mysql-mmm-2.2.1.tar.gz
  【centos7】#cd mysql-mmm-2.2.1
  【centos7】#make install
  6、配置mmm
  编写配置文件,五台主机必须一致:
  完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:
  active_master_role writer#积极的master角色的标示,所有的db服务器要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。
  
  cluster_interfaceeno16777736               #群集的网络接口
  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               #代理用户密码
  
           #master1的host名
  ip   192.168.31.83         #master1的ip
  mode    master   #角色属性,master代表是主
  peer   master2      #与master1对等的服务器的host名,也就是master2的服务器host名
  
              #和master的概念一样
  ip       192.168.31.141
  mode       master
  peer   master1
  
               #从库的host名,如果存在多个从库可以重复一样的配置
  ip   192.168.31.250   #从的ip
  modeslave    #slave的角色属性代表当前host是从
  
            #和slave的概念一样
  ip      192.168.31.225
  mode    slave
  
            #writer角色配置
  hosts    master1,master2    #能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
  ips    192.168.31.2      #对外提供的写操作的虚拟IP
  modeexclusive#exclusive代表只允许存在一个主,也就是只能提供一个写的IP
  
           #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代表负载均衡
  
  同时将这个文件拷贝到其它的服务器,配置不变
  在monitor上做如下操作:
  #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
  #chkconfigmysql-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't locate Proc/Daemon.pm in @INC (@INCcontains: /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
  解决方法:
  # cpan Proc::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
  tcp0   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
  includemmm_common.conf
  
  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_online0               #设置自动online的时间,默认是超过60s就将它设置为online,默认是60s,这里将其设为0就是立即online
  
  
  check_period    5
  trap_period   10
  timeout         2
  #restart_after   10000
  max_backlog   86400
  
  check_period
  描述:检查周期默认为5s
  默认值:5s
  trap_period
  描述:一个节点被检测不成功的时间持续trap_period秒,就慎重的认为这个节点失败了。
  默认值:10s
  timeout
  描述:检查超时的时间
  默认值:2s
  restart_after
  描述:在完成restart_after次检查后,重启checker进程
  默认值:10000
  max_backlog
  描述:记录检查rep_backlog日志的最大次数
  默认值:60
  
  monitor_usermmm_monitor#监控db服务器的用户
  monitor_password123456#监控db服务器的密码
  
  debug 0#debug 0正常模式,1为debug模式
  启动监控进程:
  在 /etc/init.d/mysql-mmm-monitor的脚本文件的#!/bin/sh下面,加入如下内容
  source /root/.bash_profile
  添加成系统服务并设置为自启动
  #chkconfig --add mysql-mmm-monitor
  #chkconfigmysql-mmm-monitor on
  #/etc/init.d/mysql-mmm-monitor start
  启动报错:
  Starting MMM Monitor daemon: Can not locate Proc/Daemon.pm in @INC (@INCcontains: /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_mond line 11.
  BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line 11.
  failed
  解决方法:安装下列perl的库
  #cpanProc::Daemon
  #cpanLog::Log4perl
  # /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
  # netstat -anpt | grep 9988
  tcp00 127.0.0.1:9988   0.0.0.0:*      LISTEN      8546/mmm_mond
  防火墙规则:
  firewall-cmd --permanent --add-port=9988/tcp
  firewall-cmd --reload
  注1:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。
  注2:MMM启动顺序:先启动monitor,再启动 agent
  检查集群状态:
  # 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_controlset_online主机名
  例如:#mmm_control set_onlinemaster1
  从上面的显示可以看到,写请求的VIP在master1上,所有从节点也都把master1当做主节点。
  查看是否启用vip
  # ip addr show dev eno16777736
  eno16777736: mtu 1500qdiscpfifo_fast state UP qlen 1000
  link/ether 00:0c:29:6d:2f:82 brdff: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
  inet 192.168.31.2/32 scope global eno16777736
  valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe6d:2f82/64scope link
  valid_lft forever preferred_lft forever
  # ip addr show dev eno16777736
  eno16777736: mtu 1500qdiscpfifo_fast state UP qlen 1000
  link/ether 00:0c:29:75:1a:9c brdff:ff:ff:ff:ff:ff
  inet 192.168.31.141/24 brd 192.168.31.255 scope global dynamic eno16777736
  valid_lft 35850sec preferred_lft 35850sec
  inet 192.168.31.5/32scope global eno16777736
  valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe75:1a9c/64scope link
  valid_lft forever preferred_lft forever
  # ip addr show dev eno16777736
  eno16777736: mtu 1500qdiscpfifo_fast state UP qlen 1000
  link/ether 00:0c:29:02:21:19 brdff:ff:ff:ff:ff:ff
  inet 192.168.31.250/24 brd 192.168.31.255 scope global dynamic eno16777736
  valid_lft 35719sec preferred_lft 35719sec
  inet 192.168.31.4/32 scope global eno16777736
  valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe02:2119/64scope link
  valid_lft forever preferred_lft forever
  # ip addr show dev eno16777736
  eno16777736: mtu 1500qdiscpfifo_fast state UP qlen 1000
  link/ether 00:0c:29:e2:c7:fa brdff:ff:ff:ff:ff:ff
  inet 192.168.31.225/24 brd 192.168.31.255 scope global dynamic eno16777736
  valid_lft 35930sec preferred_lft 35930sec
  inet 192.168.31.3/32 scope global eno16777736
  valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fee2:c7fa/64scope link
  valid_lft forever preferred_lft forever
  在master2,slave1,slave2主机上查看主mysql的指向
  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
  MMM高可用性测试:
  服务器读写采有VIP地址进行读写,出现故障时VIP会漂移到其它节点,由其它节点提供服务。首先查看整个集群的状态,可以看到整个集群状态正常
  # 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的日志如下:
  # tail -f /var/log/mysql-mmm/mmm_mond.log
  2017/01/09 22:02:55WARN Check'rep_threads' on 'master1' is in unknown state! Message: UNKNOWN: Connect error(host = 192.168.31.83:3306, user = mmm_monitor)! Can't connect to MySQL serveron '192.168.31.83' (111)
  2017/01/09 22:02:55WARN Check'rep_backlog' on 'master1' is in unknown state! Message: UNKNOWN: Connect error(host = 192.168.31.83:3306, user = mmm_monitor)! Can't connect to MySQL serveron '192.168.31.83' (111)
  2017/01/09 22:03:05 ERROR Check 'mysql' on 'master1' has failed for 10seconds! 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 toHARD_OFFLINE (ping: OK, mysql: not OK)
  2017/01/09 22:03:07INFO Removingall roles from host 'master1':
  2017/01/09 22:03:07INFO   Removed role 'writer(192.168.31.2)' fromhost 'master1'
  2017/01/09 22:03:07INFO Orphanedrole 'writer(192.168.31.2)' has been assigned to 'master2'
  查看群集的最新状态
  # 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服务器群集状态
  # mmm_control checks all
  master1ping       OK
  master1mysql       ERROR: Connect error (host = 192.168.31.83:3306, user = mmm_monitor)!Can't connect to MySQL server on '192.168.31.83' (111)
  master1rep_threadsOK
  master1rep_backlogOK: Backlog is null
  slave1   ping         OK
  slave1mysql      OK
  slave1   rep_threadsOK
  slave1   rep_backlogOK: Backlog is null
  master2ping         OK
  master2mysql      OK
  master2rep_threadsOK
  master2rep_backlogOK: Backlog is null
  slave2   ping         OK
  slave2mysql      OK
  slave2   rep_threadsOK
  slave2   rep_backlogOK: Backlog is null
  从上面可以看到master1能ping通,说明只是服务死掉了。
  查看master2主机的ip地址:
  # ipaddr show deveno16777736
  eno16777736: mtu 1500qdiscpfifo_fast state UP qlen 1000
  link/ether 00:0c:29:75:1a:9c brdff:ff:ff:ff:ff:ff
  inet 192.168.31.141/24 brd 192.168.31.255 scope global dynamic eno16777736
  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/32scope global eno16777736
  valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe75:1a9c/64scope link
  valid_lft forever preferred_lft forever
  slave1主机:
  mysql> show slave status\G;
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master 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 for master to send event
  Master_Host: 192.168.31.141
  Master_User: rep
  Master_Port: 3306
  启动master1主机的mysql服务,观察monitor日志,master1的日志如下:
  # tail -f /var/log/mysql-mmm/mmm_mond.log
  2017/01/09 22:16:56INFO Check'mysql' on 'master1' is ok!
  2017/01/09 22:16:56INFO Check'rep_backlog' on 'master1' is ok!
  2017/01/09 22:16:56INFO Check'rep_threads' on 'master1' is ok!
  2017/01/09 22:16:59 FATAL State of host 'master1' changed from HARD_OFFLINEto AWAITING_RECOVERY
  从上面可以看到master1的状态由hard_offline改变为awaiting_recovery状态
  用如下命令将服务器上线:
  #mmm_controlset_onlinemaster1
  查看群集最新状态
  # 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 [|all[|all]] - show checks status#执行监控检查操作
  set_online   - set host online #将host设置为online
  set_offline    - set host offline #将host设置为offline
  mode      - print current mode. #打印输出当前的mode
  set_active      - switch into activemode.
  set_manual      - switch into manualmode.
  set_passive      - switch intopassive mode.
  move_role [--force]- move exclusive role to host#移除writer服务器为指定的host服务器(Only use --force if you know what you are doing!)
  set_ip    - setrole with ip to host
  检查所有的db服务器群集状态:
  # mmm_control checks all
  检查项包括:ping、mysql是否正常运行、复制线程是否正常等
  检查群集环境在线状况:
  # mmm_control show
  对指定的host执行offline操作:
  # mmm_controlset_offline slave2
  对指定的host执行onine操作:
  # mmm_controlset_online slave2
  执行write切换(手动切换):
  查看当前的slave对应的master
  # mysql -uroot -p123456 -e 'show slave status\G;'
  mysql: Using a password on the command line interface can beinsecure.
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.31.141
  writer切换,要确保mmm_common.conf文件中的writer属性有配置对应的host,否则无法切换
  # mmm_controlmove_role writer master1
  OK: Role 'writer' has been moved from 'master2' to 'master1'. Now you canwait some time and check new roles info!
  # 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
  # mysql -uroot -p123456 -e 'show slave status\G;'
  mysql: Using a password on the command line interface can beinsecure.
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.31.83
  4、其它处理问题
  如果不想让writer从master切换到backup(包括主从的延时也会导致写VIP的切换),那么可以在配置/etc/mysql-mmm/mmm_common.conf时,去掉中的backup
        #writer角色配置
  hosts master1      #这里只配置一个Hosts
  ips192.168.31.2    #对外提供的写操作的虚拟IP
  mode exclusive   #exclusive代表只允许存在一个主,也就是只能提供一个写的IP
  
  这样的话当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参数的影响。
  
  ===========================================================================================
  通过理论和实践的结合能更好的提升,欢迎转载,学习!
  

页: [1]
查看完整版本: Mysql高可用工具