MySQL实现双主多从架构lunique.docx
《MySQL实现双主多从架构lunique.docx》由会员分享,可在线阅读,更多相关《MySQL实现双主多从架构lunique.docx(14页珍藏版)》请在冰豆网上搜索。
MySQL实现双主多从架构lunique
MySQL实现双主多从架构
1.实现目标
目标清单:
1)Master(192.168.31.230)为正常运行环境下的主库,为两个Slave(192.168.31.231和192.168.31.232)提供“主-从”复制功能;
2) Master_Backup(192.168.31.233)是Master的备份库,只要Master是正常的,它不对外提供服务。
它与Master之间属于"主-主"复制关系,即自己既是主机,又是对方的从机;
3)同理,192.168.31.234和192.168.31.235为Slave_Backup,分别为192.168.31.231和192.168.31.232的备份库,只要Slave是正常的,对应的备份机不对外提供服务;
4)Slave在此架构中的目的是为了实现读写分离,对应用程序来说,Master只负责写,两个Slave只负责读。
Slave的数据来源于Master的复制操作;
5)如果Master由于某种原因(例如:
宕机和断电等)导致不能正常运行,则此时需要让Master_Backup自动切换为新主机,而Slave和Slave_Backup也能自动切换数据源到Master_Backup;
6)同理,如果Slave由于某种原因(例如:
宕机和断电等)导致不能正常运行,则此时需要让对应的Slave_Backup自动切换为新从机;
7)无论是Master还是切换后的Master_Backup,它们向客户端提供的连接地址应保持一致,如上图提供的VIP+Port,即192.168.31.201:
3306,Slave和Slave_Backup也应如此,对外提供的连接地址始终是192.168.31.202:
3306和192.168.31.203:
3306。
2.实现过程
MySQL安装步骤不在此讲述。
1.
2.
2.1.实现Master-Master结构
2.1.1.修改Master和Master_Backup配置文件,vi/etc/f
主要在[mysqld]内添加如下配置项:
Sql配置代码:
# log文件名,必填
log-bin = mysql-bin
# 服务器Id,必须唯一
server-id = 230
# 不参与同步的数据库名,有多个则添加多个配置项
binlog-ignore-db = mysql
# Master-Master结构必须的
log-slave-updates
slave-skip-errors = all
sync_binlog = 1
read_only = 0
2.1.2.为复制请求方提供链接账号和密码
由于是Master-Master结构,因此需在双方终端中执行如下SQL命令:
Sql代码:
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by 'slave123';
可在mysql实例的user表中查询到记录,重点关注Repl_slave_priv字段的值是否为Y,此账号(用户名:
slave,密码:
slave123)主要用于定位复制点
2.1.3.在从机上指定Master数据源
1)在Master上执行
Sql代码:
SHOW MASTER STATUS;
得到的结果如下:
重点关注File和Position两个字段值
2)在Master_Backup也执行上述步骤,由于是初始状态,得到的结果和上图一样;
3)在Master上执行如下SQL命令,填入Master_Backup的host、链接账号和密码、File和Position值
Sql代码:
mysql>STOPSLAVE;
mysql>CHANGE MASTER TO MASTER_HOST='192.168.31.233',MASTER_USER='slave',MASTER_PASSWORD='slave123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
mysql>STARTSLAVE;
4)在Master_Backup上执行如下SQL命令,填入Master的host、链接账号和密码、File和Position值
Sql代码:
mysql>STOPSLAVE;
mysql>CHANGE MASTER TO MASTER_HOST='192.168.31.230',MASTER_USER='slave',MASTER_PASSWORD='slave123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
mysql>STARTSLAVE;
5)重启Master和Master_Backup
2.1.4.测试
1)当Master和Master_Backup都正常运行时,在任意一端更新数据后都会同步到另一段;
2)当Master处于不可运行时,在Master_Backup更新数据后重启Master,这时在Master上可得到最新的数据;
3)当Master_Backup处于不可运行时,在Maste更新数据后重启Master_Backup,这时在Master_Backup上可得到最新的数据。
2.2.实现Master-Slave结构
2.2.1.实施过程
将2.1.1和2.1.3的过程在所有Slave上操作一遍即可,需要注意配置文件中server-id一定要唯一,还有在执行CHANGEMASTERTO命令时,MASTER_HOST为192.168.31.230
Sql代码:
mysql>STOPSLAVE;
mysql>CHANGE MASTER TO MASTER_HOST='192.168.31.230',MASTER_USER='slave',MASTER_PASSWORD='slave123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
mysql>STARTSLAVE;
2.2.2. 测试
1)当Master和Master_Backup都正常运行时,在任意一端更新数据后都会同步到两个Slave上;
2)当Master处于正常运行时,在此端更新数据后都会同步到两个Slave上,而无论Master_Backup是否正常;
3)当Master处于不可运行时,Master_Backup通过Monitor(Keepalived)成为接管者,在Master_Backup更新数据后都会同步到所有Slave上,并且重启Master后,最新数据也会同步到此端。
可事与愿违,在第3)种场景下,Master_Backup不会将数据同步给Slave,即使后来在Slave上将MASTER_HOST指定为Keepalived提供的VIP(192.168.31.201)也无济于事:
Sql代码:
mysql>STOPSLAVE;
mysql>CHANGE MASTER TO MASTER_HOST='192.168.31.201',MASTER_USER='slave',MASTER_PASSWORD='slave123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
mysql>STARTSLAVE;
在Slave上执行SHOWSLAVESTATUS;
得出如下结果:
究其原因,如上图所示,Master_Server_Id为230,仍然指向的是已经处于不可运行的Master,而预期结果是希望它能自动的更新定位到Master_Backup(233)上,达到自动切换的目的。
没办法,只有自己执行CHANGEMASTERTO...手动定位了。
我草...,一不注意就会定位错误,造成数据丢失的问题,而且也不满足快速响应容灾切换的目的。
3.最终方案
最终方案将选择mysql-mmm结合半同步机制来实现容灾自动切换。
3.
3.1.在master(230和233)上安装semisyncmaster并设置
Sql代码:
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
vi/ect/f后加入如下配置:
配置代码:
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1
3.2.在slave(231、232、234和235)上安装slave插件并设置
Sql代码:
mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
vi/ect/f后加入如下配置:
配置代码:
rpl_semi_sync_slave_enabled = 1
3.3.所有mysql实例停止slave并开启slave,使半同步机制生效
Sql代码:
mysql>stop slave;
mysql>start slave;
3.4.查看semisync状态
Sql代码:
mysql>show status like '%emi%';
重点关注:
1)Rpl_semi_sync_master_clients:
与当前master建立半同步连接的客户端数;
2)Rpl_semi_sync_master_status:
作为半同步master端的就绪状态(ON:
就绪,OFF:
未就绪)
3)Rpl_semi_sync_slave_status:
作为半同步slave端的就绪状态(ON:
就绪,OFF:
未就绪)
3.5.安装mysql-mmm
1.
2.
3.
3.1.
3.2.
3.3.
3.4.
3.5.
3.5.1.新增一台专门用于监控mysql的服务器(mysql_monitor),IP为192.168.31.250
3.5.2.在mysql_monitor、master、master_backup、slave和slave_backup上安装epel网络源
Linux命令行代码:
yum install
3.5.3.在mysql_monitor上安装mysql-mmm-monitor
Linux命令行代码:
yum -y install mysql-mmm-monitor
3.5.4.在master、master_backup、sl