天天看点

MySQL双主(master-master)+半同步(Semisync Replication)

环境:

主机名

主机IP

操作系统

MySQL版本

mysqlA

172.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

mysqlB

172.16.4.236

架构:

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

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

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

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

一、准备工作

1)安装最新版MySQL5.7

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

2)修改MySQL配置文件

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

mysqlA的配置文件:

<code>server-</code><code>id</code> <code>= 1</code>

<code>log-bin=mysql-bin    </code><code># 打开二进制日志功能,作为主库时必须设置</code>

<code>log-slave-updates    </code><code># 做为从库时,数据库的修改也会写到bin-log里</code>

<code>binlog-ignore-db = mysql</code>

<code>binlog-ignore-db = information_schema</code>

<code>binlog-ignore-db = performance_schema</code>

<code>replicate-wild-ignore-table = mysql.%</code>

<code>replicate-wild-ignore-table = information_schema.%</code>

<code>replicate-wild-ignore-table = performance_schema.%</code>

<code>expire_logs_days=5   </code><code># 表示自动删除5天以前的binlog,可选</code>

mysqlB的配置文件:

<code>server-</code><code>id</code> <code>= 2</code>

<code>log-bin=mysql-bin</code>

<code>log-slave-updates</code>

<code>expire_logs_days=5</code>

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

<code>&gt; </code><code>GRANT</code> <code>REPLICATION SLAVE </code><code>ON</code> <code>*.* </code><code>TO</code> <code>'repl_user'</code><code>@</code><code>'172.16.4.%'</code> <code>IDENTIFIED </code><code>BY</code> <code>'MNVq_YOg9'</code><code>;</code>

<code>&gt; FLUSH </code><code>PRIVILEGES</code><code>;</code>

二、Master-Master配置

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

1)配置mysqlA为主库

在mysqlA上配置:

<code>&gt; reset master;(清空master的binlog,平时慎用,可选)</code>

<code>&gt; flush tables </code><code>with</code> <code>read</code> <code>lock;</code>

<code>&gt; show master status;</code>

<a href="http://s3.51cto.com/wyfs02/M00/57/88/wKiom1Sc43njuPCVAAHylRosxp0182.jpg" target="_blank"></a>

2)配置mysqlB为mysqlA的从库

在mysqlB上配置:

<code>&gt; stop slave;</code>

<code>&gt; CHANGE MASTER </code><code>TO</code> <code>MASTER_HOST=</code><code>'172.16.4.235'</code><code>, MASTER_USER=</code><code>'repl_user'</code><code>, MASTER_PASSWORD=</code><code>'MNVq_YOg9'</code><code>, MASTER_LOG_FILE=</code><code>'mysql-bin.000001'</code><code>, MASTER_LOG_POS=120;</code>

<code>&gt; start slave;</code>

<code>&gt; show slave status\G</code>

3)将mysqlB设为主库

在mysqlB上设置:

4)将mysqlA设为mysqlB的从库

<code>&gt; unlock tables;</code>

<code>&gt; CHANGE MASTER </code><code>TO</code> <code>MASTER_HOST=</code><code>'172.16.4.236'</code><code>, MASTER_USER=</code><code>'repl_user'</code><code>, MASTER_PASSWORD=</code><code>'MNVq_YOg9'</code><code>, MASTER_LOG_FILE=</code><code>'mysql-bin.000001'</code><code>, MASTER_LOG_POS=120;</code>

<a href="http://s3.51cto.com/wyfs02/M00/57/87/wKiom1Sc01awreiPAAUuWZrW9qU421.jpg" target="_blank"></a>

最后在mysqlB上:

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

三、Semisync半同步配置

1)加载semisync_master和semisync_slave插件

mysqlA和mysqlB上执行:

<code>&gt; INSTALL PLUGIN rpl_semi_sync_master SONAME </code><code>'semisync_master.so'</code><code>;</code>

<code>&gt; INSTALL PLUGIN rpl_semi_sync_slave SONAME </code><code>'semisync_slave.so'</code><code>;</code>

<code>&gt; show variables </code><code>like</code> <code>'%semi%'</code><code>;</code>

<a href="http://s3.51cto.com/wyfs02/M00/57/85/wKioL1Sc2LWz_GURAANaexTXimc467.jpg" target="_blank"></a>

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

<code>&gt; </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_master_enabled = 1;</code>

<code>&gt; </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_slave_enabled = 1;</code>

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

<code>rpl_semi_sync_master_enabled = 1</code>

<code>rpl_semi_sync_slave_enabled = 1</code>

<a href="http://s3.51cto.com/wyfs02/M02/57/85/wKioL1Sc20-gmDOuAARxtqR4bHI880.jpg" target="_blank"></a>

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

3)使半同步机制生效

<code>&gt; stop slave;start slave;</code>

<code>&gt; show status </code><code>like</code> <code>'%semi%'</code><code>;</code>

<a href="http://s3.51cto.com/wyfs02/M01/57/88/wKiom1Sc2u2hxPmOAARIz1JUSpg229.jpg" target="_blank"></a>

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

本文转自 张斌_青岛 51CTO博客,原文链接:http://blog.51cto.com/qicheng0211/1596131