Honghong will provide you with any support you need!
Our professional Honghong team will be the first to respond and provide you with the best service to solve all your problems.

雙活(Active-Active)架構是一種資料彈性架構,它透過獨立的、分佈在不同地理位置的叢集和節點,在多個資料中心分發資料庫資訊。該架構由多個獨立的處理節點組成,每個節點都能存取共享的複製資料庫,使所有節點都能參與相同應用,並確保本地低延遲,同時各區域可以獨立運作。
雙活架構或雙活地理分散式拓撲(Active-Active Geo-Distributed topology)透過在Redis企業版中實現CRDT(無衝突複製資料類型) 來建立跨多個叢集的全域資料庫,此資料庫稱為無衝突複製資料庫(CRDB)。
CRDB 相較於其他地理分散式解決方案,具備三大核心優勢:
CRDB(無衝突複製資料庫)是一個跨多個Redis Enterprise 叢集建立的資料庫,這些叢集通常位於全球不同的資料中心。每個參與集群中的資料庫稱為「CRDB 實例」。只要CRDB 資料集的大小適配CRDB 實例的內存,每個CRDB 實例都可以採用不同的配置——它們可以由不同數量的分片組成,並運行在不同數量或類型的叢集節點上。
此外,一個CRDB 實例可以部署在多可用區(AZ)的叢集配置中,啟用高可用性和資料持久化。而另一個CRDB 執行個體則可能運行在單一可用區的叢集配置中,不啟用高可用性或資料持久化。這些CRDB 執行個體可以在任何雲端環境(包括Google Cloud、Azure 和AWS)中同時運作。這種靈活性有助於優化基礎設施成本,並根據特定業務需求提升資料庫效能。
使用CRDB 的應用程式會連線到本機CRDB 實例的端點。所有CRDB 實例之間採用雙向資料庫複製,並形成網狀拓撲結構,即應用程式對本機實例的所有寫入都會複製到所有其他實例,如下圖所示:

CRDB 架構是基於Redis 命令和資料類型的替代實作(即無衝突複製資料類型,CRDT)。在Redis 企業版中,CRDB 是基於Redis 模組資料類型API 建構的專有Redis 模組。
讀取操作由本機CRDB 實例處理。由於CRDT 層採用無共識機制,因此無需進行其他雙活架構常見的「讀取修復」(read repair)。
寫入操作遵循基於操作的CRDT(operation-based CRDT) 原則,分為兩個步驟:
應用階段(Effect step):產生的影響資料會分發到所有CRDB 執行個體(包含本機執行個體)並執行應用程式。
基於操作的CRDT 要求影響資料必須確保精確投遞一次(exactly-once delivery),並維持來源FIFO(先進先出)一致性。 CRDB 主要依賴Redis 複製機制,並針對該機制進行了一些最佳化,以滿足這些一致性要求。
CRDB 複製由同步器(syncers) 實現,它們會與遠端主實例(primary)建立連接並請求對等複製(Peer Replication),並為此引入了一種全新的資料庫複製機制。對等複製的工作方式類似於標準Redis 複製:
在必要時,可回退至完整SYNC 進行全量同步。
一旦對等節點建立複製連接,僅由CRDT 模組產生的CRDT 影響資料(CRDT effects) 會被傳播。根據不同的拓撲結構,還可以進行額外的篩選,以僅包含特定更新。在網狀拓撲(mesh topology) 中,對等複製僅傳播本地CRDB 實例產生的影響資料。
此外,CRDB 實例可以向不同的對等實例推送多個複製流,使對等複製機制能夠管理多個不同的複製日誌。
自動GZIP 壓縮與SSL 加密:當偵測到遠端公網IP 時,CRDB 會自動啟用GZIP 壓縮,以最佳化廣域網路(WAN)連線的頻寬利用率。同時,如果在連線建立過程中偵測到SSL 握手,則會自動啟用加密,確保資料傳輸的安全性。
下圖展示了對等複製的運作機制:

如果一個或多個CRDB實例發生故障,全域CRDB 下的其他實例仍可繼續讀寫,確保業務持續可用,並提供災難復原能力。即使大部分CRDB 實例(例如5 個實例中有3 個宕機)無法執行,剩餘的CRDB 實例仍能正常提供讀寫服務,不受影響。在此類區域性故障的情況下,無法連線到本機CRDB 執行個體的使用者通常會自動被引導至其他資料中心,以存取仍可用的CRDB 執行個體。這確保了即使本機CRDB 實例宕機,套用的讀寫請求仍可正常進行。
在極少數情況下,某個CRDB 實例可能會發生資料完全遺失,需要從頭開始進行資料庫複製。這種情況需要特殊處理,因為該CRDB 實例在故障前可能已經向部分對等實例發送了更新,而這些更新的接收情況可能存在差異。由於無法保證所有對等實例最終會達成一致(部分影響資料可能僅由部分實例接收),Redis Enterprise 採用資料對帳機制(Reconciliation Mechanism)來協調所有相關的CRDB 實例。對帳完成後,復原中的執行個體可以從任意可用副本進行全量同步(Full Sync),以完成復原。
在CRDB 部署中,應用了多種一致性特性:
全域CRDB 操作:採用強最終一致性(Strong Eventual Consistency, SEC),確保任何兩個CRDB 實例在接收相同(無序)的更新集合後,無需共識協定即可達到相同狀態。與僅提供活性保證(liveness guarantee)的最終一致性系統不同(即更新最終會被觀察到),強最終一致性還額外提供安全性保證(safety guarantee),確保數據狀態穩定可靠。
CRDB 的衝突解析是基於CRDT(無衝突複製資料型別) 的三大原則:
每個CRDB 實例都會獨立維護一個向量時脈(vector clock),用於追蹤每個資料物件或子物件的更新狀態。向量時脈會在本機更新操作發生時更新,或當相同物件的更新操作從其他CRDB 執行個體傳入時更新。
當CRDB 執行個體接收到來自其他執行個體的更新操作(及其向量時脈)時,會執行下列步驟:
第一階段:更新分類
收到的更新操作可能屬於以下三種情況:
舊更新(old update)
並發更新(concurrent update)
分類演算法如下:
當實例A 收到實例B 發送的關於物件X 的更新時:
x_vc[b] > x_vc[a],則該更新為「新更新」。如果x_vc[b] < x_vc[a],則該更新為「舊更新」。
x_vc[b] ≸ x_vc[a],則該更新為「並發更新」。其中,x_vc[a]是實例A 維護的物件X 的向量時鐘,x_vc[b]是實例B 維護的物件X 的向量時鐘。
第二階段:本地更新對象
如果更新被分類為“舊更新”,則不在本機CRDB 實例中更新物件的值。

CRDB 的衝突解析演算法主要基於兩個處理流程:
流程1:無衝突資料類型/操作的解析
在許多並發更新場景下,某些資料類型的固有特性可確保更新完全無衝突(conflict-free),例如:
集合(Set):當資料類型為集合(對應到CRDT 的Add-Wins Observed-Removed Set),且並發更新均為ADD 運算時,所有運算都是結合性(associative)或冪等的(idempotent),因此不會發生衝突。
範例:在詐欺偵測中,應用程式追蹤與特定ID 或信用卡相關的可疑事件。如果關聯的Redis Set 基數達到某個閾值,則觸發警報。
在這些場景下,物件值的更新會依照資料類型的策略執行,確保資料的一致性。
流程2:使用「最後寫入優先(LWW)」 機制解析衝突
對於非無衝突的資料類型(如Redis 字串(String),映射到CRDT 的register),需要應用衝突解析演算法。在這種情況下,CRDB 採用最後寫入優先(LWW, Last Write Wins) 機制,透過操作時間戳記(timestamp)作為仲裁標準來解析衝突。
即使不同地區的時間戳記有偏差(timestamp skew),LWW 仍可確保最終達到強最終一致性(Strong Eventual Consistency)。例如:


Our professional Honghong team will be the first to respond and provide you with the best service to solve all your problems.
Address: 3F, No. 99, Jingye 1st Road, Zhongshan District, Taipei City, Taiwan (Da Wan Technology Center Building)
3rd Floor., Dawan Technology Center Building, No. 99 Jingye 1st Road, Zhongshan District, Taipei City, Taiwan
©2025.hongtronics. All Rights Reserved.