半同步複製html
默認配置下,MYSQL主從庫經過binlog來保持一致,主庫事務提交後,將binlog日誌寫入磁盤,而後返回給用戶,備庫經過拉取主庫的binlog來同步主庫的操做,沒法保證主備節點數據實時一致,只能保證最終一致,所以屬於異步複製。服務器
爲保證在主備切換時,主備節點數據徹底一致,MYSQL提供了半同步複製,其實現原理爲:事務在主庫上執行完成,生成BINLOG並推送給備庫,等待備庫的影響消息,備庫將接受到的binlog(file,pos)信息返回給主庫,主庫接收到背庫的確認消息後,在返回給用戶,事務提交完成。session
半同步複製只保證主庫和備庫的binlog同步,但主庫無需等待備庫應用這些binglog就會返回提交結果,從庫異步地應用這些binlog,所以主庫和從庫的數據不是實時同步的,所以稱爲「半同步」。架構
半同步複製參數rpl_semi_sync_master_timeout用於控制主庫等待備庫響應的消息時間(單位ms),若是超過該閥值,則認爲備庫存在問題,將半同步複製修改成異步複製,避免主庫的執行事務長時間等待。參數rpl_semi_sync_master_timeout的默認值爲50ms。
rpl_semi_sync_master_enabled:表示主上是否開啓半同步複製功能,能夠動態修改。可選值:ON\OFF
rpl_semi_sync_slave_enabled:表示從上是否開啓半同步複製功能,能夠動態修改。可選值:ON\OFF異步
半同步複製要求執行的每個事務,都至少有一個備庫成功接收後,才返回給用戶,在主庫實例上,有一個專門的線程(ack_receiver)接收備庫的響應消息,並以通知機制告知備庫已經接收日誌。在半同步複製模式下,默認Master發送事務默認至少須要一個Slave的響應才能繼續下一個事務,在MySQL5.7版本中引入參數rpl_semi_sync_master_wait_for_slave_count來設置須要應答的Slave的數量,默認值爲1。在一主多從的架構下,能夠增大rpl_semi_sync_master_wait_for_slave_count的值來保證多個從庫均包含最新事務,但增長rpl_semi_sync_master_wait_for_slave_count的值會增長主庫等待接受從庫響應的時間。async
半同步複製通訊模式函數
MySQL 5.5和MySQL5.6的半同步複製使單工通訊方式,master發送事務的Binlog後,須要接收和處理Slave的應答後纔會繼續發送下一個事務:spa
而MySQL 5.7的半同步複製建立單獨的應答接收線程,造成雙工模式,發送和接收互不影響,所以提示發送效率,下降半同步的延遲。插件
PS: MySQL5.7單獨的應答接收線程在開啓半同步複製的時候默認建立,無需額外設置。線程
AFTER_COMMIT與AFTER_SYNC
在MySQL 5.5中引入半同步複製,默認使用AFTER_COMMIT方式,由於主庫上事務在提交後才發送給從庫,所以存在主庫宕機致使事務丟失的狀況。
AFTER_COMMIT操做順序:
AFTER_COMMIT: 1>將事務寫入binlog和備庫 2>將binlog刷新到磁盤 3>提交事務,等待備庫返回確認信息 4>接收到備庫確認信息 5>返回結果給客戶端
在MySQL 5.7版本對半同步複製作了改進,增長了AFTER_SYNC方式,並默認使用AFTER_SYNC方式。
AFTER_SYNC操做順序:
1>將事務寫入binlog和備庫 2>將binlog刷新到磁盤 3>等待備庫返回確認信息 4>接收到備庫確認信息,提交事務 5>返回結果給客戶端
AFTER_COMMIT和AFTER_SYNC對比
二者區別在於: AFTER_COMMIT:在接收到備庫確認信息前將事務提交 AFTER_SYNC:在接收到備庫確認信息後將事務提交 形成影響: 對於AFTER_SYNC,全部客戶端能夠在同一時間看到事務被提交; 對於AFTER_COMMIT,因爲事務提交後還須要等待備庫的確認信息,在提交事務的客戶端等待的這段時間內,其餘客戶端已經能夠看到事務提交,並能訪問到被提交的數據。 主庫發生宕機時: 對於AFTER_SYNC,全部在主庫上提交的事務都已複製到備庫,所以備庫數據是實時的,主備切換不丟失數據。 對於AFTER_COMMIT,不能保證全部主庫上提交的事務都已複製到備庫,存在數據丟失風險。 假設主庫執行事務A操做新增一條數據並提交,事務A產生的BINLOG傳遞給從庫並等待從庫返回ACK,此時主庫宕機並主從自動故障切換: 場景1:從庫未收到事務A的BINLOG,主從切換後新主庫上事務A的數據丟失 一、在AFTER_COMMIT模式下,主從切換前因爲"事務已提交"應用其餘線程讀取到事務A新增記錄,主從切換後對新增記錄進行更新,更新失敗業務異常。 二、在AFTER_SYNC模式下,主從切換前因爲"事務未提交"應用其餘線程沒法讀取到事務A新增記錄,主從切換先後不存在」幻讀「狀況。 場景2:從庫收到事務A的BINLOG,主從切換後新主庫含有事務A的新增數據 一、在AFTER_COMMIT模式下,執行事務A的操做未收到事務提交成功消息,判斷插入操做失敗重試,操做自動切換後的新主庫,致使數據重複業務異常。 二、在AFTER_SYNC模式下,執行事務A的操做未收到事務提交成功消息,判斷插入操做失敗重試,操做自動切換後的新主庫,致使數據重複業務異常。
啓用半同步複製
## 查看MYSQL服務器是否支持動態插件 SELECT @@have_dynamic_loading; +------------------------+ | @@have_dynamic_loading | +------------------------+ | YES | +------------------------+ ##在主庫和從庫上安裝PLUGIN,執行: INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##在主庫和從庫上啓用半同步複製,並設置等待時長爲1000ms,執行: SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout = 1000; SET GLOBAL rpl_semi_sync_slave_enabled = 1; ##在從庫上重啓IO_THREAD,執行: STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
PS1: 理論上只須要在從庫和主庫分別啓用就好,但爲故障切換時操做方便,能夠在主從庫上都啓用。
PS2: 在設置半同步參數後,須要重啓複製才能生效。
半同步複製相關參數
##============================================================ ##查看半同步複製的狀態和參數: 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 | +-------------------------------------------+------------+ rpl_semi_sync_master_wait_no_slave:
是否容許master 每一個事物提交後都要等待slave的receipt信號。
默認爲on,每個事務都會等待,若是slave當掉後,當slave追遇上master的日誌時,能夠自動的切換爲半同步方式。
若是爲off,則slave追遇上後,也不會採用半同步的方式複製了,須要手工配置。
rpl_semi_sync_master_enabled:主庫是否啓用半同步。
rpl_semi_sync_slave_enabled:從庫是否啓用半同步。
rpl_semi_sync_master_timeout:主庫等待半同步複製信息返回的超時間隔,默認10秒(單位毫秒)。
rpl_semi_sync_master_trace_level:監控等級
1 = general level (for example, time function failures)
16 = detail level (more verbose information)
32 = net wait level (more information about network waits)
64 = function level (information about function entry and exit)
rpl_semi_sync_master_wait_for_slave_count: 主庫等待確認消息的從庫數量。
rpl_semi_sync_master_wait_point:半同步複製方式,AFTER_SYNC或AFTER_COMMIT。
半同步複製相關參數
##============================================================ ##查看半同步複製的狀態 SHOW STATUS LIKE 'rpl_semi_sync%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 1 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 1336 | | Rpl_semi_sync_master_tx_wait_time | 1336 | | 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 | +--------------------------------------------+-------+ Rpl_semi_sync_master_clients:當前有多少個從庫被設置爲半同步模式。 Rpl_semi_sync_master_net_avg_wait_time:等待從庫返回去確認消息的平均時間(單位:ms) Rpl_semi_sync_master_net_wait_time:等到從庫返回確認消息的總時間(單位:ms) Rpl_semi_sync_master_net_waits:等待從庫返回確認消息的總次數 Rpl_semi_sync_master_no_tx:事務沒有獲得從庫返回確認消息就提交的次數,The number of commits that were not acknowledged successfully by a slave. Rpl_semi_sync_master_timefunc_failures:調用函數gettimeofday()失敗的次數,The number of times the master failed when calling time functions such as gettimeofday(). Rpl_semi_sync_master_tx_avg_wait_time:主庫上平均每一個事務等待時長,The average time in microseconds the master waited for each transaction. Rpl_semi_sync_master_tx_wait_time:主庫上事務等待的總時長,The total time in microseconds the master waited for transactions. Rpl_semi_sync_master_tx_waits:主庫上事務等待的次數,The total number of times the master waited for transactions. Rpl_semi_sync_master_wait_pos_backtraverse:改變當前等待最小二進制日誌的次數,The total number of times the master waited for an event with binary coordinates lower than events waited for previously. This can occur when the order in which transactions start waiting for a reply is different from the order in which their binary log events are written. Rpl_semi_sync_master_wait_sessions:當前等待從庫返回確認消息的回話數,The number of sessions currently waiting for slave replies. Rpl_semi_sync_master_yes_tx:獲得從庫返回消息的事務數,The number of commits that were acknowledged successfully by a slave. 當半同步複製開啓後,Rpl_semi_sync_master_status 變量用動態地顯示半同步複製的狀態。 Rpl_semi_sync_master_status設置爲OFF,代表當前處於異步複製下,當等待從庫返回確認消息時間超過rpl_semi_sync_master_timeout值後修改成OFF.;Rpl_semi_sync_master_status設置爲ON,代表當前處於半同步複製下。當從庫追遇上主庫後修改成ON, If a timeout occurs without any slave having acknowledged the transaction, the master reverts to asynchronous replication. When at least one semisynchronous slave catches up, the master returns to semisynchronous replication.
參考連接:
https://www.jianshu.com/p/3bfb0bfb8b34
http://www.cnblogs.com/zhoujinyi/p/5704567.html