MySQL5.7半同步複製
實驗實現:
master:192.168.1.117
slave1:192.168.1.228
slave2:192.168.1.229
一、安裝前提
1、MySQL5.5 版本或更高
2、主、備庫的 have_dynamic_loading 系統變數值為 yes
3、主、備非同步複製已部署
二、過程
1.mster(192.168.1.117)
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like '%rpl%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_stop_slave_timeout | 31536000 |
+-------------------------------------------+------------+
7 rows in set (0.03 sec)
master接收到N個slave的應答後,才commit事物,等待1s使用者可以設定應道slave的數量。
rpl_semi_sync_master_wait_for_slave_count=1 預設是1
set global rpl_semi_sync_master_wait_for_slave_count=2;
mysql> set global rpl_semi_sync_master_enabled=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%rpl%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_stop_slave_timeout | 31536000 |
+-------------------------------------------+------------+
7 rows in set (0.00 sec)
slave節點(192.168.1.228/229)
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.02 sec)
mysql> set global rpl_semi_sync_slave_enabled=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%rpl%';
+---------------------------------+----------+
| Variable_name | Value |
+---------------------------------+----------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------+----------+
3 rows in set (0.01 sec)
- 配置(建議一定這樣做)
--主節點配置增加以下
[mysqld]
rpl_semi_sync_master_enabled=on
rpl_semi_sync_master_timeout=10000 # 10 second
備註: rpl_semi_sync_master_enabled 引數控制主節點是否開啟半同步複製;rpl_semi_sync_master_timeout 引數控制主節點等待備節點返回確認資訊的超時時間,單位為毫秒,超過這個時間後半同步複製轉變成非同步複製,這裡設定成 10 秒。
Slave節點配置
[mysqld]
rpl_semi_sync_slave_enabled=on
備註:rpl_semi_sync_slave_enabled 引數控制備節點是否開啟半同步複製; 之後重啟主、備庫。
3.做同步(GTID,發現半同步例子都是gtid)
change master to master_host='192.168.1.117',master_user='test1',master_password='MyPass1!',MASTER_AUTO_POSITION=1;
start slave;
4.測試
117插入一條資料
master:
mysql> show status like "%semi%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 2 |有多少個Semi-sync的備庫
| Rpl_semi_sync_master_net_avg_wait_time | 0 |事務提交後,等待備庫響應的平均時間
| Rpl_semi_sync_master_net_wait_time | 0 |等待網路響應的總次數
| Rpl_semi_sync_master_net_waits | 2 | 總的網路等待時間
| 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 | 4847 |開啟Semi-sync,事務返回需要等待的平均時間
| Rpl_semi_sync_master_tx_wait_time | 4847 |事務等待備庫響應的總時間
| Rpl_semi_sync_master_tx_waits | 1 |事務等待備庫響應的總次數
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |改變當前等待最小二進位制日誌的次數
| Rpl_semi_sync_master_wait_sessions | 0 |當前有幾個執行緒在等備庫響應
| Rpl_semi_sync_master_yes_tx | 1 |Semi-sync模式下,成功的事務數
+--------------------------------------------+-------+
14 rows in set (0.01 sec)
Rpl_semi_sync_master_clients 用於顯示有多少個從伺服器配置成了半同步模式
Rpl_semi_sync_master_status 用於指示主伺服器是使用非同步還是半同步模式,ON->半同步
Rpl_semi_sync_master_yes_tx 用於顯示從伺服器確認的成功提交數量
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
Slave1(228)
mysql> show status like "%semi%";
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
Rpl_semi_sync_slave_status 表示從伺服器的半同步複製模式已經開始工作。