1. 程式人生 > >MySQL 5.5 Semi-sync Replication安裝配置、引數說明

MySQL 5.5 Semi-sync Replication安裝配置、引數說明

從09年12月份MySQL5.5的第一個Release,再到去年12月的第一個GA,MySQL5.5平均一月一個小版本號的速度在默默更新。該版本最重要的特性目前仍是Semi-sync Replication,之前做了一個概述,這裡將繼續介紹如何安裝、配置Semi-sync,後續還將繼續介紹其效能和一些基本的程式碼實現。

1. Semi-sync Repication的歷史

Semi-sync最早是由Google實現的一個補丁,程式碼主要由Mark Callaghan、Wei Li(@Google)等人貢獻。Google原本是將需求提給Hekki的,但是後來等不及就自己實現了......。(現在Mark Callaghan已跳到Facebook,除了Google,

他曾經還在Informix、Oracle工作過)

在5.5之後由MySQL Replication Team按照Plugin的方式將程式碼移植過來,並將Semi-sync獨立成MySQL的一個外掛,主要程式碼移植者是Zhenxing He(參考)。

2. 安裝、配置Semi-sync Replication

在兩臺主機上安裝好MySQL5.5,編譯好的外掛在目錄CMAKE_INSTALL_PREFIX/lib/plugin下(預設是/usr/local/mysql/lib/plugin)。例如這裡編譯是指定CMAKE_INSTALL_PREFIX為/home/mysql/mysql,則有:

$pwd
/home/mysql/mysql/lib/plugin
$ls -a semisync_*
semisync_master.so semisync_slave.so

在主庫初次啟動時,執行如下語句載入semisync_master外掛:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

備庫上則載入semisync_slave外掛:

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

在初次載入外掛後,MySQL會將該外掛記錄到系統表mysql.plugin中,下次啟動時系統則會自動載入該外掛了,無需再次執行上面的命令。

另外,主備庫的配置檔案my.cnf還需要新增如下記錄來開啟semi-sync。主庫上,新增如下引數:

$vi my.cnf
...
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
...

備庫上新增:

$vi my.cnf
...
rpl_semi_sync_slave_enabled=1
...

那麼主備在啟動後,且slave執行緒開始dump主庫的日誌後,Semi-sync Replication就會開啟,上面的配置(rpl_semi_sync_master_timeout=1000)表示主庫在某次事務中,如果等待時間超過1000毫秒,那麼則降級為普通模式,不再等待備庫。如果主庫再次探測到,備庫恢復了,則會自動再次回到Semi-sync狀態。

3. 其他引數

Semi-sync的配置引數不多,按照上面配置就可以了,其他少數幾個引數預設即可。

主庫上的其他引數:

mysql> show variables like "%rpl_semi%"; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 1000 | | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+

備庫上有:

mysql> show variables like "%rpl_semi%"; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_wait_no_slave | ON | | rpl_semi_sync_slave_enabled | ON | | rpl_semi_sync_slave_trace_level | 32 | +------------------------------------+-------+

rpl_semi_sync_master_trace_level和rpl_semi_sync_slave_trace_level是可以組合(求或)的引數,可以是下面值的組合:

1 = general level (for example, time function failures)
16 = detail level (more verbose information)
32 = net wait level (more information about network waits)
64 = function level (information about function entry and exit)

4. 執行狀態檢視

備庫上很簡單,只有一個狀態值,檢視備庫是否開啟了Semi-sync功能:

show status like "%rpl_semi%"; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+

主庫需要關注的狀態值則比較多

mysql> show status like "%rpl_semi%"; +--------------------------------------------+---------------+ | Variable_name | Value | +--------------------------------------------+---------------+ | Rpl_semi_sync_master_clients | 1 |# 有多少個Semi-sync的備庫 | Rpl_semi_sync_master_net_avg_wait_time | 732 |# 事務提交後,等待備庫響應的平均時間 | Rpl_semi_sync_master_net_wait_time | 1042785285 |# 等待網路響應的總次數 | Rpl_semi_sync_master_net_waits | 1423323 |# 總的網路等待時間 | Rpl_semi_sync_master_no_times | 0 |# 一共有幾次從Semi-sync跌回普通狀態 | Rpl_semi_sync_master_no_tx | 0 |# 備庫未及時響應的事務數 | Rpl_semi_sync_master_status | ON |# 主庫上Semi-sync是否正常開啟 | Rpl_semi_sync_master_timefunc_failures | 0 |# 時間函式未正常工作的次數 | Rpl_semi_sync_master_tx_avg_wait_time | 29059 |# 開啟Semi-sync,事務返回需要等待的平均時間 | Rpl_semi_sync_master_tx_wait_time | 8164966680929 |# 事務等待備庫響應的總時間 | Rpl_semi_sync_master_tx_waits | 280974820 |# 事務等待備庫響應的總次數 | Rpl_semi_sync_master_wait_pos_backtraverse | 5499398 |# 改變當前等待最小二進位制日誌的次數 | Rpl_semi_sync_master_wait_sessions | 230 |# 當前有幾個執行緒在等備庫響應 | Rpl_semi_sync_master_yes_tx | 16801244 |# Semi-sync模式下,成功的事務數 +--------------------------------------------+---------------+

上面比較重要的狀態值有:

Rpl_semi_sync_master_tx_avg_wait_time:事務因開啟Semi_sync,平均需要額外等待的時間

Rpl_semi_sync_master_net_avg_wait_time:事務進入等待佇列後,到網路平均等待時間

依據上面兩個狀態值可以知道,Semi-sync的網路消耗有多大,給某個事務帶來的額外的消耗有多大。

Rpl_semi_sync_master_status 則表示當前Semi-sync是否正常工作。

從Rpl_semi_sync_master_no_times變數,可以知道一段時間內,Semi-sync是否有超時失敗過,該計數器則記錄了這樣的失敗次數。

比較難理解引數有:

5. 關於Rpl_semi_sync_master_wait_pos_backtraverse

花了一些時間弄明白這個變數,繼續證實了這個變數確實不重要。

在semisync_master中,維護了這樣的兩個變數wait_file_name_和wait_file_pos_,當主庫上多個事務都在等待備庫的響應時,這兩個變數記錄了所有等待中,最小的那一個Binlog位置。如果這時,一個新的事務加入等待,並且該事務需要等待的Binlog比wait_file_name_和wait_file_pos_還小的話,則更新這兩個值,並將Rpl_semi_sync_master_wait_pos_backtraverse值自增一次。

上面的解釋參考如下程式碼段(semisync_master.cc):

int cmp = ActiveTranx::compare(trx_wait_binlog_name, trx_wait_binlog_pos, wait_file_name_, wait_file_pos_); if (cmp <= 0) { /* This thd has a lower position, let's update the minimum info. */ strcpy(wait_file_name_, trx_wait_binlog_name); wait_file_pos_ = trx_wait_binlog_pos; rpl_semi_sync_master_wait_pos_backtraverse++; if (trace_level_ & kTraceDetail) sql_print_information("%s: move back wait position (%s, %lu),", kWho, wait_file_name_, (unsigned long)wait_file_pos_); }

累了,聽首歌,伸個懶腰吧:)

 轉自:http://www.orczhou.com/index.php/2011/06/mysql-5-5-semi-sync-replication-setup-config/

參考文獻: