天天看點

說說MySQL的半同步複制

    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&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>

如果不清楚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>

檢查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;</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; 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,如需轉載請自行聯系原作者