適用場景
多副本寫入系統(如 Dynamo、Riak、Cassandra),Client 可任意寫入任一節點,需在無中央協調者情況下偵測並發衝突。
核心資料結構
向量時鐘 = [NodeA: vA, NodeB: vB, NodeC: vC]
每個節點維護自己的邏輯計數器,構成 N 維向量(N 為副本數)。
演算法規則(兩條核心規則)
1. 本地寫入:自身分量 +1
寫入節點 B → VC[B] += 1
{key: "price", value: 6888, vc: [A:1, B:2, C:0]}
2. 同步合併:取各分量 Max
| 本地 VC | 收到 VC | 合併結果 | 判斷 |
| [1,2,3] | [1,2,4] | [1,2,4] | 本地較舊,直接採納 |
| [2,3,4] | [1,2,3] | [2,3,4] | 收到較舊,丟棄 |
| [1,2,1] | [1,1,2] | **衝突** | 各有勝負,無法自動決定 |
完整演示流程(以 iPhone 價格為例)
- 初始:三節點 VC = [0,0,0]
- Client 寫 A:VC=[1,0,0] value=5888
- A 同步給 B,C → 全節點 [1,0,0]
- Client 寫 B:VC=[1,1,0] value=6888
- B 同步 → 全節點 [1,1,0]
- Client 寫 C:VC=[1,1,1] value=4000
- **網路分區**:C 僅同步給 A → A=[1,1,1], B=[1,1,0]
- Client 寫 B:VC=[1,2,0] value=6000
- B 同步給 A,C → **A 收到 [1,2,0] 與本地 [1,1,1] 衝突**(B 較新但 C 較舊)
衝突解決策略
向量時鐘**僅偵測衝突,不解決**。常見補救:
- Last Write Wins (LWW):附加
timestamp,取時間較大者,並修正 VC
- Application-specific merge:交由業務邏輯(如購物車合併)
- Read Repair / Anti-entropy:讀取時或背景同步時修復
工程考量
- 副本數通常 ≤ 5,向量長度可控
- 衝突修復時機:讀修復 vs 寫修復 vs 背景掃描
- 修復執行者:Client 端 vs Server 端
向量時鐘以優雅的數學結構解決分布式版本排序,配合時間戳或業務合併,構建高可用多主系統的基石。