MySQL5.7 半同步復制
一、概述
5.5與5.7的半同步復制可能存在差異,從MySQL5.5開始,MySQL以插件的形式支持半同步復制
異步:默認情況下,MySQL復制是異步的。主庫在執行完客戶端提交的事務後會立即將結果返給給客戶端,並不關心從庫是否已經接收並處理。此時若是主若是崩潰了,那提交完成的事務可能並沒有傳到從上,從而導致數據不一致。
全同步:當主庫執行完接受到的事務,會等待所有從機執行此事務的返回值,當收到所有從機的返回值時才會返回給客戶端。所以對性能的影響嚴重。
半同步:介於以上兩者之間,主庫在執行完客戶端的事務後,會等待至少一個從機接收到並寫入relay log中才會返回給客戶端。它提高了數據的安全性, 也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。
relay log中繼日誌:在salve中IO線程會拉去master的二進制到relay log中,然後SQL線程會讀取relay-log日誌的內容並應用到從服務器。
兩個插件實現半同步功能。主端有一個插件,從端有一個插件。
半同步復制必須在主和從都有啟用,否則使用異步復制。
只有事件寫入中繼日誌並且刷新到磁盤後,從設備才會確認收到事務的事件。
如果無任何從服務器確認事務的情況下發生超時,主服務器將恢復異步復制。當至少一個半同步叢機趕上,主機將返回到半同步復制。
After_commit(5.6缺省值)
Master將事務寫進binlog日誌中,傳遞到slave刷新到relay_log,同時master提交事務。Master等待slave反饋寫入了relay log,只有收到sck包後master才會將commit ok結果反饋給客戶端
After_sync(5.7缺省值)
master將事務寫進binlog中,傳到slave刷新到磁盤relay log。Master等待slave收到ack包之後,再提交事務並且返回commit ok結果給客戶端,這樣即使主庫宕機了,也可以保證所有主庫上的書屋都已經同步到了slave的relay log上去。
二、半同步復制配置
1.)安裝相關插件
master: --安裝 semisync_master.so插件
mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
slave: --安裝 semisync_slave.so插件
mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
查看是否安裝插件:
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE ‘%semi%‘;
+------------------------------+-------------------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------------+-------------------------+
| rpl_semi_sync_master | ACTIVE |
+------------------------------+------------------------ +
2.默認情況下它是禁用的。主端和從端都必須啟用插件才能啟用半同步復制
開啟方式:
1.)更改變量:
master:
SET GLOBAL rpl_semi_sync_master_enabled = {0|1}; #1來啟用半同步復制,0來禁用它
SET GLOBAL rpl_semi_sync_master_timeout = N; #該值N以毫秒為單位給出。默認值是10000(10秒)
slave:
SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};
2.)修改配置文件:
[mysqld]
rpl_semi_sync_master_enabled = 1
...
......
如果是在運行的的從站上啟用半同步復制,則需要重啟I/O線程,使從站重新連接主並註冊為半同步叢站。
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
3.監控半同步復制
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%‘;
+-------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------+------------+ | rpl_semi_sync_master_enabled | ON | | rpl_semi_sync_master_timeout | 1000 | | 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)
mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%‘;
+--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | 有多少個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 | 7 | 總的網絡等待時間 | 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 | 410 | 開啟Semi-sync,事務返回需要等待的平均時間 | Rpl_semi_sync_master_tx_wait_time | 2876 | 事務等待備庫響應的總時間 | Rpl_semi_sync_master_tx_waits | 7 | 事務等待備庫響應的總次數 | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | 改變當前等待最小二進制日誌的次數 | Rpl_semi_sync_master_wait_sessions | 0 | 當前有幾個線程在等備庫響應 | Rpl_semi_sync_master_yes_tx | 7 | Semi-sync模式下,成功的事務數 +--------------------------------------------+-------+ 15 rows in set (0.00 sec)
MySQL5.7 半同步復制