數據庫配置
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; #重啓進程使其模塊生效
2.配置文件配置
如果需要開機時,自動能夠實現半同步則需要在Master和Slave的my.cnf中編輯:
# On Master
[mysqld]
rpl_semi_sync_master_enabled=1 #啓動模塊
rpl_semi_sync_master_timeout=1000 #此單位是毫秒
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled=1
配置完後需要重啓服務
3.查看是否成功
查看從服務器上的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已收到,超時時間。
4.證明:
將超時時間改爲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)
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| 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_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 | 1 |
| Rpl_semi_sync_slave_status