群組複製的故障偵測機制是一項分散式服務,能夠識別群組中的伺服器是否未與其他伺服器通訊,因此懷疑該伺服器已停止服務。如果群組的共識認為此懷疑可能屬實,則群組會做出協調一致的決策來驅逐該成員。驅逐未通訊的成員是必要的,因為群組需要多數成員同意交易或檢視變更。如果某個成員未參與這些決策,群組必須移除該成員,以提高群組包含多數正常運作的成員,因此可以繼續處理交易的機率。
在複製群組中,每個成員都與其他成員具有點對點通訊通道,形成完全連線的圖形。這些連線由群組通訊引擎 (XCom,一種 Paxos 變體) 管理,並使用 TCP/IP Socket。一個通道用於將訊息傳送至成員,另一個通道用於接收來自成員的訊息。如果成員在 5 秒內未收到來自另一個成員的訊息,它會懷疑該成員發生故障,並在自己的效能結構描述表格 replication_group_members
中將該成員的狀態列為 UNREACHABLE
。通常,兩個成員會懷疑彼此發生故障,因為它們彼此之間沒有通訊。雖然機率較低,但有可能成員 A 懷疑成員 B 發生故障,但成員 B 並不懷疑成員 A 發生故障 - 這可能是由於路由或防火牆問題所致。成員也可以對自己產生懷疑。與群組其餘部分隔離的成員會懷疑所有其他成員都發生故障。
如果懷疑持續超過 10 秒,懷疑的成員會嘗試將其認為懷疑成員發生故障的檢視傳播給群組的其他成員。懷疑成員只有在從其內部 XCom 節點編號計算得出為通知者時,才會這麼做。如果成員實際上與群組其餘部分隔離,它可能會嘗試傳播其檢視,但這不會有任何後果,因為它無法確保其他成員的仲裁同意。只有當成員是通知者,並且其懷疑持續足夠長的時間以傳播到群組的其他成員,且其他成員同意時,懷疑才會產生後果。在這種情況下,懷疑成員會在協調決策中被標記為從群組中驅逐,並且在 group_replication_member_expel_timeout
系統變數設定的等待期間到期,且驅逐機制偵測到並實施驅逐後,該成員會被驅逐。
在網路不穩定且成員經常以不同組合失去並重新獲得彼此連線的情況下,理論上群組有可能最終將所有成員標記為驅逐,之後群組將不復存在,必須重新設定。為了應對這種可能性,群組複製群組通訊系統 (GCS) 會追蹤已標記為驅逐的群組成員,並在決定是否有大多數時,將其視為疑似成員群組。這可確保至少有一個成員留在群組中,並且群組可以繼續存在。當驅逐的成員實際上已從群組中移除時,GCS 會移除其已標記成員為驅逐的記錄,以便該成員在可以時重新加入群組。
如需有關您可以設定的群組複製系統變數的資訊,以指定工作群組成員對故障情況的回應,以及疑似發生故障的群組成員採取的動作,請參閱第 20.7.7 節「對故障偵測和網路分割的回應」。