1. 程式人生 > >MySQL5.7半同步複製

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)

  1. 配置(建議一定這樣做)

--主節點配置增加以下

[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 表示從伺服器的半同步複製模式已經開始工作。