Mysql MMM架构

来源:互联网 发布:zencart 建站 编辑:程序博客网 时间:2024/06/03 17:19

1. 简介

  1. MMM(Master-Master replication manager for Mysql)是一套支持双主故障切换和双主日常管理的脚本程序。
  2. MMM是使用perl语言进行开发,主要用来管理Mysql Master-Master(双主复制)。
  3. 双主复制:虽然是双主,但业务上只能同时对一个主进行写入,另一台为备选主,平时提供部分读服务,当写入主出现故障时,则会自动切换到这个主进行写入。
  4. MMM不仅实现了,双主故障切换的功能,内部附加组件还可以实现多个slave的read负载均衡。
  5. MMM提供了手动和自动两种方式来移除一组服务器中复制延迟较高的服务器的虚拟ip。
  6. MMM同时可以实现数据备份的功能,实现两节点的数据同步。
  7. MMM无法保证数据一致性,所以它适用于数据一致性不太严的场景。
  8. 对于要求数据一致性非常高的应用,不建议采用MMM架构。

2. 网址

  1. MMM项目来自于Google:http://code.google.com/p/mysql-master-master
  2. 官方网址为:http://mysql-mmm.org

3. 具体配置

1. 主机角色和IP配置,这里注意,虚拟IP尽量要和主机IP在同一个网段,不然可能会ping不通虚拟IP

角色 IP地址 虚拟IP 主机名字 server-id 读写操作 monitoring 192.168.111.128 192.168.111.10 db2 master1 192.168.111.128 192.168.111.10 db1 1 write master2 192.168.111.129 192.168.111.20 db2 2 read slave1 192.168.111.130 192.168.111.30 db3 3 read

2.主机配置,配置/etc/hosts,在所有主机中,添加所有主机信息:

root@localhost two]# cat /etc/hosts192.168.111.128 db1192.168.111.129 db2192.168.111.130 db3[root@localhost two]# 

3. 在三台主机上安装mysql和主从复制,db1和db2互为主从,db3为db1的从

db1配置如下
[mysqld]
server-id=1
log_slave_updates=1
auto-increment-increment=2
auto-increment-offset=1
binlog-do-db=myblog
log-bin=mysql-bin

db2配置如下
[mysqld]
server-id=2
binlog-do-db=myblog
log_slave_updates=1
auto-increment-increment=2
auto-increment-offset=2
log-bin=mysql-bin

db3配置如下:
[mysqld]
server-id=3

4. 安装MMM所需要的perl模块,所有的主机都要安装,命令如下

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmyum -y install mysql-mmm*

5. 下载mysql-mmm软装,在所有主机上安装,在所有主机上执行如下命令

 wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz tar xf mysql-mmm-2.2.1.tar.gz  cd  mysql-mmm-2.2.1 make install

6. mysql-mmm安装后的主要拓扑结构如下所示(注意:yum安装的和源码安装的路径有所区别):

        目录                      |         介绍   

————————————–|——————————————————-
/usr/lib/perl5/vendor_perl/5.8.8/MMM | MMM使用的主要perl模块
/usr/lib/mysql-mmm | MMM使用的主要脚本
/usr/sbin | MMM使用的主要命令的路径
/etc/init.d/ | MMM的agent和monitor启动服务的目录
/etc/mysql-mmm | MMM配置文件的路径,默认所以的配置文件位于该目录下
/var/log/mysql-mmm | 默认的MMM保存日志的位置

到这里MMM已经安装完成,接下来就是要配置MMM了,其中mmm_common.conf和mmm_agent.conf为agent端的配置文件。
mmm_mon.conf为monitor端的配置文件。

7. 配置agent端的配置文件,要在db1,db2,db3分别配置。

在db1上配置agent配置文件如下:

[root@localhost sbin]# cd /etc/mysql-mmm[root@localhost mysql-mmm]# cat mmm_common.confactive_master_role  writer<host default>    cluster_interface       eth0    pid_path                /var/run/mmm_agentd.pid    bin_path                /usr/lib/mysql-mmm/    replication_user        repl    replication_password    123456     agent_user              mmm_agent    agent_password          mmm_agent</host><host db1>    ip                      192.168.111.128    mode                    master    peer                    db2</host><host db2>    ip                      192.168.111.129    mode                    master    peer                    db1</host><host db3>    ip                      192.168.111.130    mode                    slave</host><role writer>    hosts       db1, db2    ips         192.168.111.10    mode        exclusive</role><role reader>    hosts       db2, db3    ips         192.168.111.20, 192.168.111.30    mode        balanced</role>/**    replication_user : 用于检查复制用于,    agent_user : 为agent的用户    mode : 标明是否为主或者备选主,或者从库    mode exclusive : 主为独占模式,同一时刻只能有一个主    <role write><role write>中    hosts:表示目前的主库和备选主库的真实ip或者主机名,    ips:为对外提供的虚拟ip地址    mmm_common.conf 这个文件在db1,db2,db3中是一样的*/

8. 配置所有主机上的mmm_agent.conf文件

里面要配置就一句 this db1,如果是db2主机,就改成this db2;如果是db3主机,就该成this db3;就是如此简单。因为这个配置文件引用了mmm_common.conf配置文件。

9. 在monitoring主机也就是db1主机上配置monitor的配置文件。

[root@localhost mysql-mmm]# cd /etc/mysql-mmm[root@localhost mysql-mmm]# vi mmm_mon.confinclude mmm_common.conf<monitor>        ip              127.0.0.1        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.111.128,192.168.111.129,192.168.111.130        auto_set_online 60</monitor><host default>        monitor_user            mmm_monitor        monitor_password        mmm_monitor</host>debug 0/**    ping_ips:添加真个架构被监控的主机的ip地址,    <host default> : 中配置了用于监控的用户。*/

10. 创建监控用户,这里需要创建3个监控用户,具体描述如下:

角色 用户名 描述 权限 monitor user mmm_monitor MMM的monitor端监控所有mysql数据库的状态用户 REPLICATION CLIENT agent user agent_user 主要用于MMM客户端用于改变master的read_only状态的用户 SUPER,REPLICATION CLIENT,PROCESS replication repl 数据库复制用户 REPLICATION SLAVE

在三台服务器进行授权,因为主主复制已经实现(repl这个账号已经OK),所以这里只需要授权两个账号就行了。

mysql> grant super,replication client,process on *.* to 'mmm_agent'@'192.168.111.%' identified by 'mmm_agent';Query OK, 0 rows affected (0.05 sec)mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.111.%' identified by 'mmm_monitor';Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)/** 上面的sql在三台服务器都需要执行。 如果上面没有创建复制账号,则下面一句也要执行: GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.111.%' IDENTIFIED BY '123456'; **/

#### 11. 在所有主机上启动agent服务,并在manitor主机(这里是db2)上启动monitor程序。

[root@db1 ~]# /etc/init.d/mysql-mmm-agent startDaemon bin: '/usr/sbin/mmm_agentd'Daemon pid: '/var/run/mmm_agentd.pid'Starting MMM Agent daemon... Ok[root@db1 ~]#//启动monitor程序[root@db2 ~]# /etc/init.d/mysql-mmm-monitor startStarting MMM Monitor Daemon:                               [  OK  ][root@db2 ~]# /**    如果这里启动报错,无找不到perl,那就是没有安装perl,请自行安装perl环境。    其中mysql-mmm-agent的日志存放在/var/log/mysql-mmm/mmm_agentd.log中    monitor的日志存放在/var/log/mysql-mmm/mmm_mond.log中,启动过程中的有什么问题都会记录在日志文件中。**/错误解决:[root@db1 ~]# service mysql-mmm-monitor startDaemon bin: '/usr/sbin/mmm_mond'Daemon pid: '/var/run/mmm_mond.pid'Starting MMM Monitor daemon: Can not locate 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_mond line 11.BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line 11.failed解决方法:[root@db1 ~]# cpan Proc::Daemon[root@db1 ~]# cpan Log::Log4perl[root@db1 ~]# /etc/init.d/mysql-mmm-agent startDaemon bin: '/usr/sbin/mmm_agentd'Daemon pid: '/var/run/mmm_agentd.pid'Starting MMM Agent daemon... Can't locate MMM/Agent/Agent.pm in @INC (@INC conta                                  ins: /usr/local/lib/perl5/5.14.2/BSDPAN /usr/local/lib/perl5/site_perl/5.14.2/ma                                  ch /usr/local/lib/perl5/site_perl/5.14.2 /usr/local/lib/perl5/5.14.2/mach /usr/l                                  ocal/lib/perl5/5.14.2 .) at /usr/sbin/mmm_agentd line 21.BEGIN failed--compilation aborted at /usr/sbin/mmm_agentd line 21.解决方法:[root@db1 ~]# cp -R ./mysql-mmm-2.2.1/lib/* /usr/local/lib/perl5/5.16.1/MMM/如果缺少库,则安装相关库:[root@db1 ~]# cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP

11. 在monitor主机上查看集群状态。

[root@db2 ~]# mmm_control checks alldb2  ping         [last change: 2017/03/29 23:22:16]  OKdb2  mysql        [last change: 2017/03/29 23:22:16]  OKdb2  rep_threads  [last change: 2017/03/29 23:28:31]  OKdb2  rep_backlog  [last change: 2017/03/29 23:22:16]  OK: Backlog is nulldb3  ping         [last change: 2017/03/29 23:22:16]  OKdb3  mysql        [last change: 2017/03/29 23:22:16]  OKdb3  rep_threads  [last change: 2017/03/29 23:22:16]  OKdb3  rep_backlog  [last change: 2017/03/29 23:22:16]  OK: Backlog is nulldb1  ping         [last change: 2017/03/29 23:22:16]  OKdb1  mysql        [last change: 2017/03/29 23:22:16]  OKdb1  rep_threads  [last change: 2017/03/29 23:28:52]  OKdb1  rep_backlog  [last change: 2017/03/29 23:22:16]  OK: Backlog is null

12. 在monitor主机上查看集群在线状态

[root@db2 ~]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.10)  db2(192.168.111.129) master/ONLINE. Roles: writer(192.168.111.20)  db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.30)故障分析:# Warning: agent on host db3 is not reachable这是防火墙的原因,关闭主机防火墙就行了service iptables stop

13. 上线所有主机,master/ONLINE,slave/ONLINE代表已上线,如果未上线,可以使用如下命令上线主机:

[root@db2 ~]# mmm_control set_online db1OK: This host is already ONLINE. Skipping command. // 提示一上线,跳过命令执行。

到这里整个集群就已经配置完成了,从输出可以看出
db1的真实IP为192.168.111.128,对外通过虚拟IP(192.168.0.10)提供读服务,其他的同样
同时,db1和db2互为主从,db3位从服务器

14. MMM高可用测试

1.首先查看集群状态

[root@db2 ~]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.10)  db2(192.168.111.129) master/ONLINE. Roles: writer(192.168.111.20)  db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.30)// 一切正常
  1. 手动停止db2的mysql服务
[root@db2 ~]# service mysqld stop;Stopping mysqld:                                           [  OK  ]
  1. 再来查看集群状态
// 由此可见MMM不能时时监控,会出现延迟[root@db2 ~]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.10)  db2(192.168.111.129) master/ONLINE. Roles: writer(192.168.111.20)  db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.30)// 由此可见,当db2宕机后,MMM会把虚拟写IP(192.168.111.20)绑定到db1上。[root@db2 ~]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.30), writer(192.168.111.20)  db2(192.168.111.129) master/HARD_OFFLINE. Roles:   db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.10)
  1. 启动db2的mysql服务
[root@db2 ~]# service mysqld startStarting mysqld:                                           [  OK  ]
  1. 再来查看集群状态
// mysql服务启动后db2在AWAITING_RECOVERY(等待恢复)的时间有点长,差不多有半分钟到一分钟。[root@db2 ~]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.30), writer(192.168.111.20)  db2(192.168.111.129) master/AWAITING_RECOVERY. Roles:   db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.10)// 当db2状态为online后,并不会自动回复写服务。而是出于闲置状态,当然由于db2和db1互为主从,// 所以还是能同步db1,在它宕机期间修改的数据的。[root@db2 ~]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.30), writer(192.168.111.20)  db2(192.168.111.129) master/ONLINE. Roles:   db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.10)// 如果一台主机mysql服务刚启动,状态还是AWAITING_RECOVERY(等待恢复)的时候,另一台主机宕机了。就会出现下面这种情况// 两台主服务器都不能写入,db1是等待恢复,db2则是离线状态,原因是在db1的状态还没有恢复的online的时候,db2// 宕机了,这是db1就会报一个错误, Last_IO_Error: error reconnecting to master 'repl@192.168.111.129:3306' - retry-time: 60  retries: 86400,意思是从服务连接不到主机。// 这个时候的集群就处于只能读不能写的状态。// db2的mysql服务启动后,db1的错误就会自动消息。但是db1和db2想要恢复的online状态还需要一点时间。[root@db2 ~]# mmm_control show;  db1(192.168.111.128) master/AWAITING_RECOVERY. Roles:   db2(192.168.111.129) master/HARD_OFFLINE. Roles:   db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.10), reader(192.168.111.30)// db1,db2恢复到online状态后,MMM会自动把写服务绑定给最先恢复的主机。[root@db2 ~]# mmm_control show;  db1(192.168.111.128) master/AWAITING_RECOVERY. Roles:   db2(192.168.111.129) master/ONLINE. Roles: writer(192.168.111.20)  db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.10), reader(192.168.111.30)// 这种情况是,可以使用192.168.111.10访问db1的数据库,但是不能使用192.168.111.20访问// 不晓得是不是绑定两个ip时,会有冲突// 这种情况的话,就起不到一个住数据库宕机,另一台主接替写的角色了// 虽然MMM把192.168.111.20这个IP绑定到db1上了,但是不能连接,所以也就没什么用了。[root@localhost one]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.10), writer(192.168.111.20)  db2(192.168.111.131) master/ONLINE. Roles:   db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.30)
  1. 使用mmm_control手动设置主机角色
// 将写角色设置给主机db1[root@localhost html]# mmm_control move_role writer db2OK: Role 'writer' has been moved from 'db2' to 'db1'. Now you can wait some time and check new roles info![root@localhost html]# mmm_control show  db1(192.168.111.128) master/ONLINE. Roles: reader(192.168.111.30)   db2(192.168.111.131) master/ONLINE. Roles: writer(192.168.111.20)  db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.

15. 连接服务器集群

程序里链接mysql服务器集群用的是虚拟ip,所以虚拟IP必须能ping通,ping不同代表就有问题。

如果ip ping不同有可能是没有安装ARP

// 安装arpcpan install Net::ARP

16. 奇怪现象

// 当db1,db2中的mysql都关闭时,还可以通过mysql -h192.168.111.20打开数据库,并新增数据。// 而且db1,db2,db3的主从同步不受影响。// 现在192.168.111.20这个ip在db3上,明明只有读服务,但是事实证明也可以写数据。// 而且丛库上的数据,还能同步的另外两台主库上[root@localhost one]# mmm_control show  db1(192.168.111.128) master/HARD_OFFLINE. Roles:   db2(192.168.111.131) master/HARD_OFFLINE. Roles:   db3(192.168.111.130) slave/ONLINE. Roles: reader(192.168.111.10), reader(192.168.111.20)

17. 总结

MMM服务器宕机后等待恢复的时间太长,而且有时候恢复不过来,所以对于要求数据一致性比较严格的业务不建议使用,
MMM高可用还是可以实现的,虽然恢复时间长,但是当恢复后,宕机时修改的数据,还是会自动跟新的。

0 0
原创粉丝点击