測試環境:
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Server version: 5.6.22-log MySQL Community Server (GPL)
mysql的replication協議是異步的,雖然異步效率、性能很好,但是卻無法保證主從數據一致性,
如果master crash,已經commit的事務不會被傳送到任何的slave上,
從mysql5.5之后,mysql為了保證主從庫數據一致性,引進了semi-sync功能,
semi-sync意思是MASTER只需要接收到其中一台SLAVE的返回信息,就會commit;否則需等待直至切換成異步再提交。
優點:
當事務返回客戶端成功后,則日志一定在至少兩台主機上存在。
MySQL的Semi-sync適合小事務,且兩台主機的延遲又較小,則Semi-sync可以實現在性能很小損失的情況下的零數據丟失。
缺點:
完成單個事務增加了額外的等待延遲,延遲的大小取決於網絡的好壞。
配置方法:
在主庫安裝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
主庫上,新增如下參數:
$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)