宏虹將提供您所需的任何支援!
專業的宏虹團隊會第一時間回應,為您提供最佳的服務,解決您的一切問題
雙活(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)。例如:
專業的宏虹團隊會第一時間回應,為您提供最佳的服務,解決您的一切問題
地址:臺灣臺北市中山區敬業一路99號3樓(大灣科技中心大樓)
3rd Floor, Dawan Technology Center Building, No. 99 Jingye 1st Road, Zhongshan District, Taipei City, Taiwan
©2025.hongtronics. All Rights Reserved.