1. Redo Log 同步的核心目標
- ?數據一致性:確保所有副本在事務提交后具有相同的數據視圖。
- ?容錯性:在主副本故障時,從副本能快速接管并恢復數據。
- ?高吞吐:通過批量同步和并行處理提升效率。
2. Multi Paxos 協議的同步流程
Multi Paxos 協議通過多輪投票機制協調副本間的日志同步。paxos協議用于保證同一個數據分片的多個副本之間的數據一致性。
(1)事務提交階段
-
?客戶端發起事務:
客戶端向主副本提交事務請求(包含讀寫操作和?redo log
?記錄)。Client → Leader: {"type": "transaction", "redo_log": [...]}
-
?主副本處理事務:
- 主副本執行事務的讀寫操作,并將?
redo log
?記錄寫入本地日志。 - ?關鍵動作:主副本作為 ?Proposer,生成包含?
redo log
?的提案(Proposal)。
- 主副本執行事務的讀寫操作,并將?
(2)提案階段(Propose Phase)?
- ?廣播提案:
主副本向所有從副本(包括自身)廣播提案,包含:- ?提案編號?(唯一標識,遞增)。
- ?事務的?
redo log
。
Leader → Followers: {"proposal_id": 1, "redo_log": [...]}
(3)投票階段(Voting Phase)?
- ?從副本投票:
每個從副本(Acceptor)根據以下規則決定是否接受提案:- ?合法性檢查:提案的?
proposal_id
?必須大于已接受的提案。 - ?日志兼容性:
redo log
?必須與本地已提交日志兼容(如順序一致)。
Follower → Leader: {"vote": "accept", "proposal_id": 1}
- ?合法性檢查:提案的?
- ?多數派原則:
必須獲得 ?超過半數? 的投票(包括主副本自身)才能通過提案。
(4)確認階段(Commit Phase)?
- ?提交通知:
主副本收到多數派確認后,廣播提交消息給所有副本:Leader → All: {"commit": "proposal_id": 1}
- ?應用 Redo Log:
- 主副本立即應用?
redo log
?到本地數據。 - 從副本在收到提交通知后,異步應用?
redo log
。
- 主副本立即應用?
??(5)同步完成
- ?ACK確認:
從副本向主副本發送確認(ACK),表明?redo log
?已應用。Follower → Leader: {"ack": "proposal_id": 1}
- ?日志清理:
主副本刪除已提交的?redo log
?節點,釋放存儲空間。
3. 故障恢復與同步
??(1)主副本失效
- ?故障檢測:
從副本通過心跳機制(如每秒一次)檢測主副本活性。若連續丟失心跳,啟動 ?故障恢復。Follower → Monitor: "Leader heartbeat timeout"
??(2)新領導者選舉
- ?Multi Paxos 重新選舉:
所有存活節點參與新一輪 Multi Paxos 選舉:- ?候選者提議:節點依次成為臨時領導者,廣播提案。
- ?投票表決:其他節點投票給最高優先級(如任期最長)的候選者。
- ?確認領導地位:獲得多數派投票的節點成為新主副本。
??(3)日志同步恢復
- ?請求缺失日志:
新主副本向其他從副本查詢未提交的?redo log
:New Leader → Follower: "request_log_range(1, 100)"
- ?同步未提交日志:
從副本返回缺失的?redo log
,新主副本重新廣播提交。