作者:骚年有梦

联系方式:lianglian8866@163.com

一、环境简述

1、工作逻辑图

22542025026.jpg

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 id

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

[mysqld]

#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.%' identified by 'tongbu';

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 状态

clipboard

db2:

修改mysql配置文件

cp /etc/my.cnf /etc/my.cnf.bak

vim /etc/my.cnf

[mysqld]

#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.%' identified by 'tongbu';

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 状态

clipboard[1]

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主机访问  
[root@db ~]# mysql -u root    
mysql> GRANT REPLICATIONCLIENT ON *.* TO 'mmm-monitor'@'10.1.7.%' IDENTIFIED BY 'mmm-monitor';     (创建monitor用户,给同步读的权限让monitor机器来监控获取当前同步情况)    
mysql> GRANT SUPER,REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.1.7.%' IDENTIFIED BY'mmm-agent'; (授权更高,用来到时master出问题了,有权限修改新的master来重新同步,完成master得切换)

mysql> flush privileges;

三、配置MySQL-MMM

1、配置mmm_common.conf (整体框架配置文件)

active_master_role                              writer

<host default>

        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

</host>

<host master-1> (定义主机名称)

        ip                                          10.1.7.91  (主机真实IP)

        mode                                    master    (定义主机角色)

        peer                                       master-2  (指定同等角色)

</host>

<host master-2>

        ip                                          10.1.7.115

        mode                                    master

        peer                                      master-1

</host>

<host slave-1>

        ip                                      10.1.7.120

        mode                                    slave

</host>

<host slave-2>

        ip                                      10.1.7.1193

        mode                                    slave

</host>

<role writer>

        hosts                                   master-1,master-2        (可以写角色主机)

        ips                                      10.1.7.200                            (用来写的虚IP)

        mode                                   exclusive                            (模式独一的)

        prefer                                  master-1                                 (优先哪一台)

</role>

<role reader>

        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                                        (模式是负载均衡)

</role>

2、配置mmm_mon.conf  (monitor端配置文件)

include mmm_common.conf (调用整体框架)

<monitor>

        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>

<host default>

        monitor_user                                mmm-monitor    (agent授权monitor主机的用户)

        monitor_password                        mmm-monitor

</host>

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服务】

在监控端可以查看并验证各角***况

[root@lianglian5-dev init.d]# mmm_control help    
Valid commands are:    
    help                              - show this message    
    ping                              - ping monitor    
    show                              - show status    
    checks [<host>|all [<check>|all]] - show checks status    
    set_online <host>                 - set host <host> online    
    set_offline <host>                - set host <host> offline    
    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] <role> <host> - move exclusive role <role> to host <host>    
                                        (Only use --force if you know what you are doing!)    
    set_ip <ip> <host>                - set role with ip <ip> to host <host>

你可以使用各种mmm_control命令配合参数来操作处理框架中的主机和问题。具体用法见官网:http://mysql-mmm.org/mysql-mmm.html

故障演练:当master-1down了 将虚IP自动飘到了master-2上

clipboard[2]

clipboard[3]

到此我们的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信息,用在和其他机器重新做同步的时候。

故障记录:

wget  http://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 【装这个报错:如下】

clipboard[4]

这里必须手动编译

/usr/bin/perl Makefile.PL --with-mysql=/Data/apps/mysql/ --mysql_config=/Data/apps/mysql/bin/mysql_config 

make test && make install

启动报错:

clipboard[5]

解决方法:

如上提示:

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

clipboard[6]

参考文档:http://linuxguest.blog.51cto.com/195664/578307

 

软件参考文档也可以访问我的有道云笔记下载:http://note.youdao.com/share/?id=8d4d25a0280aeeab9be96d36bd868651&type=note  (最下面)

 

 

========================================================================

如果你觉得该篇文章写的不错,并且在你的工作或者生活中带来了帮助,那么你愿意在生活中给予我帮助吗?如果你愿意,为我写博客添加一些动力,可以扫下面得二维码给予我少量得赞助。

(不管再小得赞助都是你对我得肯定,这会是我一直坚持下去得动力~! 谢谢!)

向我付款

这是我的微信:

我的微信