測試環境:
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Server version: 5.6.22-log MySQL Community Server (GPL)mysql
mysql的replication協議是異步的,雖然異步效率、性能很好,可是卻沒法保證主從數據一致性,
若是master crash,已經commit的事務不會被傳送到任何的slave上,
從mysql5.5以後,mysql爲了保證主從庫數據一致性,引進了semi-sync功能,
semi-sync意思是MASTER只須要接收到其中一臺SLAVE的返回信息,就會commit;不然需等待直至切換成異步再提交。linux
優勢:
當事務返回客戶端成功後,則日誌必定在至少兩臺主機上存在。
MySQL的Semi-sync適合小事務,且兩臺主機的延遲又較小,則Semi-sync能夠實如今性能很小損失的狀況下的零數據丟失。sql
缺點:
完成單個事務增長了額外的等待延遲,延遲的大小取決於網絡的好壞。windows
配置方法:
在主庫安裝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';//windowssession
主庫上,新增以下參數:
$vi /etc/my.cnf異步
[mysqld]
...
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
...函數
備庫上新增:性能
$vi /etc/my.cnf測試
[mysqld]
...
rpl_semi_sync_slave_enabled=1
重啓master和slave,semi_sync插件會自動加載
重啓後,master顯示以下:
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 | #表示即便沒有SLAVE也會等待過時時間結束,是默認值
+------------------------------------+-------+
4 rows in set (0.00 sec)
mysql> show status like '%semi%';
+--------------------------------------------+----------+
| Variable_name | Value |
+--------------------------------------------+----------+
| Rpl_semi_sync_master_clients | 3 | #有多少個Semi-sync的備庫,我配置了3個
| Rpl_semi_sync_master_net_avg_wait_time | 2525 | #事務提交後,等待備庫響應的平均時間
| Rpl_semi_sync_master_net_wait_time | 45892342 | #總的網絡等待時間
| Rpl_semi_sync_master_net_waits | 18174 | #等待網絡響應的總次數
| 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 | 1196 | #開啓Semi-sync,事務返回須要等待的平均時間
| Rpl_semi_sync_master_tx_wait_time | 7918635 | #事務等待備庫響應的總時間
| Rpl_semi_sync_master_tx_waits | 6620 | #事務等待備庫響應的總次數
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | #改變當前等待最小二進制日誌的次數
| Rpl_semi_sync_master_wait_sessions | 0 | #當前有幾個線程在等備庫響應
| Rpl_semi_sync_master_yes_tx | 6549 | #Semi-sync模式下,成功的事務數
+--------------------------------------------+----------+
14 rows in set (0.00 sec)
slave上顯示以下:
mysql> show variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.01 sec)
mysql> show status like '%semi%';+----------------------------+-------+| Variable_name | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | ON |+----------------------------+-------+1 row in set (0.00 sec)