說到半同步複製,就得先說說複製的三種方法:html
異步複製:mysql
對於異步複製而言,Master主機將事件寫入到binlog日誌後,並不保證全部的事件都已經複製到slave主機,所以若是Master和Slave之間有網絡延遲,就會形成暫時的數據不一致的現象;若是Master出故障,而數據尚未複製過去,則會形成數據丟失;但也有好處,效率較其餘兩種複製方式高sql
半同步複製:
shell
對於半同步複製而言,Master主機將事件發送給Slave主機後會觸發一個等待,直到其中一個Slave節點(若是有多個Slave)返回數據複製成功的信息給Master,由此加強了數據的一致性,可是由於Master主機的確認開銷,會損耗一部分的性能;另外,半同步複製除了不須要等待全部Slave主機確認事件的接收外,半同步數據複製並不要求那些事件徹底地執行,所以,仍有可能看到在Slave主機上數據複製延遲的發生,若是由於網絡延遲等緣由形成Slave遲遲沒有返回複製成功的信息,超過了Master設置的超時時長(rpl_semi_sync_master_timeout),半同步複製就降級爲異步複製方式,然後繼續數據複製安全
同步複製:
服務器
對於同步複製而言,Master主機將事件發送給Slave主機後會觸發一個等待,直到全部Slave節點(若是有多個Slave)返回數據複製成功的信息給Master。這種複製方式最安全,可是同時,效率也是最差的網絡
小結:session
以上三種複製方法,沒有絕對的優劣之分,根據本身的業務效率需求和對數據一致性、安全性的要求,自行選擇異步
半同步複製插件的安裝:(筆者線上MySQL使用的是5.6.16-log版本)ide
一、首先確認是否支持動態加載插件:(半同步複製是經過MySQL提供的插件來實現的)
Master、Slave主機主機都要確認
mysql> show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
二、安裝插件:
Master主機:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.08 sec)
查看插件列表時,最後一個就是剛安裝的半同步複製插件:
mysql> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
Slave主機:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.07 sec)
mysql> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
注意:若是安裝插件時,不能安裝成功,先檢查下MySQL插件目錄下,是否有對應的插件存在
mysql> show variables like '%plugin%';
+---------------+-------------------------------+
| Variable_name | Value |
+---------------+-------------------------------+
| plugin_dir | /usr/local/mysql//lib/plugin/ |
+---------------+-------------------------------+
1 row in set (0.00 sec)
三、開啓半同步複製功能:
Master主機:
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like 'rpl_semi_sync_master_enabled';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
+------------------------------+-------+
1 row in set (0.00 sec)
查看Master錯誤日誌顯示半同步複製信息:
cat master.err
2019-05-14 15:50:50 1465 [Note] Semi-sync replication initialized for transactions.
2019-05-14 15:50:50 1465 [Note] Semi-sync replication enabled on the master.
Slave主機:
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.01 sec)
mysql> show global variables like 'rpl_semi_sync_slave_enabled';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)
注意:
爲了防止這些動態的半同步複製參數在服務器重啓後失效,須要寫入到配置文件中,使其永久生效:
Master主機配置:
[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
Slave主機配置:
[mysqld]
rpl_semi_sync_slave_enabled = 1
四、在Master主機經過MySQL狀態變量來監控半同步複製狀況
mysql> show global status like 'rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 4803 |
| Rpl_semi_sync_master_net_wait_time | 4803 |
| 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 | 1975 |
| Rpl_semi_sync_master_tx_wait_time | 1975 |
| 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 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
參數含義,具體參考MySQL官網
注意:
若是你配置好了半同步,在Master變動了數據,Slave也可以正常的同步數據,可是在監控半同步複製狀況時,發現Rpl_semi_sync_master_status值爲OFF,但rpl_semi_sync_master_enabled爲ON,說明以前依然是採用的異步複製方式,此時須要重啓Slave,才能使用半同步複製方式生效
查看半同步複製相關的系統變量:
mysql> show global variables like 'rpl_semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 | Master提交事件後,等待Slave的確認信息超時後,切換到異步複製模式的時間
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
4 rows in set (0.00 sec)
參數含義,具體參考MySQL官網
半同步數據複製能夠在等待確認超時發生的時候降級爲異步複製:
一、在Slave上模擬網絡出現了問題
ifdown eth0(網絡關掉後,第三方客戶端,如:Xshell等會斷)
2.1在Maser上更新一條數據:
mysql> update edusoho_e.t1 set xname='MySQL' where id=39;
Query OK, 1 row affected (10.04 sec) 由於Master須要等待Slave的確認信息,因此須要10s,這也說明半同步複製是成功的
Rows matched: 1 Changed: 1 Warnings: 0
2.2查看Master錯誤日誌,能夠看到半同步複製已經降級了(不過數據仍是可以複製到Slave的)
cat master.err
2019-05-14 15:59:39 1465 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000004, pos: 2860), semi-sync up to file mysql-bin.000004, position 2606.
2019-05-14 15:59:39 1465 [Note] Semi-sync replication switched OFF
記得將Slave的網卡開啓
ifup eth0
卸載半同步複製插件:
若是再也不須要半同步複製方式,能夠將半同步複製插件卸載掉:
mysql> uninstall plugin rpl_semi_sync_master; (Slave主機是rpl_semi_sync_slave)