1.1.半同步複制的概念:
1.當Slave主機連接配接到Master時,能夠檢視其是否處于半同步複制的機制。
2.當Master上開啟半同步複制的功能時,至少應該有一個Slave開啟其功能。此時,一個線程在Master上送出事務将受到阻塞,直到得知一個已開啟半同步複制功能的Slave已收到此事務的所有事件,或等待逾時。
3.當一個事務的事件都已寫入其relay-log中且已重新整理到磁盤上,Slave才會告知已收到。
4.如果等待逾時,也就是Master沒被告知已收到,此時Master會自動轉換為異步複制的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉換為半同步複制的機制。
5.半同步複制的功能要在Master,Slave都開啟,半同步複制才會起作用;否則,隻開啟一邊,它依然為異步複制。
1.2.半同步說明
在一主多從的場景中,主伺服器會以同步的方式,隻等待一台從伺服器複制完成并傳回成功資訊後才停止等待過程,但是在逾時後會自動降級為異步模式。
1.3.同步,異步,半同步複制的比較:
同步複制:Master送出事務,直到事務在所有的Slave都已送出,此時才會傳回用戶端,事務執行完畢。缺點:完成一個事務可能會有很大的延遲。
異步複制:當Slave準備好才會向Master請求binlog。缺點:不能保證一些事件都能夠被所有的Slave所接收。
半同步複制:半同步複制工作的機制處于同步和異步之間,Master的事務送出阻塞,隻要一個Slave已收到該事務的事件且已記錄。它不會等待所有的Slave都告知已收到,且它隻是接收,并不用等其完全執行且送出。
1.4.配置
環境 :多執行個體 主從同步3306 3307
在主從複制的基礎上,隻需執行如下操作即可。
# On Master
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';#插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; #啟動子產品
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; #設定逾時時間
# On Slave
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; #啟動子產品
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; #重新開機程序使其子產品生效
如果需要開機時,自動能夠實作半同步則需要在Master和Slave的my.cnf中編輯:
[mysqld]
rpl_semi_sync_master_enabled=1 #啟動子產品
rpl_semi_sync_master_timeout=1000 #此機關是毫秒
rpl_semi_sync_slave_enabled=1
配置完後需要重新開機服務
檢視從伺服器上的semi_sync是否開啟:
mysql> SHOW GLOBAL STATUS LIKE "rpl_semi%";

檢視主伺服器上的semi_sync是否開啟,注意clients 變為1 ,證明主從半同步複制連接配接成功:
Rpl_semi_sync_master_no_tx:檢視有多少事務沒有用半同步複制的機制進行複制。
Rpl_semi_sync_master_yes_tx:檢視有多少事務是通過半同步複制機制成功複制。
rpl_semi_sync_master_timeout:是控制Master等待多長時間被告知Slave已收到,逾時時間。
将逾時時間改為0;再測試,這個時候寫入庫,看看半同步了多少事務,看那些沒同步,檢視效果,進行比較。
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 12622 |
| Rpl_semi_sync_master_net_wait_time | 12622 |
| Rpl_semi_sync_master_net_waits | 1 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| 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 |
| Rpl_semi_sync_slave_status | OFF |
15 rows in set (0.00 sec)
mysql> create database yhg1111;
Query OK, 1 row affected (0.01 sec)
| Rpl_semi_sync_master_net_avg_wait_time | 8908 |
| Rpl_semi_sync_master_net_wait_time | 17816 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_yes_tx | 1 |
| Rpl_semi_sync_slave_status