设为首页 收藏本站
查看: 1829|回复: 0

[经验分享] MySQL 高可用性之MySQL-MMM

[复制链接]

尚未签到

发表于 2018-10-10 07:05:49 | 显示全部楼层 |阅读模式
  一、MMM简介
  MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入)。
  MMM也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟ip。
  除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。
  MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。这个方案是目前比较成熟的解决方案。
DSC0000.png

  优点:
  高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。当主服务器挂掉以后,另一个主立即接管,其他的从服务器能自动切换,不用人工干预。
  缺点:
  monitor节点是单点,不过这个你也可以结合keepalived或者haertbeat做成高可用;
  至少三个节点,对主机的数量有要求,需要实现读写分离,还需要在前端编写读写分离程序;
  在读写非常繁忙的业务系统下表现不是很稳定,可能会出现复制延时、切换失效等问题。
  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
  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.106 monitor1
  3.安装支持包和相关库
  在所有主机上安装perl perl-devel perl-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 -i Algorithm::Diff>  #cpan Proc::Daemon
  #cpan Log::Log4perl
  4.配置master1和master2互为主从,slave1为master1的从。注意添加防火墙规则。(具体的配置方法这里不再叙述)
  5.mysql-mmm配置:
DSC0001.png


  mysql> grant super,replicationclient,process on *.* to 'mmm_agent'@'192.168.31.%'>
  mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.31.%'>  注意:因为之前的主从复制,所以可以只在master1服务器执行就ok了。
  mmm_monitor用户:mmm监控用于对mysql服务器进程健康检查
  mmm_agent用户:mmm代理用来更改只读模式,复制的主服务器等
  检查master2和slave1上是否都存在监控和代理账号:
DSC0002.png

DSC0003.png

  5、mysql-mmm安装及配置
DSC0004.png

  监控程序和代理程序都集成在mysql-mmm-2.2.1.tar.gz源码包中,所以四台服务器都要利用该源码包安装。
  下载地址:
  http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
  (1)编写配置文件(五台主机必须一致)
  完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。
  管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:
DSC0005.png

  
  cluster_interfaceeno16777736  #群集的网络接口
  pid_path       /var/run/mmm_agentd.pid    #pid路径
  bin_path          /usr/lib/mysql-mmm/    #可执行文件路径
  replication_user        rep    #复制用户
  replication_password   123456  #复制用户密码
  agent_usermmm_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
  mode    slave          #slave的角色属性代表当前host是从
  
      #writer角色配置
  hosts      master1,master2    #能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
  ips    192.168.31.2    #对外提供的写操作的虚拟IP
  mode   exclusive    #exclusive代表只允许存在一个主,也就是只能提供一个写的IP
  
      #read角色配置
  hosts   master2,slave1    #对外提供读操作的服务器的host名,当然这里也可以把master加进来
  ips     192.168.31.3,192.168.31.4 #对外提供读操作的虚拟ip,这两个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同。
  mode     balanced    #balanced代表负载均衡
  
  将这个文件拷贝到其它的服务器,配置不变。
  for host in master1 master2 slave1 ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done
  mmm监控端的主要配置
  (2)配置监控文件
DSC0006.png

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

  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_ips192.168.31.83,192.168.31.141,192.168.31.250 #用于测试网络可用性 IP 地址列表,只要其中有一个地址 ping 通,就代表网络正常,这里不要写入本机地址。
  auto_set_online  0 #设置自动online的时间,默认是超过60s就将它设置为online,默认是60s,这里将其设为0就是立即online
  
  
  check_period    5   #检查周期默认为5s
  trap_period     10  #一个节点被检测不成功的时间持续trap_period秒,就慎重的认为这个节点失败了,默认为10秒。
  timeout         2   #检查超时的时间默认为2秒
  #restart_after     10000#在完成restart_after次检查后,重启checker进程。
  max_backlog     86400  #记录检查rep_backlog日志的最大次数,默认为60。
  
  
  monitor_usermmm_monitor   #监控db服务器的用户
  monitor_password  123456  #监控db服务器的密码
  
  debug 0  #debug 0正常模式,1为debug模式
  (3)启动监控进程
DSC0008.png

DSC0009.png

  注:添加source /root/.bash_profile目的是:在mysql-mmm-monitor下次开机自启时,执行/root/.bash_profile,为其提供环境变量。
  自动启动和手动启动的唯一区别,就是激活一个console 。那么说明在作为服务启动的时候,可能是由于缺少环境变量。
DSC00010.png

  成功启动监控进程
DSC00011.png

  mmm_mond监控服务监听的端口号为9988,注意在防火墙添加规则。
  mysql服务器端的主要配置
  (4)代理文件配置(三台mysql服务器以master1为例)
DSC00012.png

DSC00013.png

  编辑 4台mysql节点机上的/etc/mysql-mmm/mmm_agent.conf
  注意:这个配置只配置db服务器,监控服务器不需要配置,this后面的host名改成当前服务器的主机名。
  (5)启动代理进程(三台mysql服务器以master1为例)
DSC00014.png

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

DSC00016.png

  成功启动代理进程
DSC00017.png

  mmm_agentd服务监听的是9989端口,注意添加防火墙规则。
  注意:在这三台mysql服务器上都要配置代理文件并启动代理程序。
  (6)检查集群状态
  注意:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。
  MMM启动顺序:先启动monitor,再启动 agent。
DSC00018.png

  在监控主机上执行”mmm_control show”,发现mysql服务器都处于ONLINE状态,能够写入的只有master1。
  如果服务器状态不是ONLINE,可以用如下命令将服务器上线,例如:
  #mmm_control  set_online 主机名
DSC00019.png

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

  master2上启用了read vip地址。
DSC00021.png

  slave1上启用了read vip地址。
DSC00022.png

DSC00023.png

  master2和slave1的主都是master1
  6.MMM高可用性测试
  停止master1的mysqld服务,模拟master1宕机,手动停止mysql服务,观察monitor日志:
DSC00024.png

DSC00025.png

  查看群集的最新状态,从显示结果可以看出master1的状态有ONLINE转换为HARD_OFFLINE,写VIP转移到了master2主机上。
DSC00026.png

  检查所有的db服务器群集状态,执行”mmm_control checks all”,从上面可以看到master1能ping通,说明只是服务死掉了。
DSC00027.png

  write vip地址到了master2上了
DSC00028.png

  从服务器的主自动切换为了master2
  启动master1的mysqld服务
DSC00029.png

  从上面可以看到master1的状态由hard_offline改变为awaiting_recovery状态。
  将其上线后,可以看到master1并不会接管主,除非现有的主再次宕机。
  7.总结
  (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-mmm日志文件:
  日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。
  db端:/var/log/mysql-mmm/mmm_agentd.log
  监控端:/var/log/mysql-mmm/mmm_mond.log
  2、mysql-mmm命令文件:
  mmm_agentd:db代理进程的启动文件
  mmm_mond:监控进程的启动文件
  mmm_backup:备份文件
  mmm_restore:还原文件
  mmm_control:监控操作命令文件
  db服务器端只有mmm_agentd程序,其它的都是在monitor服务器端。
  3、mysql-mmm的六种状态
  online:正常的状态,可以充当各种角色
  admin_offline:手动下线的状态
  hard_offline:ping不通并且(或者)mysql连接中断,会导致这种状态。
  awaiting_recovery:等待恢复状态,能ping通,mysql连接接恢复正常。
  replication_delay:复制延迟
  replication_fail:复制中断,sql线程或io线程出现问题。
  4.mmm_control用法
  mmm_control程序可以用于监控群集状态、切换writer、设置online\offline操作等。
  Valid commands are:
  help        - show this message #帮助信息
  ping        - ping monitor #ping当前的群集是否正常
  show        - show status #群集在线状态检查
  checks [|all [|all]] #执行监控检查操作
  set_online          #将host设置为online
  set_offline     #将host设置为offline
  mode       #打印输出当前的mode
  set_active      - switch into active mode.
  set_manual      - switch into manual mode.
  set_passive      - switch into passive mode.
  move_role [--force] - move exclusive role to host
  set_ip host>   - set role with ip to host


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619687-1-1.html 上篇帖子: MySQL 高可用性之keepalived+mysql双主 下篇帖子: mysql 主从同步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表