程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL 半同步復制+MMM架構,mysql同步mmm架構

MySQL 半同步復制+MMM架構,mysql同步mmm架構

編輯:MySQL綜合教程

MySQL 半同步復制+MMM架構,mysql同步mmm架構


介紹

    上篇文章介紹了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方案是兩主一從,所以我在其中的雙主上面配置半同步復制,從庫上面還是原先的異步復制。半同步復制是基於插件來實現的,主從上面各自執行不同的插件。

1.查詢是否支持動態插件

主從上面都需要查看是否支持動態插件

2.安裝動態插件

主備都執行

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

注意:由於我當前的雙主模式所以主和備都需要執行主從的插件,如果只是單純的主從模式那麼主執行主的插件從執行從的插件即可。

查看插件是否安裝

3.開啟半同步復制

SET GLOBAL rpl_semi_sync_master_enabled = 1;

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

同樣主和備上面都同時執行上面兩個操作,注意必須是開啟全局的變量。

4.重啟io線程

1.備庫執行

 STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

2.主庫執行

 STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

5.配置參數

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端顯示的,由於我這裡是配置雙主模式,所有主從都存在。

6.狀態參數

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

總結

 半同步復制雖然主從的binlog是同步的,但是主只是等待binlog寫入到從庫並不等待從庫應用這部分binlog,而從庫應用這部分binlog的操作則是異步的,所以主從的數據並不是實時同步的,所以只能叫做半同步復制。在5.7版本之前作為主從的業務都會遇到主從延時比較大的情況,特別是當主是密集寫的情況這種延時就更加大,那是因為主是並發寫也從庫應用主的binlog是順序執行導致從跟不上主,在5.7引入了並行復制,所謂的並行也就是將不相關的操作放在一個組裡面這樣從庫就可以做到理論上的並行了從而提高主庫應用binlog的速率,並且在5.7的半同步復制引入了一個新的參數“rpl_semi_sync_master_wait_point=AFTER_SYNC”該參數是控制主庫響應從庫的binlog發生在flush disk之前,在5.6版本當主庫flush disk之後才發送binlog如果這時主庫由於某種原因宕機了,這時如果客戶端沒有收到從庫的響應那麼客戶端可能從新執行操作而這時主從已經做了切換客戶端連接主庫(之前是從庫)再次執行之前的操作,這樣當之前的主庫(現在變成從庫)啟動之後變成從庫後又重新應用了一次操作造成了數據寫了兩次,所以在5.7就把binlog的響應放在flush disk之前這樣就不會存在數據重復寫的情況了,默認該參數是開啟的所以搭建方法和5.6是完全一致的不需要做什麼改變。如果將該參數的值改成“rpl_semi_sync_master_wait_point=AFTER_COMMIT”則又變成5.6一樣的方案。在後面會單獨寫一篇關於5.7復制有關的新改進的文章,歡迎關注。

 

 

 

備注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須注明文章來源,且在文章開頭明顯處給明鏈接。

《歡迎交流討論》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved