本文問題
- 半同步復(fù)制的過程是怎樣的?
- 半同步復(fù)制功能是通過什么執(zhí)行的?
- 如何啟用半同步復(fù)制?
- 啟用半同步復(fù)制有什么要求和條件?
- 半同步復(fù)制在什么情況下會恢復(fù)為異步復(fù)制?
- 在主庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
- 在從庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
- 在使用半同步復(fù)制時,主庫上的事務(wù)在什么時點進(jìn)行提交?可以通過哪個選項修改提交時點?
- 如何查看半同步復(fù)制的配置?
- 如何查看半同步復(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。
問題答案
- 半同步復(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)。 - 半同步復(fù)制功能是通過什么執(zhí)行的?
通過半同步復(fù)制插件,主庫插件semisync_master.so,從庫插件semisync_slave.so - 如何啟用半同步復(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;
- 啟用半同步復(fù)制有什么要求和條件?
- 數(shù)據(jù)庫可以動態(tài)加載插件
have_dynamic_loading=YES - 復(fù)制已經(jīng)在正常運行
- 沒有配置多通道復(fù)制,半同步復(fù)制只對默認(rèn)復(fù)制通道有效
- 數(shù)據(jù)庫可以動態(tài)加載插件
- 半同步復(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ù)制 - 在主庫上可以進(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) - 在從庫上可以進(jìn)行哪些半同步復(fù)制相關(guān)的配置?
rpl_semi_sync_slave_enabled是否啟用半同步復(fù)制
rpl_semi_sync_slave_trace_level半同步復(fù)制調(diào)試跟蹤級別 - 在使用半同步復(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ù)。 - 如何查看半同步復(fù)制的配置?
SHOW VARIABLES LIKE 'rpl_semi_sync%';; - 如何查看半同步復(fù)制的狀態(tài)?
SHOW STATUS LIKE 'rpl_semi_sync%';