文档章节

基于mysql-mmm实现对mysql replication进行监控和故障迁移

五大三粗
 五大三粗
发布于 2015/04/21 10:40
字数 2683
阅读 18
收藏 1
一、mysql-mmm简述:
       mysq-mmm英译:MYSQL-MMM(Mysql Master-Master replication manager for Mysql)是一套基于perl编写的脚本程序(这也是我们配置时需要安装perl相关的依赖包),用来对 mysql replication 进行监控和故障迁移,并能管理 mysql Master-Master 复制的配置(同一时间只有一个节点是可写的,在DB server宕掉后,会自动帮你重新配置主从),附带的工具套件可以实现多个 slaves 的 read 负载均衡,因此你可以使用这个工具移除一组服务器中复制延迟较高的服务器的虚拟 IP,它还可以备份数据,两节点之间再同步等等。
二、mysql-mmm命令的组成部分及原理,相关用户简介[基于c/s架构,就是说代理端需要配置agent,监管端需要配置monitor]:
1.命令构成:
       mmm_mond :监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监管机上运行。
       mmm_agentd :运行在每个 mysql 服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置 。此脚本需要在被监管机上运行。
       mmm_control :一个简单的脚本,提供管理 mmm_mond 进程的命令
2.mysql-mmm的原理:
       mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读VIP,通过监管的管理,这些 IP 会绑定在可用 mysql 之上,当某一台 mysql 宕机时,监管机会将 VIP 迁移至其他 mysql。在整个监管过程中,需要在 mysql 中添加相关授权用户,以便让 mysql 可以支持监理机的维护。授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。
3.相关用户简介:
      monitor user(这里使用:mmm_monitor):mmm监控用于对mysql服务器进程健康检查,需要具有  REPLICATION CLIENT
      agent user(这里使用:mmm_agent):mmm代理用来更改只读模式,复制的主服务器等等,需要具有  SUPER, REPLICATION CLIENT, PROCESS
      relication user(这里使用:slave):用于复制,需要具有  REPLICATION SLAVE
4.官方配置文档:
      mysql-mmm官方文档: http://mysql-mmm.org/mmm2:guide
三、本次测试环境拓扑图:

mysql-mmm

四、mysql-mmm配置实例:
1.测试环境:
系统:red hat linux 6(2.6.32)
数据库:mysql 5.1.61(这里直接使用rpm包安装,也不使用最新版本数据库)
MMM:mysql-mmm 2.2.21
DB server地址分配:
      192.168.1.100(master)
     192.168.1.101(master)
     192.168.1.102(slave)
     192.168.1.103(slave)
MMM地址:
     192.168.1.104(monitor)
虚拟IP地址(vip):
     192.168.1.12(write)
     192.168.1.13(read)
     192.168.1.14(read)
     192.168.1.15(read)

2.在DB server机器上安装、配置mysql数据库

  1. [root@client100 ~]# yum -y install mysql mysql-server
  2. [root@client101 ~]# yum -y install mysql mysql-server
  3. [root@client102 ~]# yum -y install mysql mysql-server
  4. [root@client103 ~]# yum -y install mysql mysql-server
  5. # 设置1台DB server(192.168.1.100)的登陆密码[其他机器使用备份恢复即可]
  6. [root@client100 ~]# mysqladmin -uroot password 'kongzhong'
  7. # 修改192.168.1.100数据库配置文件
  8. [root@client100 ~]# vim /etc/my.cnf
  9. # 添加或修改如下参数
  10. max_connections=1400
  11. binlog-format='row'
  12. server_id= 100
  13. log_bin= /var/lib/mysql/mysql-100-bin.log
  14. log_bin_index= /var/lib/mysql/mysql-bin.log.index
  15. relay_log= /var/lib/mysql/mysql-relay-bin
  16. relay_log_index= /var/lib/mysql/mysql-relay-bin.index
  17. expire_logs_days= 10
  18. max_binlog_size= 100M
  19. log_slave_updates= 1
  20. sync-binlog=1
  21. auto_increment_increment=2
  22. auto_increment_offset=1
  23. # skip-name-resolve 这个参数可以选配,如果不使用,则host配置文件必须有所有dbserver对应解析关系
  24. skip-name-resolve
  25. # 修改192.168.1.101数据库配置文件
  26. [root@client101 ~]# vim /etc/my.cnf
  27. max_connections=1400
  28. binlog-format='row'
  29. server_id= 101
  30. log_bin= /var/lib/mysql/mysql-101-bin.log
  31. log_bin_index= /var/lib/mysql/mysql-bin.log.index
  32. relay_log= /var/lib/mysql/mysql-relay-bin
  33. relay_log_index= /var/lib/mysql/mysql-relay-bin.index
  34. expire_logs_days= 10
  35. max_binlog_size= 100M
  36. log_slave_updates= 1
  37. sync-binlog=1
  38. auto_increment_increment=2
  39. # 这个参数值和上面的值不一样
  40. auto_increment_offset=2
  41. skip-name-resolve
  42. # 修改192.168.1.102数据库配置文件
  43. [root@client102 ~]# vim /etc/my.cnf
  44. max_connections=1400
  45. server_id= 102
  46. log_bin= /var/lib/mysql/mysql-102-bin.log
  47. log_bin_index= /var/lib/mysql/mysql-bin.log.index
  48. relay_log= /var/lib/mysql/mysql-relay-bin
  49. relay_log_index= /var/lib/mysql/mysql-relay-bin.index
  50. log_slave_updates= 1
  51. # 修改192.168.1.103数据库配置文件
  52. [root@client103 ~]# vim /etc/my.cnf
  53. max_connections=1400
  54. server_id= 103
  55. log_bin= /var/lib/mysql/mysql-103-bin.log
  56. log_bin_index= /var/lib/mysql/mysql-bin.log.index
  57. relay_log= /var/lib/mysql/mysql-relay-bin
  58. relay_log_index= /var/lib/mysql/mysql-relay-bin.index
  59. log_slave_updates= 1
  60. # 启动所有DB server上的mysql数据库
  61. [root@client100 ~]# /etc/init.d/mysqld start
  62. [root@client101 ~]# /etc/init.d/mysqld start
  63. [root@client102 ~]# /etc/init.d/mysqld start
  64. [root@client103 ~]# /etc/init.d/mysqld start
  65. # 登陆192.168.1.100上的数据库,做授权操作(授权用户包括复制的用户,mmm需要的监控,代理用户等)
  66. mysql> grant replication slave on *.* to 'slave'@'192.168.1.%' identified by 'kongzhong';
  67. mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.1.%' identified by 'kongzhong';
  68. mysql> grant replication client,process,super on *.* to 'mmm_agent'@'192.168.1.%' identified by 'kongzhong';
  69. mysql> flush privileges;
  70. # 备份192.168.1.100的数据,并传送到其他几台DB server上
  71. [root@client100 ~]# mysqldump -uroot -p --all-databases --lock-all-tables --flush-logs >/tmp/all.sql
  72. Enter password:
  73. [root@client100 ~]# scp /tmp/all.sql 192.168.1.101:/tmp/
  74. root@192.168.1.101's password:
  75. all.sql 100% 495KB 495.3KB/s 00:00
  76. [root@client100 ~]# scp /tmp/all.sql 192.168.1.102:/tmp/
  77. root@192.168.1.102's password:
  78. all.sql 100% 495KB 495.3KB/s 00:00
  79. [root@client100 ~]# scp /tmp/all.sql 192.168.1.103:/tmp/
  80. root@192.168.1.103's password:
  81. all.sql 100% 495KB 495.3KB/s 00:00

3.配置DB server 的主从关系

(1).在192.168.1.101,192.168.1.102,192.168.1.103利用备份还原数据库,并重启数据库[这里不演示,大家都会]

(2).在192.168.1.100上查看当前日志文件的位置

  1. mysql> show master status;
  2. +----------------------+----------+--------------+------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  4. +----------------------+----------+--------------+------------------+
  5. | mysql-100-bin.000003 | 106 | | |
  6. +----------------------+----------+--------------+------------------+
  7. 1 row in set (0.00 sec)

(3).在192.168.1.101,192.168.1.102,192.168.1.103配置与192.168.1.100的主从关系,语句如下:

  1. mysql> CHANGE MASTER TO master_host='192.168.1.100',
  2. -> master_port=3306,
  3. -> master_user='slave',
  4. -> master_password='kongzhong',
  5. -> master_log_file='mysql-100-bin.000003',
  6. -> master_log_pos=106;
  7. mysql> start slave;
  8. mysql> show slave start\G;
  9. # 配置完主从,查看下面两个参数的值是否为yes,根据提示排错
  10. Slave_IO_Running: Yes
  11. Slave_SQL_Running: Yes

(4).配置192.168.1.100与192.168.1.01互为主从

  1. # 在192.168.1.101上查看当前日志文件的位置
  2. mysql> show master status;
  3. +----------------------+----------+--------------+------------------+
  4. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  5. +----------------------+----------+--------------+------------------+
  6. | mysql-101-bin.000004 | 996936 | | |
  7. +----------------------+----------+--------------+------------------+
  8. 1 row in set (0.00 sec)
  9. # 在192.168.1.100上,执行如下语句
  10. mysql>CHANGE MASTER TO master_host='192.168.1.101',
  11. -> master_port=3306,
  12. -> master_user='slave',
  13. -> master_password='kongzhong',
  14. -> master_log_file='mysql-101-bin.000004',
  15. -> master_log_pos=996936;
  16. mysql> start slave;
  17. mysql> show slave start\G;
  18. # 配置完主从,查看下面两个参数的值是否为yes,根据提示排错
  19. Slave_IO_Running: Yes
  20. Slave_SQL_Running: Yes
  21. # 以上配置完之后,大家可以在主DB server创建库来验证主从的有效性(这里不演示了)

4.在所有机器上安装如下软件:

  1. # 所有机器(包括dbserver和监控机器)都需安装[这里指演示在一台机器上安装]
  2. [root@client104 ~]# yum -y install libart_lgpl perl-Date-Manip perl-XML-DOM perl-XML-DOM-XPath perl-XML-Parser perl-XML-RegExp rrdtool perl-Class-Singleton perl perl-DBD-MySQL perl-Params-Validate perl-MailTools perl-Time-HiRes
  3. # 以下几个软件,本地光盘上是没有的,需要使用网络yum源[epel],我这里下载好了
  4. # 下载地址如下:http://www.kuaipan.cn/file/id_119710994921422892.htm
  5. [root@client104 ~]# yum -y install perl-Algorithm-Diff-1.1902-9.el6.noarch.rpm perl-IPC-Shareable-0.60-2.el6.rf.noarch.rpm perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm perl-Net-ARP-1.0.6-2.1.el6.x86_64.rpm perl-Proc-Daemon-0.06-1.el6.noarch.rpm perl-Proc-ProcessTable-0.44-4.el6.x86_64.rpm rrdtool-perl-1.3.8-6.el6.x86_64.rpm
  6. # 数据库端需要安装
  7. [root@client101..3 ~]#yum -y install mysql-connector-odbc

5.在所有机器上安装mysql-mmm软件:

  1. # 安装mysql-mmm,可以使用epel提供的rpm包安装
  2. # 这里不使用rpm安装,软件都已共享,自行下载,在每台机器上安装mysql-mmm[这里仅演示在1台机器上mysql-mmm]
  3. [root@client104 ~]# tar -xf mysql-mmm-2.2.1.tar.gz
  4. [root@client104 ~]# cd mysql-mmm-2.2.1
  5. [root@client104 mysql-mmm-2.2.1]# make install
  6. # 配置mmm_common.conf,并传送到每台机器上对应目录[包括监控机]
  7. [root@client104 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_common.conf
  8. active_master_role writer
  9. <host default>
  10. cluster_interface eth0
  11. pid_path /var/run/mmm_agentd.pid
  12. bin_path /usr/lib/mysql-mmm/
  13. # 用于主从复制的账户和密码
  14. replication_user slave
  15. replication_password kongzhong
  16. # 代理端的账户和密码[这些账户,上面都已做过授权,不清楚,可以回头看看]
  17. agent_user mmm_agent
  18. agent_password kongzhong
  19. </host>
  20. # 配置第一台DB server,这里的ip地址写真实数据库IP地址,模式为主dbserver
  21. <host db1>
  22. ip 192.168.1.100
  23. mode master
  24. peer db1
  25. </host>
  26. # 配置第二台DB server,模式为主dbserver
  27. <host db2>
  28. ip 192.168.1.101
  29. mode master
  30. peer db2
  31. </host>
  32. # 配置第三台DB server,模式为从dbserver
  33. <host db3>
  34. ip 192.168.1.102
  35. mode slave
  36. </host>
  37. # 配置第四台DB server,模式为从dbserver
  38. <host db4>
  39. ip 192.168.1.103
  40. mode slave
  41. </host>
  42. # 配置可写的DB server(即master dbserver),这里的ip为虚拟ip地址
  43. <role writer>
  44. hosts db1, db2
  45. ips 192.168.1.12
  46. mode exclusive
  47. </role>
  48. # 配置可读的DB server(可以是所有,也可以是部分),这里的ip为虚拟ip地址,模式为轮询,
  49. <role reader>
  50. hosts db1, db2, db3, db4
  51. ips 192.168.1.13, 192.168.1.14, 192.168.1.15,192.168.1.16
  52. mode balanced
  53. </role>
  54. # 上面的配置文件传送到各个主机
  55. [root@client104 mysql-mmm-2.2.1]# scp /etc/mysql-mmm/mmm_common.conf 192.168.1.101:/etc/mysql-mmm/mmm_common.conf
  56. [root@client104 mysql-mmm-2.2.1]# scp /etc/mysql-mmm/mmm_common.conf 192.168.1.102:/etc/mysql-mmm/mmm_common.conf
  57. [root@client104 mysql-mmm-2.2.1]# scp /etc/mysql-mmm/mmm_common.conf 192.168.1.103:/etc/mysql-mmm/mmm_common.conf
  58. [root@client104 mysql-mmm-2.2.1]# scp /etc/mysql-mmm/mmm_common.conf 192.168.1.100:/etc/mysql-mmm/mmm_common.conf

6.分别修改192.168.1.101,192.168.1.102,192.168.1.103,192.168.1.100的mmm_agent.conf文件,注意this 部分

  1. [root@client100 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf
  2. include mmm_common.conf
  3. this db1
  4. [root@client101 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf
  5. include mmm_common.conf
  6. this db2
  7. [root@client102 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf
  8. include mmm_common.conf
  9. this db3
  10. [root@client103 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf
  11. include mmm_common.conf
  12. this db4

7.修改监控端(192.168.1.104)的mmm_mon.conf文件[此文件仅监控端需要配置]

  1. [root@client104 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_mon.conf
  2. include mmm_common.conf
  3. # 以下IP均为真实IP地址
  4. <monitor>
  5. ip 192.168.1.104
  6. pid_path /var/run/mmm_mond.pid
  7. bin_path /usr/lib/mysql-mmm/
  8. status_path /var/lib/misc/mmm_mond.status
  9. ping_ips 192.168.1.100, 192.168.1.101, 192.168.1.102, 192.168.1.103
  10. </monitor>
  11. # 监管的账号密码
  12. <host default>
  13. monitor_user mmm_monitor
  14. monitor_password kongzhong
  15. </host>
  16. debug 0

8.dbserver启动agent,监管端启动monitor

  1. [root@client100 ~]# /etc/init.d/mysql-mmm-agent start
  2. Daemon bin: '/usr/sbin/mmm_agentd'
  3. Daemon pid: '/var/run/mmm_agentd.pid'
  4. Starting MMM Agent daemon... Ok
  5. [root@client101 ~]# /etc/init.d/mysql-mmm-agent start
  6. Daemon bin: '/usr/sbin/mmm_agentd'
  7. Daemon pid: '/var/run/mmm_agentd.pid'
  8. Starting MMM Agent daemon... Ok
  9. [root@client102 ~]# /etc/init.d/mysql-mmm-agent start
  10. Daemon bin: '/usr/sbin/mmm_agentd'
  11. Daemon pid: '/var/run/mmm_agentd.pid'
  12. Starting MMM Agent daemon... Ok
  13. [root@client103 ~]# /etc/init.d/mysql-mmm-agent start
  14. Daemon bin: '/usr/sbin/mmm_agentd'
  15. Daemon pid: '/var/run/mmm_agentd.pid'
  16. Starting MMM Agent daemon... Ok
  17. # 监管端启动
  18. [root@client104 mysql-mmm-2.2.1]# /etc/init.d/mysql-mmm-monitor start
  19. Daemon bin: '/usr/sbin/mmm_mond'
  20. Daemon pid: '/var/run/mmm_mond.pid'
  21. Starting MMM Monitor daemon: Ok
  22. # 查看状态[第一次需要激活dbserver]
  23. [root@client104 ~]# mmm_control show
  24. db1(192.168.1.100) master/AWAITING_RECOVERY. Roles:
  25. db2(192.168.1.101) master/AWAITING_RECOVERY. Roles:
  26. db3(192.168.1.102) slave/AWAITING_RECOVERY. Roles:
  27. db4(192.168.1.103) slave/AWAITING_RECOVERY. Roles:
  28. # 激活所有dbserver
  29. [root@client104 ~]# mmm_control set_online db1
  30. [root@client104 ~]# mmm_control set_online db2
  31. [root@client104 ~]# mmm_control set_online db3
  32. [root@client104 ~]# mmm_control set_online db4
  33. # 再次查看
  34. [root@client104 ~]# mmm_control show
  35. db1(192.168.1.100) master/ONLINE. Roles: reader(192.168.1.14)
  36. db2(192.168.1.101) master/ONLINE. Roles: reader(192.168.1.13), writer(192.168.1.12)
  37. db3(192.168.1.102) slave/ONLINE. Roles: reader(192.168.1.16)
  38. db4(192.168.1.103) slave/ONLINE. Roles: reader(192.168.1.15)
  39. # 现在mmm就配置好,大家可以自行测试
  40. # 我的测试方法为:停掉192.168.1.101的dbserver 查看虚拟ip变化,其他几台dbserver复制的变化
  41. # 启动192.168.1.101的dbserver,停掉192.168.1.100,查看虚拟ip的变化,特别看两台slave上复制主服务器的指向

五、配置中遇到的问题

1.问题1报错如下:

ERROR: Can't connect to monitor daemon!

可以 把debug=1 再去看日志文件,由哪些问题引起的。

2.问题2如下:

启动monitor ,ok。设置成debug模式。可以看到这样的错误:

DEBUG mysql(db2) = 'ERROR: Connect error (host = 192.168.1.100:3306, user = mmm_monitor)! Can't connect to MySQL server on '192.168.1.100' (4)'

# 这个问题搞了半天才解决,希望大家注意:

原因:因为你的agent配置文件里写的是this db1 .this db2.在host里没有对应的解析.所以无法连接。

在/etc/hosts 添加如下语句即可[记得传送到所有机器上]:

192.168.1.100 client100.kongzhong.com

192.168.1.101 client101.kongzhong.com

192.168.1.102 client102.kongzhong.com

192.168.1.103 client103.kongzhong.com

192.168.1.104 client104.kongzhong.com

或者 在my.cnf 加入 skip-name-resolve 这个方法也是可行的!

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 158
博文 2219
码字总数 4583840
作品 0
广州
程序员
MMM结合Semisync机制实现Mysql Master-Master高可用

架构: 两个Master(主备模式),一个或多个Slave(也可以没有Slave,只有主备Master): 1、Monitor运行MMM Daemon程序,实现所有Mysql服务器的监控和故障切换工作; 2、Master1和Master2互为主...

AnthonyYau
2014/05/27
0
11
Microsoft Azure部署MYSQL-MMM(1)安装MYSQL

MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个...

李珣
2015/04/06
0
0
MySQL架构的优化

mysql的复制: mysql的二进制日志:记录了所有对MySQL数据库的数据增删查改和对表和数据库的修改 binlog命令行的工具进行查看 二进制日志格式:

Panda_Jerry
2017/11/12
0
0
构建高性能MYSQL集群系统总结

MYSQL高可用集群方案总结 一,常见的高可用MYSQL解决方案 高可用解决方案: 1,数据共享或同步数据,数据共享可通过SAN(Storage Area Network)来实现,数据同步可通过rsync软件或DRDB技术来...

高好亮
2017/03/01
0
0
基于MMM实现MariaDB的高可用

一、MMM 1、简介 MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器),是关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节...

nmshuishui
2014/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
3分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
37分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部