MySQL Semisynchronous Replication
MySQL5.5 除了支援内置的異步複制機制,還開始支援接口支援半同步複制的機制。
一、半同步複制的概念:
i.
當Slave主機連接配接到Master時,能夠檢視其是否處于半同步複制的機制。
ii.
當Master上開啟半同步複制的功能時,至少應該有一個Slave開啟其功能。此時,一個線程在Master上送出事務将受到阻塞,直到得知一個已開啟半同步複制功能的Slave已收到此事務的所有事件,或等待逾時。
iii.
當一個事務的事件都已寫入其relay-log中且已重新整理到磁盤上,Slave才會告知已收到。
iv.
如果等待逾時,也就是Master沒被告知已收到,此時Master會自動轉換為異步複制的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉換為半同步複制的機制。
v.
半同步複制的功能要在Master,Slave都開啟,半同步複制才會起作用;否則,隻開啟一邊,它依然為異步複制。
二、同步,異步,半同步複制的比較:
同步複制:Master送出事務,直到事務在所有的Slave都已送出,此時才會傳回用戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。
異步複制:當Slave準備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。
半同步複制:半同步複制工作的機制處于同步和異步之間,Master的事務送出阻塞,隻要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它隻是接收,并不用等其完全執行且送出。
三、常用參數解釋:
開啟半同步複制的狀态量:
rpl_semi_sync_master_enabled 是控制Master是否開啟半同步,開啟或不開啟,将其設定為ON或OFF(1or0).
rpl_semi_sync_master_timeout 是控制Master等待多長時間被告知Slave已收到,也就是所謂的逾時時間。
rpl_semi_sync_slave_enabled 是控制Slave是否開啟半同步,開啟或不開啟,将其設定為ON或OFF(1or0)。
監控半同步複制的狀态變量(幾個常用的):
Rpl_semi_sync_master_clients:檢視有多少個開啟半同步複制的插件的Slave
Rpl_semi_sync_master_status:檢視在Master上半同步複制是否正在運作,其值為ON時,說明Master已啟用半同步且已被告知有Slave收到;其值為OFF時,說明Master沒啟用半同步或是沒被告知,由于timeout等原因。
Rpl_semi_sync_master_no_tx:檢視有多少事務沒有用半同步複制的機制進行複制。
Rpl_semi_sync_master_yes_tx:檢視有多少事務是通過半同步複制機制成功複制。
Rpl_semi_sync_slave_status:檢視Slave上半同步複制是否正常運作,其值為ON時,說明Slave正通過半同步複制且Slave I/O正在運作;為OFF時,反之。
可以通過以下方法檢視以上的參數狀态:
<code>mysql> show status </code><code>like</code> <code>'rpl_semi%'</code><code>;</code>
<code>+</code><code>--------------------------------------------+-------+</code>
<code>| Variable_name | Value |</code>
<code>| Rpl_semi_sync_master_clients | 2 |</code>
<code>| Rpl_semi_sync_master_net_avg_wait_time | 654 |</code>
<code>| Rpl_semi_sync_master_net_wait_time | 1308 |</code>
<code>| Rpl_semi_sync_master_net_waits | 2 |</code>
<code>| Rpl_semi_sync_master_no_times | 0 |</code>
<code>| Rpl_semi_sync_master_no_tx | 0 |</code>
<code>| Rpl_semi_sync_master_status | </code><code>ON</code> <code>|</code>
<code>| Rpl_semi_sync_master_timefunc_failures | 0 |</code>
<code>| Rpl_semi_sync_master_tx_avg_wait_time | 0 |</code>
<code>| Rpl_semi_sync_master_tx_wait_time | 0 |</code>
<code>| Rpl_semi_sync_master_tx_waits | 0 |</code>
<code>| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |</code>
<code>| Rpl_semi_sync_master_wait_sessions | 0 |</code>
<code>| Rpl_semi_sync_master_yes_tx | 1 |</code>
<code>| Rpl_semi_sync_slave_status | </code><code>ON</code> <code>|</code>
<code>15 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec)</code>
四、開始部署:
部署環境要求:
i.MySQL版本需求
MySQL5.5或以上版本
在MySQL上安裝插件需要資料庫支援動态載入。檢查是否支援,用如下檢測:
<code>mysql> show </code><code>global</code> <code>variables </code><code>like</code> <code>'have_dynamic_loading'</code><code>;</code>
<code>+</code><code>----------------------+-------+</code>
<code>| Variable_name | Value |</code>
<code>| have_dynamic_loading | YES |</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
iii.半同步複制是基于複制的環境。也就是說配置半同步複制前,已有複制的環境。
開始安裝:
在Master上執行:
<code>mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME </code><code>'semisync_master.so'</code><code>;</code>
各個Slave上執行:
<code>mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME </code><code>'semisync_slave.so'</code><code>;</code>
iv.如果不清楚Plugin的目錄,用如下查找:
<code>mysql> show </code><code>global</code> <code>variables </code><code>like</code> <code>'plugin_dir'</code><code>;</code>
<code>+</code><code>---------------+----------------------------------+</code>
<code>| Variable_name | Value |</code>
<code>| plugin_dir | /opt/usr/</code><code>local</code><code>/mysql/lib/plugin/ |</code>
v.檢查Plugin是否已正确安裝:
<code>mysql> show plugins;</code>
<code>or</code>
<code>mysql> </code><code>select</code> <code>* </code><code>from</code> <code>information_schema.plugins;</code>
五、開始配置:
<code>mysql> </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_master_enabled = 1;</code>
<code>mysql> </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_master_timeout = N; N自己設定一個數字即可</code>
在Slave上執行:
<code>mysql> </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_slave_enabled = 1;</code>
如果在一個正在運作的Slave上開啟半同步複制的功能,必須先停止Slave I/O,将其啟用半同步後,再開啟Slave I/O.
<code>mysql> STOP SLAVE IO_THREAD; </code>
<code> </code><code>START SLAVE IO_THREAD;</code>
如果不這樣做,Slave還是會以異步的方式進行複制。
正如大家所知,如果不将變量的設定寫到配置檔案,下次重新開機資料庫,将失效。寫入配置檔案:
Master上:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 #default 1 second
Slave上:
rpl_semi_sync_slave_enabled=1
總結:
半同步複制個人感覺是維持資料完整性,安全性的的一個政策,雖會損失一點性能,還是值得的。配置很簡單,關鍵是了解其工作機制。、
本文轉自crazy_charles 51CTO部落格,原文連結:http://blog.51cto.com/douya/1790281,如需轉載請自行聯系原作者