本文問題
- 半同步的過程是怎樣的?
- 半同步功能是通過什麼執行的?
- 如何啟用半同步?
- 啟用半同步有什麼要求和條件?
- 半同步在什麼情況下會恢複為異步主從同步?
- 在主庫上可以進行哪些半同步相關的配置?
- 在從庫上可以進行哪些半同步相關的配置?
- 在使用半同步時,主庫上的事務在什麼時點進行送出?可以通過哪個選項修改送出時點?
- 如何檢視半同步的配置?
- 如何檢視半同步的狀态?
半同步主從同步
預設情況下,MySQL主從同步是異步的,主庫将事件寫入到二進制日志,從庫擷取主庫的二進制日志并進行應用。主庫不知道從庫什麼時候擷取和應用二進制日志。
當使用異步主從同步時,如果主庫崩潰,可能主庫上已經送出的事務沒有在從庫上送出,這時故障轉移到從庫可能導緻資料丢失。
可以使用半同步來替代異步主從同步:
- 從庫在連接配接主庫時說明是否支援半同步主從同步功能
- 如果主庫啟用了半同步主從同步,并且至少有一個半同步的從庫,則在主庫上送出事務的線程将阻塞,等待直到至少一個從庫确認已接收到該事務的所有事件,或者直到逾時。
- 從庫在将事件寫入到中繼日志并且重新整理到磁盤後,确認接收到事務。
- 如果沒有任何從庫确認收到事務并且發生逾時,主庫恢複為異步主從同步。當至少一個半同步從庫追上主庫後,主庫傳回到半同步主從同步
- 半同步主從同步必須在主庫和從庫上同時啟用。如果在主庫上禁用半同步主從同步,或者在主庫上啟用半同步主從同步但是從庫未啟用半同步主從同步,主庫使用異步主從同步。
當主庫阻塞(等待從庫确認)時,執行事務的會話不會傳回。當阻塞結束後,會話傳回,然後可以繼續執行其他語句。在這一時刻,事務已經在主庫上送出,并且至少一個從庫已經确認接收到事務。
半同步的安裝和配置
半同步的安裝
安裝要求
- 資料庫支援動态加載插件(
)have_dynamic_loading=YES
- 主從同步已經在正常運作。
- 不能配置多通道主從同步,半同步隻支援預設通道。
安裝半同步插件
主庫安裝半同步插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
從庫安裝半同步插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
啟用半同步插件
主庫啟用半同步插件
[mysqld]
rpl_semi_sync_master_enabled=1
#或
SET GLOBAL rpl_semi_sync_master_enabled = 1;
從庫啟用半同步插件
[mysqld]
rpl_semi_sync_slave_enabled=1
#或
SET GLOBAL rpl_semi_sync_slave_enabled = 1
啟動從庫I/O線程
# 如果主從同步已經在運作,還需要停止後重新啟動I/O線程來使用半同步
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
半同步的配置
所有半同步相關的配置都是在安裝插件後才可用的,都可以動态修改。
主庫配置
-
主庫是否啟用半同步步 預設rpl_semi_sync_master_enabled
OFF
-
半同步的逾時時間 預設rpl_semi_sync_master_timeout
10000(10s)
-
主庫半同步跟蹤級别 預設rpl_semi_sync_master_trace_level
32
-
正常級别(功能故障時間)1
-
詳細級别 (更多詳細資訊)16
-
網絡等待級别 (更多關于網絡等待的資訊)32
-
功能級别 (有關功能進入和退出的資訊)64
-
-
預設rpl_semi_sync_master_wait_for_slave_count
主庫必須擷取到多少個從庫的事務确認1
-
預設rpl_semi_sync_master_wait_no_slave
當從庫确認數少于應确認數量時,是否等待逾時。ON
-
當從庫确認數小于ON
,并且超出rpl_semi_sync_master_wait_for_slave_count
後主庫才恢複到異步主從同步。rpl_semi_sync_master_timeout
-
當從庫确認數小于OFF
後,主庫會恢複到異步主從同步rpl_semi_sync_master_wait_for_slave_count
-
-
主庫等待從庫确認事務的時機。rpl_semi_sync_master_wait_point
-
AFTER_SYNC
主庫将事務寫入到主庫自己的二進制日志和從庫上,并且重新整理日志到磁盤。主庫等待從庫确認收到事務。收到确認後,主庫送出事務并給用戶端傳回結果。
連接配接主庫的所有用戶端可以同時看到已送出的事務。如果主庫發生故障,在主庫上送出的事務都主從同步到從庫上,從主庫到從庫的故障轉移是無損的。但是主庫的二進制日志從可能包含未送出的事務,不能直接使用。
-
AFTER_COMMIT
主庫将事務寫入到主庫自己的二進制日志和從庫上,重新整理日志到磁盤,然後送出事務。主庫等待從庫确認收到事務,收到确認後,主庫将結果傳回用戶端。
連接配接主庫的用戶端中,執行事務的用戶端在從庫确認前不能看到事務送出,但是其他用戶端可以看到該事務已經送出。如果出現問題,從庫還沒有處理事務。當故障轉移到從庫時,可能會看不到主庫上關于該事務的資料。
-
從庫配置
-
從庫是否啟用半同步 預設rpl_semi_sync_slave_enabled
OFF
-
從庫半同步調試跟蹤級别rpl_semi_sync_slave_trace_level
檢視半同步狀态
檢查半同步插件是否安裝
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
檢查如何配置的半同步步
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
檢查半同步步狀态
主庫半同步狀态
-
半同步從庫數量。Rpl_semi_sync_master_clients
-
主庫等待從庫應答的平均時間(以微秒為機關)。不建議使用此變量(始終為0),并将在以後的版本中将其删除。Rpl_semi_sync_master_net_avg_wait_time
-
主伺服器等待從屬伺服器答複的總時間(以微秒為機關)。不建議使用此變量(始終為0),并将在以後的版本中将其删除。Rpl_semi_sync_master_net_wait_time
-
主庫等待從庫答複的總次數。Rpl_semi_sync_master_net_waits
-
主庫關閉半同步主從同步的時間。Rpl_semi_sync_master_no_times
-
從庫未成功确認的送出數。Rpl_semi_sync_master_no_tx
-
半同步主從同步目前是否在主庫上運作。Rpl_semi_sync_master_status
已啟用插件并且已發生送出确認。ON
未啟用插件或主庫由于送出确認逾時已經恢複為異步主從同步。OFF
-
調用時間功能(例如Rpl_semi_sync_master_timefunc_failures
)時主庫發生故障的時間。gettimeofday()
-
主庫等待每個事務的平均時間(以微秒為機關)。Rpl_semi_sync_master_tx_avg_wait_time
-
主庫等待事務的總時間(以微秒為機關)。Rpl_semi_sync_master_tx_wait_time
-
主庫等待事務的總次數。Rpl_semi_sync_master_tx_waits
-
主節點等待事件的二進制坐标比以前等待的事件低的總次數。當事務開始等待答複的順序與寫入其二進制日志事件的順序不同時,可能會發生這種情況。Rpl_semi_sync_master_wait_pos_backtraverse
-
目前等待從庫答複的會話數。Rpl_semi_sync_master_wait_sessions
-
從庫成功确認的送出數。Rpl_semi_sync_master_yes_tx
從庫半同步狀态
-
半同步目前是否在從屬伺服器上運作。如果已啟用插件并且從庫I/O線程正在運作則為Rpl_semi_sync_slave_status
, 否則為ON
。OFF
問題答案
-
半同步的過程是怎樣的?
從庫在連接配接主庫時(啟用
I/O
線程時)檢測是否使用半同步。
使用半同步主從同步:
主庫将事務寫入到二進制日志并重新整理到磁盤,根據
的配置,等待至少rpl_semi_sync_master_wait_point
個從庫确認事務後送出事務并傳回給用戶端(N
),或者送出事務後等待至少AFTER_SYNC
個從庫确認事務,然後傳回給用戶端(N
)AFTER_COMMIT
可以通過N
進行設定,預設為rpl_semi_sync_master_wait_for_slave_count
1
.
從庫在将事務寫入到中繼日志并且重新整理到磁盤後确認事務
如果确認事務的從庫數量小于
,根據N
的配置來檢查是否等待逾時,如果值為rpl_semi_sync_master_wait_no_slave
,則在等待ON
時間後,主庫恢複為異步主從同步,如果值為rpl_semi_sync_master_timeout
OFF
,主庫直接恢複為異步主從同步。
當從庫追上主庫的進度後,主庫傳回半同步主從同步狀态。
-
半同步主從同步功能是通過什麼執行的?
通過半同步主從同步插件,主庫插件
,從庫插件semisync_master.so
semisync_slave.so
-
如何啟用半同步?
安裝半同步主從同步插件
# 主庫
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
# 從庫
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'
# 主庫
SET GLOBAL repl_semi_sync_master_enabled = 1
# 從庫
SET GLOBAL repl_semi_sync_slave_enabled =1
# STOP SLAVE IO_THREAD; #如果I/O線程已啟用要先停止
START SLAVE IO_THREAD;
- 啟用半同步有什麼要求和條件?
- 資料庫可以動态加載插件
have_dynamic_loading=YES
- 主從同步已經在正常運作
- 沒有配置多通道主從同步,半同步步隻對預設主從同步通道有效
- 資料庫可以動态加載插件
-
半同步在什麼情況下會恢複為異步主從同步?
根據
rpl_semi_sync_wait_no_slave
的配置:
值為
時:等待從庫确認時間大于ON
rpl_semi_sync_master_timeout
後恢複為異步主從同步
值為
時,從庫确認數小于OFF
後恢複為異步主從同步rpl_semi_sync_master_wait_for_slave_count
- 在主庫上可以進行哪些半同步主從同步相關的配置?
是否啟用半同步步rpl_semi_sync_master_enabled
半同步逾時時間rpl_semi_sync_master_timeout
需要确認事務的從庫數量rpl_semi_sync_master_wait_for_slave_count
是否等待從庫确認逾時rpl_semi_sync_master_wait_no_slave
等待從庫确認事務的時點rpl_semi_sync_master_wait_point
半同步調試跟蹤狀态rpl_semi_sync_master_trace_level
- 在從庫上可以進行哪些半同步主從同步相關的配置?
是否啟用半同步rpl_semi_sync_slave_enabled
半同步調試跟蹤級别rpl_semi_sync_slave_trace_level
-
在使用半同步時,主庫上的事務在什麼時點進行送出?可以通過哪個選項修改送出時點?
預設主庫上的事務在寫入二進制日志并重新整理到磁盤後,等待從庫确認事務,然後送出并傳回用戶端.
可以通過
進行更改,預設值為rpl_semi_sync_master_wait_point
AFTER_SYNC
。
可以更改為
:主庫上的事務寫入到二進制日志并重新整理到磁盤後就送出事務,然後等待從庫确認事務,再将結果傳回到用戶端。這種情況下,其他連接配接可以看到送出後的事務。AFTER_COMMIT
- 如何檢視半同步的配置?
;SHOW VARIABLES LIKE 'rpl_semi_sync%';
- 如何檢視半同步的狀态?
SHOW STATUS LIKE 'rpl_semi_sync%';