1.1 方案简介MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,更可贵的是如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。这个方案是目前比较成熟的解决方案。
1.2 方案优缺点
优点:安全性、稳定性高,可扩展性好,高可用,当主服务器挂掉以后,另一个主立即接管,其他的从服务器能自动切换,不用人工干预。
缺点:至少三个节点,对主机的数量有要求,需要实现读写分离,对程序来说是个挑战。
1.3 方案架构图
1.4 适用场景
MMM的适用场景为数据库访问量大,业务增长快,并且能实现读写分离的场景。
1.5 实例说明
特别说明:搭建的群集实IP和虚IP最好在同一个网段,笔者在做实例的时候4台机器在两个IP段,结果做好后出现无法访问的情况
实IP
192.168.129.47 (Master1)
192.168.129.49 (Master2)
192.168.140.137(Slave1)
192.168.140.136 (Monitor)
虚IP
192.168.129.51 (Write)
192.168.129.52 (Read)
192.168.140.139 (Read)
笔者做的是MYSQL 5.5.17版本的MMM
首先安装好MYSQL,并且搭建好 主主从复制 (关于复制的搭建这边就不做详细的说明了,网上面很多)
192.168.129.47和192.168.129.49是主主复制
192.168.129.47和192.168.140.137是主从复制
1.6 MMM账号准备
在各个服务器上面添加MYSQL账号
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'%' IDENTIFIED BY '123456';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%' IDENTIFIED BY '123456';
flush privileges;
1.7 MMM安装
在安装mmm之前要安装epel包,因为Centos的默认源中没有mmm的安装包,Epel是企业版Linux附加软件包(Extra Packages for Enterprise Linux)的缩写,是一个由特别兴趣小组创建、维护并管理的,针对红帽企业版Linux(RHEL)及其衍生发行版(比如CentOS、Scientific Linux)的一个高质量附加软件包项目
安装epel:
wget ftp://ftp.sunet.se/pub/Linux/distributions/yellowdog/yum/6.2/extras/RPMS/epel-release-5-3.noarch.rpm
rpm -Uvh epel-release-5-3.noarch.rpm
安装monitor的安装:
yum -y install mysql-mmm*
各个DB上只需要安装mysql-mmm-agent
yum -y install mysql-mmm-agent
1.8配置MMM
完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:
vi /etc/mysql-mmm/mmm_common.conf
内容如下编辑
active_master_role writer
cluster_interface eth0
pid_path /var/run/mysql-mmm/mmm_agentd.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication #前面添加的MSYQL账号和密码
replication_password 123456 #前面添加的MSYQL账号和密码
agent_user mmm_agent #前面添加的MSYQL账号和密码
agent_password 123456 #前面添加的MSYQL账号和密码
ip 192.168.129.47 #主机1
mode master
peer db2
ip 192.168.129.49 #主机2
mode master
peer db1
ip 192.168.140.137 #从机1
mode slave
hosts db1, db2
ips 192.168.129.51 #写IP(虚拟)对应的主机1和主机2
mode exclusive
hosts db1, db2, db3
ips 192.168.140.139,192.168.129.52 #读IP虚拟)对应的主机1和主机2和从机1
mode balanced
可以在db1上编辑该文件后,通过scp命令分别复制到monitor、db2和db3上。
1.9 编辑mmm_agent.conf
在数据库服务器上(192.168.129.47),还有一个mmm_agent.conf需要修改,其内容是:
# The 'this' variable refers to this server. Proper operation requires
# that 'this' server (db1 by default), as well as all other servers, have the
# proper IP addresses set in mmm_common.conf.
this db1
应对的 192.168.129.49 则为this db2
应对的 192.168.129.49 则为this db3
否则代理就会无法启动。
2.0编辑mmm_mon.confg。
在管理服务器上(192.168.140.136),修改mmm_mon.conf文件,修改后内容为:
vi /etc/mysql-mmm/mmm_mon.conf
内容如下
include mmm_common.conf
ip 192.168.140.136
pid_path /var/run/mysql-mmm/mmm_mond.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.129.47,192.168.129.49,192.168.140.137
auto_set_online 60
# The kill_host_bin does not exist by default, though the monitor will
# throw a warning about it missing. See the section 5.10 "Kill Host
# Functionality" in the PDF documentation.
#
# kill_host_bin /usr/libexec/mysql-mmm/monitor/kill_host
#
monitor_user mmm_monitor
monitor_password 123456
debug 0
2.1 启动MMM
在数据库服务器上启动代理程序(192.169.129.47 192.168.129.49 192.169.140.137)
cd /etc/init.d/
chkconfig mysql-mmm-agent on
service mysql-mmm-agent start
在管理服务器上启动监控程序(192.168.140.136)
cd /etc/init.d/
chkconfig mysql-mmm-monitor on
service mysql-mmm-monitor start
启动后,稍等几秒,可以通过mmm_control程序查看状态:
2.2遇到两个问题
1)监控程序服务器无法启动
在管理服务器上,一切都完成后,通过mmm_control查看状态,得到下面的错误信息:ERROR: Can't connect to monitor daemon! 通过编辑/etc/mysql-mmm/mmm_mon.conf文件将debug 0改为debug 1,打开监控程序的debug状态。重新启动监控程序(service mysql-mmm-monitor restart),就会看到详细的错误信息,找不到Perl Time HiRes库。执行yum -y install perl-Time-HiRes*就可以解决。
2)防火墙问题导致Warning: agent on host db1 is not reachable.
控制台序正确启动后,再次执行mmm_control show,却看到下面的输出:
关闭db2、db3上的防火墙,再次重启监控程序,一切回到正常状态!