天天看點

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