上篇文章介紹了MMM架構的實現方法,但是上篇文章的MMM方案的復制是異步復制,異步復制的主要問題在於當主從存在延時時如果主機出現了故障導致了主從切換時這時將會存在數據丟失;mysql為了解決異步復制數據丟失的問題增加了半同步復制,半同步復制存在5.5以上的版本,半同步復制的原理是客戶端在事務提交時必須等待從庫接收到binlog的回應之後才能提交事務(當存在多個從庫時默認只需要一個從庫接受到了bInlog即可,也可以配置必須每一個從庫都必須接收到binlog但是這樣對性能影響就會很大),如果從庫宕機或者故障導致binlog沒有及時傳送到從庫(由參數rpl_semi_sync_master_timeout控制,默認是10S),這時mysql會自動轉為異步復制,當從庫又重新啟動有新的一條binglog從主庫發送到從庫在規定的時間內得到響應mysql又會自動轉換為半同步復制,所以半同步復制對主從之間的網絡要求比較高。
mysql版本:5.6
方案:MMM+半同步復制
5.6的半同步復制是在客戶端執行commit主庫寫入完binlog然後執行數據刷新到磁盤後才由dump線程將binlog記錄發送到從庫的io線程。
首先說明一下,當前的配置是基於MMM方案的配置,由於MMM方案是兩主一從,所以我在其中的雙主上面配置半同步復制,從庫上面還是原先的異步復制。半同步復制是基於插件來實現的,主從上面各自執行不同的插件。
主從上面都需要查看是否支持動態插件
主備都執行
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
注意:由於我當前的雙主模式所以主和備都需要執行主從的插件,如果只是單純的主從模式那麼主執行主的插件從執行從的插件即可。
查看插件是否安裝
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_slave_enabled = 1;
同樣主和備上面都同時執行上面兩個操作,注意必須是開啟全局的變量。
1.備庫執行
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
2.主庫執行
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
show variables like '%rpl_semi%';
rpl_semi_sync_master_enabled、rpl_semi_sync_slave_enabled
分別代表主從的半同步復制是否啟用,因為我當前是雙主模式所以即擔當了主又擔當了從,所以這裡面存在slave的參數在裡面
rpl_semi_sync_master_timeout
該參數是配置半同步復制的延時時間,當主庫發生binlog到從庫從庫在10s內還沒有返回則自動轉換為異步復制,這個時間可以調整,默認是10S
注意:如果僅僅是作為slave那麼只有"rpl_semi_sync_slave_enable","rpl_semi_sync_trace_level"這兩個狀態,其它的4個是作為master端顯示的,由於我這裡是配置雙主模式,所有主從都存在。
show status like '%rpl_%';
這些狀態參數比較重要,通常用來對半同步復制進行分析。
Rpl_semi_sync_master_clients:有多個個半同步復制的從庫,對於當前的主來說只有backup是半同步復制的從庫,而slave是異步復制,所以這裡是1;
Rpl_semi_sync_master_net_avg_wait_time:master等待從庫的平均響應時間,單位微妙
Rpl_semi_sync_master_net_wait_time: master等待從庫響應的總時間,單位微妙
Rpl_semi_sync_master_net_waits:master等待從庫響應的總次數
Rpl_semi_sync_master_no_times:master關閉半同步復制的次數,也就是當主從延時超過規定的時間轉換為異步復制的次數。
Rpl_semi_sync_master_no_tx:master提交沒有被slave響應成功的次數,也可以理解為不是同步半同步復制的次數。
Rpl_semi_sync_master_status:僅當當前服務器作為主庫,是否開啟了半同步復制,如果這裡是OFF代表是異步復制,前提是當前查詢的服務器是主服務器。
Rpl_semi_sync_master_timefunc_failures:master調用時間函數失敗的次數,例如:gettimeofday()
.
Rpl_semi_sync_master_tx_avg_wait_time:master等待每一個事務的平均時間,單位微妙
Rpl_semi_sync_master_tx_wait_time:master等待事務的總時間,單位微妙
Rpl_semi_sync_master_tx_waits:master等待事務的總次數
Rpl_semi_sync_master_wait_pos_backtraverse:發生master寫入的binlog的數量和slave響應返回的binlog數量不一致的次數。
Rpl_semi_sync_master_wait_sessions:當前等待slave響應的回話數量,該狀態可以反應當前主從延時包括壓力的情況
Rpl_semi_sync_master_yes_tx:master提交被slave成功響應的次數
Rpl_semi_sync_slave_status:僅當當前服務器作為從庫,半同步復制是否開啟,on代表開啟。
注意:如果僅僅是作為slave那麼只有"rpl_semi_sync_slave_status"這1個狀態,其它的狀態是作為master端顯示的,由於我這裡是配置雙主模式,所有主從都存在。
注意:注意關注上面顏色加粗的這些狀態
模擬從庫宕機
stop slave;
在master執行插入操作
主庫上面等待響應的時間剛好是10S
從參數值也可以得到剛才有一次半同步復制失敗
當從庫重新啟動復制之後,半同步復制也同樣開啟,剛才的插入記錄也被異步復制應用了過來。
注意:開啟半同步復制要加入到my.cnf文件中才能保證重啟mysql服務後半同步復制也啟用
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_slave_enabled = 1;
參考:
http://dev.mysql.com/doc/refman/5.6/en/replication-semisync-interface.html
前面寫的復制相關文章:
主從復制:http://www.cnblogs.com/chenmh/p/5089919.html
主主復制:http://www.cnblogs.com/chenmh/p/5153184.html
MMM:http://www.cnblogs.com/chenmh/p/5563778.html
備注:
作者:pursuer.chen
博客:http://www.cnblogs.com/chenmh
本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接。
《歡迎交流討論》