天天看點

MySQL 半同步複制詳解

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&gt; 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&gt; 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&gt; INSTALL PLUGIN rpl_semi_sync_master SONAME </code><code>'semisync_master.so'</code><code>;</code>

各個Slave上執行:

<code>mysql&gt; INSTALL PLUGIN rpl_semi_sync_slave SONAME </code><code>'semisync_slave.so'</code><code>;</code>

iv.如果不清楚Plugin的目錄,用如下查找:

<code>mysql&gt; 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&gt; show plugins;</code>

<code>or</code>

<code>mysql&gt; </code><code>select</code> <code>* </code><code>from</code> <code>information_schema.plugins;</code>

五、開始配置:

<code>mysql&gt; </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_master_enabled = 1;</code>

<code>mysql&gt; </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_master_timeout = N; N自己設定一個數字即可</code>

在Slave上執行:

<code>mysql&gt; </code><code>SET</code> <code>GLOBAL</code> <code>rpl_semi_sync_slave_enabled = 1;</code>

如果在一個正在運作的Slave上開啟半同步複制的功能,必須先停止Slave I/O,将其啟用半同步後,再開啟Slave I/O.

<code>mysql&gt; 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,如需轉載請自行聯系原作者