天天看點

MySQL 主從同步: 半同步本文問題半同步主從同步半同步的安裝和配置檢視半同步狀态問題答案

本文問題

  1. 半同步的過程是怎樣的?
  2. 半同步功能是通過什麼執行的?
  3. 如何啟用半同步?
  4. 啟用半同步有什麼要求和條件?
  5. 半同步在什麼情況下會恢複為異步主從同步?
  6. 在主庫上可以進行哪些半同步相關的配置?
  7. 在從庫上可以進行哪些半同步相關的配置?
  8. 在使用半同步時,主庫上的事務在什麼時點進行送出?可以通過哪個選項修改送出時點?
  9. 如何檢視半同步的配置?
  10. 如何檢視半同步的狀态?

半同步主從同步

預設情況下,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

    半同步從庫數量。
  • Rpl_semi_sync_master_net_avg_wait_time

    主庫等待從庫應答的平均時間(以微秒為機關)。不建議使用此變量(始終為0),并将在以後的版本中将其删除。
  • Rpl_semi_sync_master_net_wait_time

    主伺服器等待從屬​​伺服器答複的總時間(以微秒為機關)。不建議使用此變量(始終為0),并将在以後的版本中将其删除。
  • 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

    從庫成功确認的送出數。

從庫半同步狀态

  • Rpl_semi_sync_slave_status

    半同步目前是否在從屬伺服器上運作。如果已啟用插件并且從庫I/O線程正在運作則為

    ON

    , 否則為

    OFF

問題答案

  1. 半同步的過程是怎樣的?

    從庫在連接配接主庫時(啟用

    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

    ,主庫直接恢複為異步主從同步。

    當從庫追上主庫的進度後,主庫傳回半同步主從同步狀态。

  2. 半同步主從同步功能是通過什麼執行的?

    通過半同步主從同步插件,主庫插件

    semisync_master.so

    ,從庫插件

    semisync_slave.so

  3. 如何啟用半同步?

    安裝半同步主從同步插件

# 主庫
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;
           
  1. 啟用半同步有什麼要求和條件?
    • 資料庫可以動态加載插件

      have_dynamic_loading=YES

    • 主從同步已經在正常運作
    • 沒有配置多通道主從同步,半同步步隻對預設主從同步通道有效
  2. 半同步在什麼情況下會恢複為異步主從同步?

    根據

    rpl_semi_sync_wait_no_slave

    的配置:

    值為

    ON

    時:等待從庫确認時間大于

    rpl_semi_sync_master_timeout

    後恢複為異步主從同步

    值為

    OFF

    時,從庫确認數小于

    rpl_semi_sync_master_wait_for_slave_count

    後恢複為異步主從同步
  3. 在主庫上可以進行哪些半同步主從同步相關的配置?

    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

    半同步調試跟蹤狀态
  4. 在從庫上可以進行哪些半同步主從同步相關的配置?

    rpl_semi_sync_slave_enabled

    是否啟用半同步

    rpl_semi_sync_slave_trace_level

    半同步調試跟蹤級别
  5. 在使用半同步時,主庫上的事務在什麼時點進行送出?可以通過哪個選項修改送出時點?

    預設主庫上的事務在寫入二進制日志并重新整理到磁盤後,等待從庫确認事務,然後送出并傳回用戶端.

    可以通過

    rpl_semi_sync_master_wait_point

    進行更改,預設值為

    AFTER_SYNC

    可以更改為

    AFTER_COMMIT

    :主庫上的事務寫入到二進制日志并重新整理到磁盤後就送出事務,然後等待從庫确認事務,再将結果傳回到用戶端。這種情況下,其他連接配接可以看到送出後的事務。
  6. 如何檢視半同步的配置?

    SHOW VARIABLES LIKE 'rpl_semi_sync%';

    ;
  7. 如何檢視半同步的狀态?

    SHOW STATUS LIKE 'rpl_semi_sync%';

繼續閱讀