环境:

主机名主机IP操作系统MySQL版本
mysqlA172.16.4.235

CentOS 6.5
2.6.32-431.el6.x86_64

mysql-community-server-5.7.5-0.6.m15.el6.x86_64
mysqlB172.16.4.236

CentOS 6.5
2.6.32-431.el6.x86_64

mysql-community-server-5.7.5-0.6.m15.el6.x86_64


架构:

1、mysqlA和mysqlB互为主备,即双主架构Master-Master。

2、使用semisync半同步机制,保证双主数据一致。

3、只有一个Master承担写操作,另一个备用,可承担读操作,配合应用实现读写分离。

4、双主加上Keepavlied可搭建高可用MySQL集群,实现单点故障切换。(本文不涉及)


一、准备工作

1)安装最新版MySQL5.7

使用YUM安装最新版MySQL5.7:http://qicheng0211.blog.51cto.com/3958621/1593592

MySQL5.7改善了半同步复制,降低了主从数据不一致的风险。


2)修改MySQL配置文件

启动MySQL之前先修改/etc/my.cnf,增加下面的配置。

mysqlA的配置文件:

server-id = 1
log-bin=mysql-bin    # 打开二进制日志功能,作为主库时必须设置
log-slave-updates    # 做为从库时,数据库的修改也会写到bin-log里
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
expire_logs_days=5   # 表示自动删除5天以前的binlog,可选

mysqlB的配置文件:

server-id = 2
log-bin=mysql-bin
log-slave-updates
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
replicate-wild-ignore-table = mysql.%
replicate-wild-ignore-table = information_schema.%
replicate-wild-ignore-table = performance_schema.%
expire_logs_days=5


3)在mysqlA和mysqlB上创建专门用于Replication的账户

> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.4.%' IDENTIFIED BY 'MNVq_YOg9';
> FLUSH PRIVILEGES;


二、Master-Master配置

mysqlA和mysqlB都是刚安装好的、干净的数据库,可根据下面的步骤搭建Master-Master。

1)配置mysqlA为主库
在mysqlA上配置:

> reset master;(清空master的binlog,平时慎用,可选)
> flush tables with read lock;
> show master status;

wKiom1Sc43njuPCVAAHylRosxp0182.jpg


2)配置mysqlB为mysqlA的从库
在mysqlB上配置:

> stop slave;
> CHANGE MASTER TO MASTER_HOST='172.16.4.235', MASTER_USER='repl_user', MASTER_PASSWORD='MNVq_YOg9', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120;
> start slave;
> show slave status\G

wKiom1Sc0ObCCwvfAAVTEAvBZNE531.jpg查看Slave_IO_Running和Slave_SQL_Running的状态,如果都为Yes,从库配置成功。

3)将mysqlB设为主

在mysqlB上设置:

> reset master;(清空master的binlog,平时慎用,可选)
> flush tables with read lock;
> show master status;

wKiom1Sc43njuPCVAAHylRosxp0182.jpg


4)将mysqlA设为mysqlB的从

在mysqlA上配置:

> unlock tables;
> stop slave;
> CHANGE MASTER TO MASTER_HOST='172.16.4.236', MASTER_USER='repl_user', MASTER_PASSWORD='MNVq_YOg9', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120;
> start slave;
> show slave status\G

wKiom1Sc01awreiPAAUuWZrW9qU421.jpg

最后在mysqlB上:

> unlock tables;

至此双主已经配置完成,下面配置半同步。


三、Semisync半同步配置

1)加载semisync_master和semisync_slave插件

mysqlA和mysqlB上执行:

> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
> show variables like '%semi%';

wKioL1Sc2LWz_GURAANaexTXimc467.jpg

rpl_semi_sync_master_timeout=10000

表示主库在某次事务中,如果等待时间超过10秒,则降级为普通模式,不再等待备库。如果主库再次探测到备库恢复了,则会自动再次回到semisync模式。
rpl_semi_sync_master_wait_point=AFTER_SYNC

这个参数是MySQL5.7新增的,AFTER_SYNC工作流程:
1、客户端提交一个事务,master将事务写入binlog并刷新到磁盘,发送到slave,master等待slave反馈。
2、slave接收master的binlog,写到本地的relaylog里。发送确认信息给master。
3、当接收到slave反馈,master提交事务并返回结果给客户端。这样就保证了主从数据一致。


2)开启semisync master和slave

mysqlA和mysqlB上执行:

> SET GLOBAL rpl_semi_sync_master_enabled = 1;
> SET GLOBAL rpl_semi_sync_slave_enabled = 1;

并修改my.cnf,添加下面两行:

rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled = 1

wKioL1Sc20-gmDOuAARxtqR4bHI880.jpg

我们看到semi_sync_master_status是ON的,而semi_sync_slave_status是OFF的,下面我们启动它。


3)使半同步机制生效

mysqlA和mysqlB上执行:

> stop slave;start slave;
> show status like '%semi%';

wKiom1Sc2u2hxPmOAARIz1JUSpg229.jpg

我们看到semi_sync_slave_status是ON了,已经启动。