mysql5.5 semi-sync安裝維護 .

mysql5.5 semi-sync replication 安裝維護

mysql的replication協議是異步的,雖然異步效率、性能很好,但是卻無法保證主從數據一致性(如果master crash,已經commit的事務不會被傳送到任何的slave上),從mysql5.5之後,mysql爲了保證主從庫數據一致性,引進了semi-sync功能,semi-sync意思是MASTER只需要接收到其中一臺SLAVE的返回信息,就會commit;否則需等待直至切換成異步再提交。

 

優點:
當事務返回客戶端成功後,則日誌一定在至少兩臺主機上存在。
MySQL的Semi-sync適合小事務,且兩臺主機的延遲又較小,則Semi-sync可以實現在性能很小損失的情況下的零數據丟失。

 

缺點:
完成單個事務增加了額外的等待延遲,延遲的大小取決於網絡的好壞。
Semi-sync不是分佈式事務,主庫會在自己完成事務後,等待備庫接收事務日誌(網易已經修改源碼,使其在同一事務裏)


備庫Crash時,主庫會在某次等待超時後,關閉Semi-sync的特性,降級爲普通的異步複製,這種情況比較簡單。

主庫Crash後,那麼可能存在一些事務已經在主庫Commit,但是還沒有傳給任何備庫,我們姑且稱這類事務爲"牆頭事務"。"牆頭事務"都是沒有返回給客戶端的,所以發起事務的客戶端並不知道這個事務是否已經完成。這時,如果客戶端不做切換,只是等Crash的主庫恢復後,繼續在主庫進行操作,客戶端會發現前面的"牆頭事務"都已經完成,可以繼續進行後續的業務處理;另一種情況,如果客戶端Failover到備庫上,客戶端會發現前面的“牆頭事務”都沒有成功,則需要重新做這些事務,然後繼續進行後續的業務處理。


安裝

在主庫安裝semisync_master插件:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; //linux
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.dll'; //windows

在備庫安裝semisync_slave插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; //linux
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';//windows

在初次安裝插件後,MySQL會將該插件記錄到系統表mysql.plugin中,下次啓動時系統則會自動加載該插件了,無需再次執行上面的命令。

 

簡要安裝如下
Master端的安裝過程

1.INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
2.SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled' 值爲ON,表示開啓;否則檢查失敗原因
3.SET GLOBAL rpl_semi_sync_master_timeout=100000(利於觀察);
4.SET GLOBAL rpl_semi_sync_master_wait_no_slave=1(是默認值,表示即使沒有SLAVE也會等待過期時間結束)
 
Slave端的安裝過程

1.INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2.SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled' 值爲ON,表示開啓;否則失敗檢查原因

 

如果要啓用半同步功能,在主備庫的配置文件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
...

如果考慮主備切換,就需要兩個插件在master/slave上都安裝,在配置文件my.cnf主備參數都需要添加

主備在啓動後,且slave線程開始dump主庫的日誌後,Semi-sync Replication就會開啓,上面的配置(rpl_semi_sync_master_timeout=1000)表示主庫在某
次事務中,如果等待時間超過1000毫秒,那麼則降級爲普通模式,不再等待備庫。如果主庫再次探測到,備庫恢復了,則會自動再次回到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    |
| rpl_semi_sync_slave_trace_level    | 32    |
+------------------------------------+-------+
7 rows in set (0.00 sec)

 

從庫上參數:
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    |
+------------------------------------+-------+
6 rows in set (0.00 sec)

mysql>


如果在master上安裝兩個插件,master的參數如下(slave也一樣):

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    |
| rpl_semi_sync_slave_enabled        | ON    |
| rpl_semi_sync_slave_trace_level    | 32    |
+------------------------------------+-------+

6 rows in set (0.00 sec)

mysql>

 

參數說明:
rpl_semi_sync_master_timeout=1000 :表示主庫在某次事務中,如果等待時間超過1000毫秒,那麼則降級爲普通模式,不再等待備庫。
                                                                       如果主庫再次探測到,備庫恢復了,則會自動再次回到Semi-sync狀態,在測試時,可以設置大些,利於觀察

rpl_semi_sync_master_wait_no_slave=1:表示即使沒有SLAVE也會等待過期時間結束,是默認值,


這兩個變量可以在線設置,但如果不寫在my.cnf中,數據庫重啓參數就恢復默認值了
SET GLOBAL rpl_semi_sync_master_timeout=100000
SET GLOBAL rpl_semi_sync_master_wait_no_slave=1


驗證master/slave是否啓用semi-sync
檢查master端semi-sync安裝之後是否啓用(rpl_semi_sync_master_enabled如果值爲ON,表示開啓;否則檢查失敗原因)

mysql> show variables like '%rpl_semi_sync_master_enabled%';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
+------------------------------+-------+
1 row in set (0.00 sec)


檢查slave端semi-sync安裝之後是否啓用(rpl_semi_sync_slave_enabled如果值爲ON,表示開啓;否則檢查失敗原因)
mysql> show variables like '%rpl_semi_sync_slave_enabled%';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON    |
+-----------------------------+-------+
1 row in set (0.00 sec)

mysql>


查看master/slave的semi-sync運行狀態

在slave上查看semi-sync是否開啓
mysql> show status like '%rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_slave_status                 | ON    |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

mysql>


在master上查看semi-sync是否開啓
mysql> show status like '%rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2         | #有多少個Semi-sync的備庫                      
| Rpl_semi_sync_master_net_avg_wait_time     | 1209      | #事務提交後,等待備庫響應的平均時間           
| Rpl_semi_sync_master_net_wait_time         | 213811529 | #等待網絡響應的總次數                         
| Rpl_semi_sync_master_net_waits             | 176714    | #總的網絡等待時間                             
| 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      | 1618      | #開啓Semi-sync,事務返回需要等待的平均時間    
| Rpl_semi_sync_master_tx_wait_time          | 156225399 | #事務等待備庫響應的總時間                     
| Rpl_semi_sync_master_tx_waits              | 96501     | #事務等待備庫響應的總次數                     
| Rpl_semi_sync_master_wait_pos_backtraverse | 1006      | #改變當前等待最小二進制日誌的次數             
| Rpl_semi_sync_master_wait_sessions         | 0         | #當前有幾個線程在等備庫響應                   
| Rpl_semi_sync_master_yes_tx                | 92171     | #Semi-sync模式下,成功的事務數              
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

mysql>

master狀態參數說明
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是否有超時失敗過,該計數器則記錄了這樣的失敗次數。

 

參考:
http://www.orczhou.com/index.php/2011/06/mysql-5-5-semi-sync-replication-setup-config/
http://www.mysqlops.com/2011/10/24/mysql-semi-replicatio.html
http://code.google.com/p/google-mysql-tools/wiki/SemiSyncReplication
http://www.orczhou.com/index.php/2011/07/why-and-how-mysql-5-5-semi-sync-replication/

 

 

------end-----

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章