一 简介
在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求。此时数据库集群就很好的解决了这个问题了。采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器(这篇博客暂时不涉及)。在此之前我们必须要保证每台MySQL服务器里的数据同步。数据同步我们可以通过MySQL内部配置就可以轻松完成,主要有主从复制和主主复制。显然,主主复制、多主多从结构更难增强系统的稳定性及安全性。主从复制请参考我前面的博文。
二 实验环境
mysql5.6.16+centos6.5 32位
三 拓扑图
如图所示,master11和master10做为主节点,它们又互为主从
它们底下又可以接多个从节点,这里就以接一个从节点为例,并假定最开始数据库schooldb在master11上,其它节点均无数据
四 操作步骤
在master11 机器上
# vi /usr/my.cnf
# log_bin
log-bin=master11_log
binlog-do-db=schooldb
log-slave-updates=1
#作为从服务器时的中继日志
relay_log=school-relay-bin
#事务特性,最好设为1
sync_binlog=1
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
server_id = 11
# socket = .....
在双主模式中,log-slave-updates 配置项一定要配置,否则在master10上进行了更新数据,在master11和slave13上会更新,但是在slave12上不会更新
sync_binlog表示每几次事务提交,MySQL把binlog缓存刷进日志文件中,默认是0,最安全的是设置为1;
重启 mysql
#service mysql restart
登录mysql
#mysql -uroot -p
创建一个用于slave和master通信的用户账号
mysql> GRANT replication slave ON *.* TO 'wx123'@'%' IDENTIFIED BY '123456';
刷新权限以避免出现拒绝访问的情况
mysql> flush privileges;
在master10机器上操作
# vi /usr/my.cnf
# log_bin
log-bin=master10_log
binlog-do-db=schooldb
log-slave-updates=1
#作为从服务器时的中继日志
relay_log=school-relay-bin
#事务特性,最好设为1
sync_binlog=1
# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
server_id = 10
# socket = .....
重启 mysql
#service mysql restart
登录mysql
#mysql -uroot -p
创建一个用于slave和master通信的用户账号
mysql> GRANT replication slave ON *.* TO 'wx123'@'%' IDENTIFIED BY 'test123';
刷新权限以避免出现拒绝访问的情况
mysql> flush privileges;
重启 mysql
#service mysql restart
这时候要锁住master11的表,防止写操作
执行命令
mysql> lock tables;
接下来,导出master11 schooldb数据库中的数据,恢复到master10和slave12数据库中数据量小的话用上图所示方法最快!当然用其它备份恢复方法都行。
分别在master11 和master10上执行show master status命令,如图,记下File和Position参数
登录master10 执行如下命令,如图
同理,在slave12 上也执行上面的命令
然后,在master 11上执行命令,如下图:
这样子,master11和master10就互为主从,即为主主模式!
然后在mstar11上解锁表
mysql> unlock tables;
五 验证
在master10上把用户表的名称ggg改为ggg10,结果发现master11和slave12上的数据都自动更改过来了
同理,在master11上把名称改为ggg11,master10和slave12也会自动改过来,至此,主主模式配置完成!
六 假定master10宕机,如何重新恢复并接上
在master11上停止slave, 并保证没有新的数据进来,可以采取锁库锁表的方式
mysql> stop slave;
然后对master10进行修复恢复,恢复完毕后执行命令
mysql> stop slave;
并将master11上的数据备份恢复到master10以保证数据一致性。
然后参考上面的步骤,用change命令互相设为主从即可
然后对master11解锁