您的位置:首页 > 运维架构 > 网站架构

MySQL-MMM实现MySQL多主多从,高可用,读写分离,故障自动切换

2015-12-31 14:43 716 查看
作者:骚年有梦
联系方式:lianglian8866@163.com
一、环境简述
1、工作逻辑图



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
数据库分配:
functioniphostnameserver id
monitoring host10.1.7.123monitor
master 110.1.7.91db1master-1
master 210.1.7.115db2master-2
slave 110.1.7.120db3slave-1
slave 210.1.7.119db4slave-2
虚拟IP地址(VIP):
iprole
10.1.7.200writer
10.1.7.201reader
10.1.7.202reader
10.1.7.203reader
三、开始做同步
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 状态



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



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上






到此我们的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 【装这个报错:如下】



这里必须手动编译
/usr/bin/perl Makefile.PL --with-mysql=/Data/apps/mysql/ --mysql_config=/Data/apps/mysql/bin/mysql_config
make test && make install
启动报错:



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



参考文档:/article/4366053.html

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

========================================================================
如果你觉得该篇文章写的不错,并且在你的工作或者生活中带来了帮助,那么你愿意在生活中给予我帮助吗?如果你愿意,为我写博客添加一些动力,可以扫下面得二维码给予我少量得赞助。
(不管再小得赞助都是你对我得肯定,这会是我一直坚持下去得动力~! 谢谢!)




这是我的微信:



本文出自 “一个梦” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: