1. 程式人生 > >MySQL5.7 半同步復制

MySQL5.7 半同步復制

span 日誌 提交 插件 comm 發生 master info 同步

一、概述

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 半同步復制