MySQL半同步復(fù)制

本文問題

  1. 半同步復(fù)制的過程是怎樣的?
  2. 半同步復(fù)制功能是通過什么執(zhí)行的?
  3. 如何啟用半同步復(fù)制?
  4. 啟用半同步復(fù)制有什么要求和條件?
  5. 半同步復(fù)制在什么情況下會恢復(fù)為異步復(fù)制?
  6. 在主庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
  7. 在從庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
  8. 在使用半同步復(fù)制時,主庫上的事務(wù)在什么時點進(jìn)行提交?可以通過哪個選項修改提交時點?
  9. 如何查看半同步復(fù)制的配置?
  10. 如何查看半同步復(fù)制的狀態(tài)?

半同步復(fù)制

默認(rèn)情況下,MySQL復(fù)制是異步的,主庫將事件寫入到二進(jìn)制日志,從庫獲取主庫的二進(jìn)制日志并進(jìn)行應(yīng)用。主庫不知道從庫從庫什么時候獲取和應(yīng)用二進(jìn)制日志。
當(dāng)使用異步復(fù)制時,如果主庫崩潰,可能主庫上已經(jīng)提交的事務(wù)沒有在從庫上提交,這時故障轉(zhuǎn)移到從庫可能導(dǎo)致數(shù)據(jù)丟失。

可以使用半同步復(fù)制來替代異步復(fù)制:

  • 從庫在連接主庫時說明是否支持半同步復(fù)制功能
  • 如果主庫啟用了半同步復(fù)制,并且至少有一個半同步的從庫,則在主庫上提交事務(wù)的線程將阻塞,等待直到至少一個從庫確認(rèn)已接收到該事務(wù)的所有事件,或者直到超時。
  • 從庫在將事件寫入到中繼日志并且刷新到磁盤后,確認(rèn)接收到事務(wù)。
  • 如果沒有任何從庫確認(rèn)收到事務(wù)并且發(fā)生超時,主庫恢復(fù)為異步復(fù)制。當(dāng)至少一個半同步從庫追上主庫后,主庫返回到半同步復(fù)制
  • 半同步復(fù)制必須在主庫和從庫上同時啟用。如果在主庫上禁用半同步復(fù)制,或者在主庫上啟用半同步復(fù)制但是從庫未啟用半同步復(fù)制,主庫使用異步復(fù)制。

當(dāng)主庫阻塞(等待從庫確認(rèn))時,執(zhí)行事務(wù)的會話不會返回。當(dāng)阻塞結(jié)束后,會話返回,然后可以繼續(xù)執(zhí)行其他語句。在這一時刻,事務(wù)已經(jīng)在主庫上提交,并且至少一個從庫已經(jīng)確認(rèn)接收到事務(wù)。

半同步復(fù)制的安裝和配置

半同步復(fù)制的安裝

安裝要求

  • 數(shù)據(jù)庫支持動態(tài)加載插件(have_dynamic_loading=YES
  • 復(fù)制已經(jīng)在正常運行。
  • 不能配置多通道復(fù)制,半同步復(fù)制只支持默認(rèn)通道。

安裝半同步復(fù)制插件

主庫安裝半同步復(fù)制插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

從庫安裝半同步復(fù)制插件

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

啟用半同步復(fù)制插件

主庫啟用半同步復(fù)制插件

[mysqld]
rpl_semi_sync_master_enabled=1
#或
SET GLOBAL rpl_semi_sync_master_enabled = 1;

從庫啟用半同步復(fù)制插件

[mysqld]
rpl_semi_sync_slave_enabled=1
#或
SET GLOBAL rpl_semi_sync_slave_enabled = 1

啟動從庫I/O線程

# 如果復(fù)制已經(jīng)在運行,還需要停止后重新啟動I/O線程來使用半同步復(fù)制
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

半同步復(fù)制的配置

所有半同步復(fù)制相關(guān)的配置都是在安裝插件后才可用的,都可以動態(tài)修改。

主庫配置

  • rpl_semi_sync_master_enabled 主庫是否啟用半同步復(fù)制 默認(rèn)OFF
  • rpl_semi_sync_master_timeout 半同步復(fù)制的超時時間 默認(rèn)10000(10s)
  • rpl_semi_sync_master_trace_level 主庫半同步復(fù)制跟蹤級別 默認(rèn)32
    • 1 常規(guī)級別(功能故障時間)
    • 16 詳細(xì)級別 (更多詳細(xì)信息)
    • 32 網(wǎng)絡(luò)等待級別 (更多關(guān)于網(wǎng)絡(luò)等待的信息)
    • 64 功能級別 (有關(guān)功能進(jìn)入和退出的信息)
  • rpl_semi_sync_master_wait_for_slave_count 默認(rèn)1 主庫必須獲取到多少個從庫的事務(wù)確認(rèn)
  • rpl_semi_sync_master_wait_no_slave 默認(rèn)ON 當(dāng)從庫確認(rèn)數(shù)少于應(yīng)確認(rèn)數(shù)量時,是否等待超時。
    • ON 當(dāng)從庫確認(rèn)數(shù)小于rpl_semi_sync_master_wait_for_slave_count,并且超出rpl_semi_sync_master_timeout后主庫才恢復(fù)到異步復(fù)制。
    • OFF 當(dāng)從庫確認(rèn)數(shù)小于rpl_semi_sync_master_wait_for_slave_count后,主庫會恢復(fù)到異步復(fù)制
  • rpl_semi_sync_master_wait_point 主庫等待從庫確認(rèn)事務(wù)的時機。
    • AFTER_SYNC 主庫將事務(wù)寫入到主庫自己的二進(jìn)制日志和從庫上,并且刷新日志到磁盤。主庫等待從庫確認(rèn)收到事務(wù)。收到確認(rèn)后,主庫提交事務(wù)并給客戶端返回結(jié)果。
      連接主庫的所有客戶端可以同時看到已提交的事務(wù)。如果主庫發(fā)生故障,在主庫上提交的事務(wù)都復(fù)制到從庫上,從主庫到從庫的故障轉(zhuǎn)移是無損的。但是主庫的二進(jìn)制日志從可能包含未提交的事務(wù),不能直接使用。
    • AFTER_COMMIT 主庫將事務(wù)寫入到主庫自己的二進(jìn)制日志和從庫上,刷新日志到磁盤,然后提交事務(wù)。主庫等待從庫確認(rèn)收到事務(wù),收到確認(rèn)后,主庫將結(jié)果返回客戶端。
      連接主庫的客戶端中,執(zhí)行事務(wù)的客戶端在從庫確認(rèn)前不能看到事務(wù)提交,但是其他客戶端可以看到該事務(wù)已經(jīng)提交。如果出現(xiàn)問題,從庫還沒有處理事務(wù)。當(dāng)故障轉(zhuǎn)移到從庫時,可能會看不到主庫上關(guān)于該事務(wù)的數(shù)據(jù)。

從庫配置

  • rpl_semi_sync_slave_enabled 從庫是否啟用半同步復(fù)制 默認(rèn)OFF
  • rpl_semi_sync_slave_trace_level 從庫半同步復(fù)制調(diào)試跟蹤級別

查看半同步復(fù)制狀態(tài)

檢查半同步復(fù)制插件是否安裝

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
+----------------------+---------------+

檢查如何配置的半同步復(fù)制

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

檢查半同步復(fù)制狀態(tài)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

主庫半同步復(fù)制狀態(tài)

  • Rpl_semi_sync_master_clients
    半同步從庫數(shù)量。
  • Rpl_semi_sync_master_net_avg_wait_time
    主庫等待從庫應(yīng)答的平均時間(以微秒為單位)。不建議使用此變量(始終為0),并將在以后的版本中將其刪除。
  • Rpl_semi_sync_master_net_wait_time
    主服務(wù)器等待從屬??服務(wù)器答復(fù)的總時間(以微秒為單位)。不建議使用此變量(始終為0),并將在以后的版本中將其刪除。
  • Rpl_semi_sync_master_net_waits
    主庫等待從庫答復(fù)的總次數(shù)。
  • Rpl_semi_sync_master_no_times
    主庫關(guān)閉半同步復(fù)制的時間。
  • Rpl_semi_sync_master_no_tx
    從庫未成功確認(rèn)的提交數(shù)。
  • Rpl_semi_sync_master_status
    半同步復(fù)制當(dāng)前是否在主庫上運行。
    ON 已啟用插件并且已發(fā)生提交確認(rèn)。
    OFF未啟用插件或主庫由于提交確認(rèn)超時已經(jīng)恢復(fù)為異步復(fù)制。
  • Rpl_semi_sync_master_timefunc_failures
    調(diào)用時間功能(例如gettimeofday())時主庫發(fā)生故障的時間。
  • Rpl_semi_sync_master_tx_avg_wait_time
    主庫等待每個事務(wù)的平均時間(以微秒為單位)。
  • Rpl_semi_sync_master_tx_wait_time
    主庫等待事務(wù)的總時間(以微秒為單位)。
  • Rpl_semi_sync_master_tx_waits
    主庫等待事務(wù)的總次數(shù)。
  • Rpl_semi_sync_master_wait_pos_backtraverse
    主節(jié)點等待事件的二進(jìn)制坐標(biāo)比以前等待的事件低的總次數(shù)。當(dāng)事務(wù)開始等待答復(fù)的順序與寫入其二進(jìn)制日志事件的順序不同時,可能會發(fā)生這種情況。
  • Rpl_semi_sync_master_wait_sessions
    當(dāng)前等待從庫答復(fù)的會話數(shù)。
  • Rpl_semi_sync_master_yes_tx
    從庫成功確認(rèn)的提交數(shù)。

從庫半同步復(fù)制狀態(tài)

  • Rpl_semi_sync_slave_status
    半同步復(fù)制當(dāng)前是否在從屬服務(wù)器上運行。如果已啟用插件并且從屬I / O線程正在運行則為ON, 否則為OFF。

問題答案

  1. 半同步復(fù)制的過程是怎樣的?
    從庫在連接主庫時(啟用I/O線程時)檢測是否使用半同步復(fù)制。
    使用半同步復(fù)制:
    主庫將事務(wù)寫入到二進(jìn)制日志并刷新到磁盤,根據(jù)rpl_semi_sync_master_wait_point的配置,等待至少N個從庫確認(rèn)事務(wù)后提交事務(wù)并返回給客戶端(AFTER_SYNC),或者提交事務(wù)后等待至少N個從庫確認(rèn)事務(wù),然后返回給客戶端(AFTER_COMMIT)
    N可以通過rpl_semi_sync_master_wait_for_slave_count進(jìn)行設(shè)置,默認(rèn)為1.
    從庫在將事務(wù)寫入到中繼日志并且刷新到磁盤后確認(rèn)事務(wù)
    如果確認(rèn)事務(wù)的從庫數(shù)量小于N,根據(jù)rpl_semi_sync_master_wait_no_slave的配置來檢查是否等待超時,如果值為ON,則在等待rpl_semi_sync_master_timeout時間后,主庫恢復(fù)為異步復(fù)制,如果值為OFF,主庫直接恢復(fù)為異步復(fù)制。
    當(dāng)從庫追上主庫的進(jìn)度后,主庫返回半同步復(fù)制狀態(tài)。
  2. 半同步復(fù)制功能是通過什么執(zhí)行的?
    通過半同步復(fù)制插件,主庫插件semisync_master.so,從庫插件semisync_slave.so
  3. 如何啟用半同步復(fù)制?
    安裝半同步復(fù)制插件
# 主庫
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
# 從庫
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'

啟用半同步復(fù)制功能

# 主庫
SET GLOBAL repl_semi_sync_master_enabled = 1
# 從庫
SET GLOBAL repl_semi_sync_slave_enabled =1

啟用從庫的I/O線程

# STOP SLAVE IO_THREAD; #如果I/O線程已啟用要先停止
START SLAVE IO_THREAD;
  1. 啟用半同步復(fù)制有什么要求和條件?
    • 數(shù)據(jù)庫可以動態(tài)加載插件have_dynamic_loading=YES
    • 復(fù)制已經(jīng)在正常運行
    • 沒有配置多通道復(fù)制,半同步復(fù)制只對默認(rèn)復(fù)制通道有效
  2. 半同步復(fù)制在什么情況下會恢復(fù)為異步復(fù)制?
    根據(jù)rpl_semi_sync_wait_no_slave的配置:
    值為ON時:等待從庫確認(rèn)時間大于rpl_semi_sync_master_timeout后恢復(fù)為異步復(fù)制
    值為OFF時,從庫確認(rèn)數(shù)小于rpl_semi_sync_master_wait_for_slave_count后恢復(fù)為異步復(fù)制
  3. 在主庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
    rpl_semi_sync_master_enabled 是否啟用半同步復(fù)制
    rpl_semi_sync_master_timeout 半同步復(fù)制超時時間
    rpl_semi_sync_master_wait_for_slave_count 需要確認(rèn)事務(wù)的從庫數(shù)量
    rpl_semi_sync_master_wait_no_slave 是否等待從庫確認(rèn)超時
    rpl_semi_sync_master_wait_point 等待從庫確認(rèn)事務(wù)的時點
    rpl_semi_sync_master_trace_level 半同步復(fù)制調(diào)試跟蹤狀態(tài)
  4. 在從庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
    rpl_semi_sync_slave_enabled 是否啟用半同步復(fù)制
    rpl_semi_sync_slave_trace_level 半同步復(fù)制調(diào)試跟蹤級別
  5. 在使用半同步復(fù)制時,主庫上的事務(wù)在什么時點進(jìn)行提交?可以通過哪個選項修改提交時點?
    默認(rèn)主庫上的事務(wù)在寫入二進(jìn)制日志并刷新到磁盤后,等待從庫確認(rèn)事務(wù),然后提交并返回客戶端.
    可以通過rpl_semi_sync_master_wait_point進(jìn)行更改,默認(rèn)值為AFTER_SYNC。
    可以更改為AFTER_COMMIT:主庫上的事務(wù)寫入到二進(jìn)制日志并刷新到磁盤后就提交事務(wù),然后等待從庫確認(rèn)事務(wù),再將結(jié)果返回到客戶端。這種情況下,其他連接可以看到提交后的事務(wù)。
  6. 如何查看半同步復(fù)制的配置?
    SHOW VARIABLES LIKE 'rpl_semi_sync%';;
  7. 如何查看半同步復(fù)制的狀態(tài)?
    SHOW STATUS LIKE 'rpl_semi_sync%';
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容