MMM 之 MySQL
MMM 简介
MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM 用 Perl 语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全的保证数据一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度的保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,非常不建议采用MMM这种高可用架构。
MMM 访问流程图
具体的配置信息如下所示:
角色 | ip地址 | 主机名字 | server-id |
monitoring | 10.10.198.84 | Db2 | 2 |
master1 | 10.10.149.199 | Db1 | 1 |
master2 | 10.10.198.84 | Db2 | 2 |
slave1 | 10.10.199.57 | Db3 | 3 |
业务中的服务ip信息如下所示:
ip地址 | 角色 | 描述 |
W:192.168.0.180 R: 192.168.0.181 | Write/Read | 应用程序连接该ip对主库进行写请求 |
192.168.0.88 | read | 应用程序连接该ip进行读请求 |
192.168.0.98 | read | 应用程序连接该ip进行读请求 |
第一个能写也能读
具体的配置步骤如下:
主机配置
配置/etc/hosts,在所有主机中,添加所有的主机信息:
db1:
127.0.0.1 db1
10.10.149.199 db1
10.10.198.84 db2
10.10.199.57 db3
db2:
127.0.0.1 db2
10.10.149.199 db1
10.10.198.84 db2
10.10.199.57 db3
db3:
127.0.0.1 db3
10.10.149.199 db1
10.10.198.84 db2
10.10.199.57 db3
首先在3台主机上安装mysql和搭建复制(10.10.149.199和10.10.198.84互为主从,10.10.199.57为10.10.149.199的从)具体的复制搭建这里就省略,要是这都不会,那么该文章对你就没意思了。然后在每个mysql的配置文件中加入以下内容,注意server_id 不能重复。
安装本地自带的依赖包
yum -y install postgresql-plperl.x86_64 perltidy.noarch perl-suidperl.x86_64 perl-parent.x86_64 perl-libxml-perl.noarch perl-libs.i686 perl-libintl.x86_64 perl-hivex.x86_64 perl-devel.i686 perl-core.x86_64 perl-YAML-Tiny.noarch perl-XML-XPath.noarch perl-XML-Writer.noarch perl-XML-Twig.noarch perl-XML-NamespaceSupport.noarch perl-Params-Validate rrdtool perl-Class-Singleton perl-Tie-DBI
yum install -y rrdtool-perl.x86_64 perl-DBD-MySQL
wget http://download.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
安装其他依赖包(注意必须有序安装)
(这些在文件中有)
[root@localhost mysql-mmm]# rpm -ivh 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-ProcessTable-0.44-4.el6.x86_64.rpm perl-Proc-Daemon-0.06-1.el6.noarch.rpm
warning: perl-Algorithm-Diff-1.1902-9.el6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
warning: perl-IPC-Shareable-0.60-2.el6.rf.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY
warning: perl-Net-ARP-1.0.6-2.1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing... ########################################### [100%]
1:perl-Proc-ProcessTable ########################################### [ 13%]
2:perl-Proc-Daemon ########################################### [ 25%]
3:rrdtool-perl ########################################### [ 38%]
4:perl-Net-ARP ########################################### [ 50%]
5:perl-Log-Log4perl ########################################### [ 63%]
6:perl-Log-Dispatch ########################################### [ 75%]
7:perl-IPC-Shareable ########################################### [ 88%]
8:perl-Algorithm-Diff ########################################### [100%]
解压安装
[root@localhost mysql-mmm]#cd /root/mmm/
[root@localhost mysql-mmm]# tar -xf mysql-mmm-2.2.1.tar.gz
[root@localhost mysql-mmm]# cd mysql-mmm-2.2.1
[root@localhost mysql-mmm-2.2.1]# make && make install
到这里已经完成了MMM的基本需求
配置文件设置
(配置文件存放地址: /etc/mysql-mmm )
接下来需要配置具体的配置文件,其中mmm_common.conf,mmm_agent.conf为agent端的配置文件,mmm_mon.conf为monitor端的配置文件。
配置agent端的配置文件,需要在db1,db2,db3上分别配置。
在db1主机上配置agent配置文件:
[root@db1 mysql-mmm]# cat 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 repl
replication_password repl
agent_user mmm_agent
agent_password agent_password
</host>
<host db1>
ip 10.10.149.199
mode master
peer db2
</host>
<host db2>
ip 10.10.198.84
mode master
peer db1
</host>
<host db3>
ip 10.10.199.57
mode slave
</host>
<role writer>
hosts db1, db2
ips 10.10.149.180
mode exclusive
</role>
<role reader>
hosts db1,db2, db3
ips 192.168.0.181,192.168.0.88, 192.168.0.98
mode balanced
</role>
复制到db2 db3
scp ./mmm_common.conf root@10.10.199.57:/etc/mysql-mmm/
scp ./mmm_common.conf root@10.10.198.84:/etc/mysql-mmm/
前提先设置秘钥:
设置mmm_agent.conf
db1:
db2:
db3:
agent 、common 配置完毕
monitor可以配置在任何机器上面
monitor in db2
[root@db2 mysql-mmm]# cat mmm_mon.conf
include 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 10.10.149.199, 10.10.198.84, 10.10.199.57
auto_set_online 10
</monitor>
<host default>
monitor_user mmm_monitor
monitor_password monitor_password
</host>
这里记得两个参数
一个是monitor 密码,二个是auto_set_online 10 10自动设置为online
设置同步权限
(db1,db2)
GRANT file,REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123456';
这里上下的%请设置具体IP
设置数据库访问权限:
(db1,db2,db3)三台机器都设置 (或者先配置好同步环境自动同步即可)
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'%' IDENTIFIED BY 'agent_password';
flush privileges;
启动mmm agent
db1:
db2:
db3:
开启mmm monitor:
查看mmm node status
手动上线node
如果mmm_common.conf 中设置了auto_set_online 10 就不需要
mmm_control set_online db1
mmm_control set_online db2
mmm_control set_online db3
查看every node virtual ip
db1:
[root@db2 mysql-mmm]#ip a
db2:
db3:
查看every node status
[root@db2 mysql-mmm]#mmm_control checks all
切换演示
如上图所知: db1 位db3的 master
模拟故障 :关闭 db1 看下 db3的 slave 是否自动切换到db2 writer的虚拟ip是否切换到
db2
停止db1 mysql服务 ,可以看到上图。vip已经切换
DB3 顺利切换到,db2为他的主库环境查看monitor切换log
总结
在生产环境中MMM的HA这块的还是很可观,基本达到无缝切换,保证Master不间断的提供服务,还能利用READ-VIP做读写分离,到达读写负载分担,而且后期也可以在MMM的基础上面扩展,如:master 垂直拆分多库 到 级联(利用多库多线程),在后面结合水平拆分,来实现在DB架构重构过程中,做个缓冲的DB架构,到最后实现彻底的分布式,分布式的内容后期献上。