1. 程式人生 > >mysql 半同步複製(semi_sync_replication)搭建及使用

mysql 半同步複製(semi_sync_replication)搭建及使用

      google為mysql開發了一個補丁一個基於半同步的補丁,應用與mysql5.0。回來mysql打上了該補丁,並在5.5版本中使用。半同步複製的理念是什麼呢?在資料庫更改操作執行前,確保更改操作至少被寫入一臺slave磁碟中,意味著著對於每一個連線,最多隻有一個事務會由於master崩潰丟失。主要是保證資料完整性,防止事務的丟失。
半同步配置
前提主從複製環境已搭建好(省略)
master操作
安裝外掛
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.21 sec)

mysql> show variables like 'rpl_%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_recovery_rank                  | 0     |
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
5 rows in set (0.00 sec)
設定變數,啟用半同步複製
mysql> set global rpl_semi_sync_master_enabled=on ;
Query OK, 0 rows affected (0.02 sec)

slave 操作
安裝外掛
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.06 sec)

mysql> show variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)
啟用半同步複製
mysql> set global rpl_semi_sync_slave_enabled=on ;
Query OK, 0 rows affected (0.00 sec)
rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled也可以配置在master和slave的配置檔案中,這樣伺服器重啟也生效。
這樣一個半同步複製就配置完成。配置完slave,我們需要考慮如下兩個問題
 1 如果所有slave崩潰怎麼辦?這時將沒有slave通知master,事務已寫入中繼日誌中。
 2 如果所有的slave斷開怎麼辦?在這種情況下,沒有slave通知master處於安全考慮而傳送事務。
 還有兩個引數解決以上情況
rpl_semi_sync_master_timeout=milliseconds
防止半同步複製在沒有收到確認的情況下,傳送堵塞可以使用rpl-semi-sync-mastertimeout=milliseconds選項設定計數器。master在超時之前沒有收到確認,將恢復到非同步複製,繼續執行半同步沒有進行的操作
通過 set global rep-semi-sync-master-timeout=milliseconds 設定。需要注意的是作為伺服器變數,伺服器重啟此值不被儲存
rpl-semi-sync-master-wait-no-slave=on/off
如果一個事務被提交,而master沒有slave連線,這時slave不可能將事務傳送到其他地方儲存,預設情況下,master會在時間限制範圍內急性等待slave的,並確認該事務被正確寫入磁碟上。此種情況下,master還是會恢復到非同步複製。

如何監控半同步複製
安裝的外掛提供了大量狀態變數,可以利用這些狀態變數監控半同步複製,簡紹一些最有用的變數,其他變數,可以查詢線上手冊(http://dev.mysql.com/doc/refman/5.5/en/replication-semisync-interface.html)
rpl_semi_sync_master-clients  
此狀態變數報告了支援和主從半同步複製已連線的slave數量
rpl_semi_sync_master_status
master的半同步複製狀態 1是活動狀態,0是非活動狀態。要麼是沒有被啟用,或是因為已恢復到非同步複製
使用show status命令或通過information_schema模式下的global_status來查詢這些狀態變數。
mysql> show status like 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
使用半同步複製,效能也許會受到影響,主要原則是來保證資料完整性,在這裡完整性才是最重要的。