群組複製具有為群組成員設定在指定情況下採取的動作的能力。可以使用函數個別啟用和停用成員動作。伺服器的成員動作設定也可以在伺服器離開群組後重設為預設值。
管理員 (具有 GROUP_REPLICATION_ADMIN
權限) 可以使用 group_replication_enable_member_action
或 group_replication_disable_member_action
函數,在群組的主要伺服器上設定成員動作。然後,成員動作設定 (包含所有成員動作及其是否已啟用或停用) 會使用群組複製的群組訊息,傳播到其他群組成員和加入的成員。因此,所有群組成員都具有相同的成員動作設定。您也可以在不屬於群組的伺服器上設定成員動作,前提是已安裝群組複製外掛程式。在這種情況下,成員動作設定不會傳播到任何其他伺服器。
如果您使用函數設定成員動作的伺服器是群組的一部分,則它必須是單一主機模式下群組中的目前主要伺服器,而且必須是大多數成員的一部分。組態變更會在內部由群組複製追蹤,但不會給予 GTID,也不會寫入二進位記錄檔,因此不會傳播到群組外的任何伺服器,例如下游副本。每次啟用或停用成員動作時,群組複製都會遞增其成員動作設定的版本號碼。
成員動作設定的傳播方式如下
在啟動群組時,引導群組的伺服器的成員動作設定會成為群組的設定。
如果群組的最低 MySQL 伺服器版本支援成員動作,則加入的成員會在加入時發生的狀態交換程序期間,接收群組的成員動作設定。在這種情況下,加入的成員會以群組的設定取代其自己的成員動作設定。
如果支援成員動作的加入成員加入最低 MySQL 伺服器版本不支援成員動作的群組,則它在加入時不會收到成員動作設定。在這種情況下,加入的成員會將其自己的設定重設為預設值。
不支援成員動作的成員無法加入具有成員動作設定的群組,因為其 MySQL 伺服器版本低於現有群組成員執行的最低版本。
效能結構描述資料表 replication_group_member_actions
會列出設定中可用的成員動作、觸發它們的事件,以及它們目前是否已啟用。成員動作的優先順序為 1 到 100,數值較低的動作會優先執行。如果執行成員動作時發生錯誤,則可以記錄成員動作的失敗,但可以忽略。如果成員動作的失敗被視為嚴重,則可以根據 group_replication_exit_state_action
系統變數指定的原則來處理。
可以使用效能結構描述資料表 replication_group_configuration_version
來檢視的 mysql.replication_group_configuration_version
資料表會記錄成員動作設定的目前版本。每當使用函數啟用或停用成員動作時,版本號碼都會遞增。
只有在伺服器不屬於群組時,才能使用 group_replication_reset_member_actions
函數。它會將成員動作的配置重設為預設設定,並將其版本號碼重設為 1。伺服器必須可寫入(read_only
系統變數設定為 OFF
),並且已安裝 Group Replication 外掛程式。如果您打算將伺服器作為獨立伺服器使用,且不使用成員動作或使用不同的成員動作,則可以使用此函數移除伺服器在作為群組一部分時使用的成員動作配置。
可以設定成員動作 mysql_disable_super_read_only_if_primary
,使單一主節點模式下的群組在選出新的主節點時保持超級唯讀模式,這樣群組只接受複製的交易,而不接受來自用戶端的任何直接寫入。這種設定表示,當群組的目的是為另一個群組提供容錯的次要備份時,您可以確保次要群組與第一個群組保持同步。
預設情況下,主節點在選出時會停用超級唯讀模式,因此主節點會變成可讀寫,並接受來自複製來源伺服器和用戶端的更新。這是啟用成員動作 mysql_disable_super_read_only_if_primary
時的情況,這也是它的預設設定。如果您使用 group_replication_disable_member_action
函數將動作設定為停用,則主節點會在選出後保持超級唯讀模式。在此狀態下,它不接受來自任何用戶端的更新,即使是具有 CONNECTION_ADMIN
或 SUPER
權限的用戶也是如此。它會繼續接受由複製執行緒執行的更新。