MySQL Semisynchronous Replication
MySQL5.5 除了支援内置的異步複制機制,還提供了接口支援半同步複制的機制。
異步複制的缺點:
MySQL複制預設是異步複制,Master将事件寫入binlog,但并不知道Slave是否或何時已經接收且已處理。在異步複制的機制的情況下,如果Master當機,事務在Master上已送出,但很可能這些事務沒有傳到任何的Slave上。假設有Master->Salve故障轉移的機制,此時Slave也可能會丢失事務。
半同步複制的概念:
當Slave主機連接配接到Master時,能夠檢視其是否處于半同步複制的機制。
當Master上開啟半同步複制的功能時,至少應該有一個Slave開啟其功能。此時,一個線程在Master上送出事務将受到阻塞,直到得知一個已開啟半同步複制功能的Slave已收到此事務的所有事件,或等待逾時。
當一個事務的事件都已寫入其relay-log中且已重新整理到磁盤上,Slave才會告知已收到。
如果等待逾時,也就是Master沒被告知已收到,此時Master會自動轉換為異步複制的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉換為半同步複制的機制。
半同步複制的功能要在Master,Slave都開啟,半同步複制才會起作用;否則,隻開啟一邊,它依然為異步複制。
同步,異步,半同步複制的比較:
同步複制:Master送出事務,直到事務在所有的Slave都已送出,此時才會傳回用戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。
異步複制:當Slave準備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。
半同步複制:半同步複制工作的機制處于同步和異步之間,Master的事務送出阻塞,隻要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它隻是接收,并不用等其完全執行且送出。
半同步複制的控制變量,狀态監控變量:
控制變量
Variable Name
Variable Scope
Dynamic Variable
Type
Default
Effect Host
rpl_semi_sync_master_enabled
Global
Yes
boolean
OFF
Master
rpl_semi_sync_slave_enabled
Slave
rpl_semi_sync_master_timeout
numeric
10000
解釋:
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時,反之。
半同步複制的安裝,配置
環境要求:
MySQL5.5或以上版本
在MySQL上安裝插件需要資料庫支援動态載入。檢查是否支援,用如下檢測:
1
2
3
4
5
6
7
<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>
如果不清楚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>
檢查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;</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; START SLAVE IO_THREAD;</code>
如果不這樣做,Slave還是會以異步的方式進行複制。
正如大家所知,如果不将變量的設定寫到配置檔案,下次重新開機資料庫,将失效。寫入配置檔案:
Master上:
<code>[mysqld]</code>
<code>rpl_semi_sync_master_enabled=</code><code>1</code>
<code>rpl_semi_sync_master_timeout=</code><code>1000</code> <code># </code><code>1</code> <code>second</code>
Slave上:
<code>rpl_semi_sync_slave_enabled=</code><code>1</code>
總結:半同步複制個人感覺是維持資料完整性,安全性的的一個政策,雖會損失一點性能,還是值得的。配置很簡單,關鍵是了解其工作機制。
本文轉自 kuchuli 51CTO部落格,原文連結:http://blog.51cto.com/lgdvsehome/1231046,如需轉載請自行聯系原作者