群組複製的失敗偵測機制旨在識別不再與群組通訊的群組成員,並在似乎可能已失敗時將其驅逐。擁有失敗偵測機制可增加群組包含多數正確運作成員的機率,因此來自用戶端的請求會正確處理。
通常,所有群組成員都會定期與所有其他群組成員交換訊息。如果群組成員在 5 秒內未收到來自特定同伴成員的任何訊息,當此偵測期間結束時,會產生對同伴成員的懷疑。當懷疑逾時時,會假設被懷疑的成員已失敗,並將其從群組中驅逐。被驅逐的成員會從其他成員看到的成員資格清單中移除,但它不知道自己已從群組中驅逐,因此它會將自己視為線上,而將其他成員視為無法連線。如果成員實際上沒有失敗 (例如,因為它只是由於暫時性的網路問題而斷線),並且它能夠恢復與其他成員的通訊,它會收到一個視圖,其中包含它已從群組中驅逐的資訊。
群組成員 (包括失敗的成員本身) 對這些情況的回應可以在流程中的許多點進行設定。預設情況下,如果成員被懷疑已失敗,則會發生以下行為
在 MySQL 8.4 中,當產生懷疑時,會新增 5 秒的等待時間,然後懷疑才會逾時,而受懷疑的成員可能會被驅逐。
如果被驅逐的成員恢復通訊並意識到自己已被驅逐,它會自動嘗試三次重新加入群組 (每次嘗試之間間隔 5 分鐘);如果此自動重新加入程序不起作用,它就會停止嘗試重新加入群組。
當被驅逐的成員不嘗試重新加入群組時,它會切換為超級唯讀模式,並等待操作員注意。
您可以使用本節中描述的群組複製設定選項來永久或暫時變更這些行為,以符合您系統的需求和優先順序。如果您遇到由較慢的網路或機器、具有高頻率的非預期暫時性停機或計劃的網路停機所導致的不必要驅逐,請考慮增加驅逐逾時和自動重新加入嘗試。雖然成員正在進行先前描述的任何預設行為,但雖然它不接受寫入,如果成員仍在與用戶端通訊,仍然可以執行讀取,但隨著時間的推移,讀取過時的可能性會增加。如果避免讀取過時比避免操作員干預對您來說是更高的優先順序,請考慮減少驅逐逾時和自動重新加入嘗試,或將它們設定為零。
由於網路分割,未失敗的成員可能會失去與部分 (而非全部) 複製群組的連線。例如,在由 5 台伺服器 (S1、S2、S3、S4、S5) 組成的群組中,如果 (S1、S2) 和 (S3、S4、S5) 之間斷線,則會發生網路分割。第一個群組 (S1、S2) 現在處於少數,因為它無法連線到群組的一半以上。少數群組中的成員處理的任何交易都會被封鎖,因為群組的大多數成員無法連線,因此群組無法達到法定人數。如需此案例的詳細描述,請參閱第 20.7.8 節, 「處理網路分割和法定人數遺失」。在這種情況下,預設行為是讓少數和多數成員都保留在群組中,繼續接受交易 (儘管它們在少數成員中遭到封鎖),並等待操作員干預。此行為也是可設定的。
請注意,當群組成員使用不支援相關設定的較舊 MySQL 伺服器版本,或使用預設值不同的版本時,它們會根據上述預設行為對自己和其他群組成員採取行動。例如,不支援 group_replication_member_expel_timeout
系統變數的成員會在偵測到逾期的懷疑時立即驅逐其他成員,即使其他成員支援系統變數並設定了較長的逾時,也會接受此驅逐。