環境:
主機名
主機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>> </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>> FLUSH </code><code>PRIVILEGES</code><code>;</code>
二、Master-Master配置
mysqlA和mysqlB都是剛安裝好的、幹淨的資料庫,可根據下面的步驟搭建Master-Master。
1)配置mysqlA為主庫
在mysqlA上配置:
<code>> reset master;(清空master的binlog,平時慎用,可選)</code>
<code>> flush tables </code><code>with</code> <code>read</code> <code>lock;</code>
<code>> show master status;</code>
<a href="http://s3.51cto.com/wyfs02/M00/57/88/wKiom1Sc43njuPCVAAHylRosxp0182.jpg" target="_blank"></a>
2)配置mysqlB為mysqlA的從庫
在mysqlB上配置:
<code>> stop slave;</code>
<code>> 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>> start slave;</code>
<code>> show slave status\G</code>
3)将mysqlB設為主庫
在mysqlB上設定:
4)将mysqlA設為mysqlB的從庫
<code>> unlock tables;</code>
<code>> 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>> INSTALL PLUGIN rpl_semi_sync_master SONAME </code><code>'semisync_master.so'</code><code>;</code>
<code>> INSTALL PLUGIN rpl_semi_sync_slave SONAME </code><code>'semisync_slave.so'</code><code>;</code>
<code>> 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>> </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_master_enabled = 1;</code>
<code>> </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>> stop slave;start slave;</code>
<code>> 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