obeckham 发表于 2018-9-29 09:25:35

MySQL-MMM实现MySQL多主多从,高可用,读写分离,故障自动切换

  作者:骚年有梦
  联系方式:lianglian8866@163.com
  一、环境简述
  1、工作逻辑图

  2、MySQL-MMM优缺点
  优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性。
  缺点:Monitor节点是单点,可以结合Keepalived实现高可用。
  3、MySQL-MMM工作原理
  MMM(Master-Master replication managerfor Mysql,Mysql主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)。
  4、MySQL-MMM成员
  mmm_mond:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。
  mmm_agentd:运行在每个mysql服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
  mmm_control:一个简单的脚本,提供管理mmm_mond进程的命令。
  mysql-mmm的监管端会提供多个虚拟IP(VIP),包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,监管会将VIP迁移至其他mysql。在整个监管过程中,需要在mysql中添加相关授权用户,以便让mysql可以支持监理机的维护。授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。
  二、安装MySQL-MMM
  通过github网站下载mysql-mmm
  https://github.com/search?utf8=?&q=mysql-mmm(复制浏览器打开),选择一个下载。
  编译安装:
  unzip mysql-mmm-master.zip
  cd mysql-mmm-master
  make install
  chmod +x /etc/init.d/mysql-mmm-*
  chmod +x /usr/sbin/mmm_*
  需求描述
  操作系统:CentOS 6.5_X64
  数据库:MySQL 5.6
  MMM:MySQL-MMM 2.2.1
  数据库分配:
  function
  ip
  hostname

  server>  monitoring host
  10.1.7.123
  monitor
  无
  master 1
  10.1.7.91
  db1
  master-1
  master 2
  10.1.7.115
  db2
  master-2
  slave 1
  10.1.7.120
  db3
  slave-1
  slave 2
  10.1.7.119
  db4
  slave-2
  虚拟IP地址(VIP):
  ip
  role
  10.1.7.200
  writer
  10.1.7.201
  reader
  10.1.7.202
  reader
  10.1.7.203
  reader
  三、开始做同步
  1、db1和db2做主主同步
  db1:
  修改mysql配置文件
  cp /etc/my.cnf /etc/my.cnf.bak
  vim /etc/my.cnf
  
  #mysql同步#
  server-id=1 #服务器标示两边都要不一样#
  log-bin=mysql-bin #启用记录binlog
  binlog-do-db=test #记录binlog日志的数据库#
  ##binlog-ignore-db=mysql #不记录binlog日志的数据库#
  replicate-do-db=test #要同步的数据库#
  ##replicate-ignore-db=mysql #不同步的数据库#
  log-slave-updates    #启用更新binlog,处于master角色的时候必须。
  slave-skip-errors=all #跳过不是很重要的错误信息#
  sync_binlog=1      #每条自动更新,安全性高,默认是0
  auto_increment_increment=2 #每次步长增长值#   (红色字体的只在主主的情况下用,几个主数字就写几,避免自增冲突)
  auto_increment_offset=1 #起始步长值mei都要不一样#
  【做同步的时候如果不选择要同步的数据库默认全部同步】
  service mysqld restart#重启服务
  登录mysql,创建同步用户并授权,配置master信息,启用slave:

  mysql> grant replication slave on *.* to 'tongbu'@'10.1.7.%'>  mysql> flush privileges;
  mysql> change master to master_host="10.1.7.115", master_port=3306, master_user="tongbu", master_password="tongbu", master_log_file="mysql-bin.000011", master_log_pos=120 , master_connect_retry=10;
  mysql> start slave;   #启动slave
  mysql> show slave status\G#查看slave 状态

  db2:
  修改mysql配置文件
  cp /etc/my.cnf /etc/my.cnf.bak
  vim /etc/my.cnf
  
  #mysql同步#
  server-id=2 #服务器标示两边都要不一样#
  log-bin=mysql-bin #启用记录binlog
  binlog-do-db=test #记录binlog日志的数据库#
  ##binlog-ignore-db=mysql #不记录binlog日志的数据库#
  replicate-do-db=test #要同步的数据库#
  ##replicate-ignore-db=mysql #不同步的数据库#
  log-slave-updates    #启用更新binlog,处于master角色的时候必须。
  slave-skip-errors=all #跳过不是很重要的错误信息#
  sync_binlog=1      #每条自动更新,安全性高,默认是0
  auto_increment_increment=2 #每次步长增长值#   (红色字体的只在主主的情况下用)
  auto_increment_offset=2 #起始步长值两边都要不一样#
  【做同步的时候如果不选择要同步的数据库默认全部同步】
  service mysqld restart#重启服务
  登录mysql,创建同步用户并授权,配置master信息,启用slave:

  mysql> grant replication slave on *.* to 'tongbu'@'10.1.7.%'>  mysql> flush privileges;
  mysql> change master to master_host="10.1.7.91", master_port=3306, master_user="tongbu", master_password="tongbu", master_log_file="mysql-bin.000016", master_log_pos=120, master_connect_retry=10;
  mysql> start slave;   #启动slave
  mysql> show slave status\G#查看slave 状态

  Note:
  这里存在一个问题,就是关于选择哪个db作为db3,db4的主。由于网上关于两主多slave的架构的方案文档很少,我曾经在这里也犯过一个错误,所以现在给大家强调一下,如果大家觉得我所说的内容有问题,请反馈给我,谢谢。
  那么是选择10.1.7.200作为主?因为10.1.7.200是永远在线并且唯一的ip?
  错!选择110.1.7.200作为主是最严重的错误,虽然10.1.7.200会切换到其他机器,但是db3上,Master_Log_File:和Read_Master_Log_Pos却会出现问题,具体细节问题大家自己测试下吧。
  选择其他三个虚拟IP也是不可以取的,所以我们最终选择db2或者db1的真实IP。纠结,mysql-mmm比我们想象中智能,他会在db3的master offline的时候,自动切换主到另外一个master服务器,也就说说db3的master是跟着writer角色迁移的,前提是你配置好了mysql-mmm
  如果角色停机大于了60s,就需要手动设置online。
  2、db3、db4做db1,db2得从
  cp /etc/my.cnf /etc/my.cnf.bak
  vim /etc/my.cnf
  server-id=3 #每个机器要不一样
  重启服务
  mysql> change master to master_host="10.1.7.91", master_port=3306, master_user="tongbu", master_password="tongbu", master_log_file="mysql-bin.000016", master_log_pos=120, master_connect_retry=10;    (这里的masterIP指到db1,当db1故障的时候mmm监管机器会通过客户端授权的那个agent用户来重新配置指定新的master到db2)
  mysql> start slave;   #启动slave
  3、在四台db节点授权monitor主机访问
  # mysql -u root

  mysql> GRANT REPLICATIONCLIENT ON *.* TO 'mmm-monitor'@'10.1.7.%'>
  mysql> GRANT SUPER,REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.1.7.%'>  mysql> flush privileges;
  三、配置MySQL-MMM
  1、配置mmm_common.conf (整体框架配置文件)
  active_master_role                              writer
  
  cluster_interface                     eth0
  pid_path                                    /var/run/mmm_agentd.pid
  bin_path                                    /usr/lib/mysql-mmm/
  replication_user                         tongbu   (建立同步的用户名和密码,当master挂了,mmm帮从与新的master重新与主建立同步关系)
  replication_password                tongbu
  agent_user                                  mmm-agent   (被监控机器上授权的那个用户,mmm监管机通过这个用户去查看那agent端mysql的信息)
  agent_password                        mmm-agent
  
   (定义主机名称)
  ip                                          10.1.7.91(主机真实IP)
  mode                                    master    (定义主机角色)
  peer                                       master-2(指定同等角色)
  
  
  ip                                          10.1.7.115
  mode                                    master
  peer                                    master-1
  
  
  ip                                    10.1.7.120
  mode                                    slave
  
  
  ip                                    10.1.7.1193
  mode                                    slave
  
  
  hosts                                 master-1,master-2      (可以写角色主机)
  ips                                    10.1.7.200                            (用来写的虚IP)
  mode                                 exclusive                            (模式独一的)
  prefer                                  master-1                                 (优先哪一台)
  
  
  hosts                                 slave-1,slave-2,master-2             (用来读的角色主机)
  ips                                     10.1.7.201,10.1.7.202,10.1.7.203      (读的虚IP,会将这些IP随机分给slave)
  mode                                    balanced                                        (模式是负载均衡)
  
  2、配置mmm_mon.conf(monitor端配置文件)
  include mmm_common.conf (调用整体框架)
  
  ip                                    127.0.0.1   (monitor主机IP)
  pid_path                              /var/run/mmm_mond.pid
  bin_path                              /usr/lib/mysql-mmm/
  status_path                           /var/lib/misc/mmm_mond.status
  ping_ips                              10.1.7.91,10.1.7.115,10.1.7.120,10.1.7.119   (要监控的主机的真实IP)
  
  
  monitor_user                              mmm-monitor    (agent授权monitor主机的用户)
  monitor_password                        mmm-monitor
  
  debug 0
  2、配置mmm_agent.conf(agent端配置文件)
  include mmm_common.conf    (调用整体框架)
  this master-1   (指明自己的角色)
  【agent端的主机安装的mmm只需要配置mmm_agent.conf,mmm_common.conf 这两个文件
  monitor端的主句安装好mmm后只需要配置mmm_mon.conf,mmm_common.conf 这两个文件
  配置好后agent端启动mysql-mmm-agent服务,monitor端启动mysql-mmm-monitor服务】
  在监控端可以查看并验证各角***况
  # mmm_control help
  Valid commands are:
  help                              - show this message
  ping                              - ping monitor
  show                              - show status
  checks [|all [|all]] - show checks status
  set_online                  - set hostonline
  set_offline               - set hostoffline
  mode                              - print current mode.
  set_active                        - switch into active mode.
  set_manual                        - switch into manual mode.
  set_passive                     - switch into passive mode.
  move_role [--force]   - move exclusive roleto host
  (Only use --force if you know what you are doing!)
  set_ip                  - set role with ipto host
  你可以使用各种mmm_control命令配合参数来操作处理框架中的主机和问题。具体用法见官网:http://mysql-mmm.org/mysql-mmm.html
  故障演练:当master-1down了 将虚IP自动飘到了master-2上


  到此我们的mysql-mmm双主多从一写三读的高可用架构就完成了,使用在读多写少的环境中,具体一写问题查看官方文档说明和我下面参考的文章,如还有不懂了可以联系我 E-mail:lianglian8866@163.com
  关于msyql同步,补充一个小技巧:
  slave只是复制master的信息嘛,解决掉问题后,slave同步不好,下面的方法能很快解决这个问题
  stop slave;
  reset slave;
  change master to master_host="10.1.7.200",master_port=3306, master_user="tongbu", master_password="tongbu", master_log_file="mysql-bin.000016", master_log_pos=120, master_connect_retry=10;
  start slave;
  (使用时,注意考虑情况,是否合适使用。)
  在做过mysql同步的机器准备重新做,可以清除所有slave设置;
  reset slave all;清除所有记录。
  reset slave;和reset slave all;的区别是第一个只是情况一些没必要的错误信息,保留master信息,重新启动slave后能够很快进入工作,后者则是清除slave的全部信息,不保留master信息,需重洗配置master信息,用在和其他机器重新做同步的时候。
  故障记录:
  wgethttp://xrl.us/cpanm--no-check-certificate -O /usr/sbin/cpanm && chmod +x/usr/sbin/cpanm
  cpan安装perl模块:
  Juno::Check::FPing
  Algorithm::Diff
  Proc::Daemon
  Log::Log4perl
  Mail::Send
  Net::ARP
  Time::HiRes
  DBI
  DBD::mysql 【装这个报错:如下】

  这里必须手动编译
  /usr/bin/perl Makefile.PL --with-mysql=/Data/apps/mysql/ --mysql_config=/Data/apps/mysql/bin/mysql_config
  make test && make install
  启动报错:

  解决方法:
  如上提示:
  提示/etc/mysql-mmm/mmm_mon.conf 是全局可读的,那明显他是不让全部人都可读,那我们改一下权限,只有属主可以读!重启就好了。

  参考文档:http://linuxguest.blog.51cto.com/195664/578307
  软件参考文档也可以访问我的有道云笔记下载:http://note.youdao.com/share/?id=8d4d25a0280aeeab9be96d36bd868651&type=note(最下面)
  ========================================================================
  如果你觉得该篇文章写的不错,并且在你的工作或者生活中带来了帮助,那么你愿意在生活中给予我帮助吗?如果你愿意,为我写博客添加一些动力,可以扫下面得二维码给予我少量得赞助。
  (不管再小得赞助都是你对我得肯定,这会是我一直坚持下去得动力~! 谢谢!)

  这是我的微信:


页: [1]
查看完整版本: MySQL-MMM实现MySQL多主多从,高可用,读写分离,故障自动切换