數據庫同城雙活方案探討

前一段時間有應用要進行雙活改造,聊到數據庫的對稱雙活架構,看了下同業在應用雙活尤其是數據庫雙活設計的時候,沒有一個最佳的實施方案。本文簡單介紹下應用層和數據庫層的同城雙活設計方案,對比了不同方案的優缺點,以在實際選擇時候作爲參考。

1、應用層同城雙活架構

同城雙活架構是指在同一個城市或地理區域內,構建兩個或多個數據中心,也就是常說的 Region 的概念,這些在同一個 Region 內的數據中心同時對外提供服務,實現資源的充分利用和業務流量的負載均衡。同城雙活架構有以下特性:

在雙活架構的實現上,由於應用多數是無狀態的,通過 DNS 和負載均衡在接入層實現流量動態分發,應用層按照豎井式架構部署,如下圖所示。生產站點和同城站點在部署資源上完全對等,並具備同時接管承載兩個站點流量的能力,當生產站點或者同城站點的應用出現異常時,將流量快速切換到一個站點,提升了業務的可用性。

上述高可用架構中,雖然在應用層實現了同城雙活,但是同城中心的應用是要寫回生產的數據庫主節點,依賴數據庫層的數據同步保證同城站點的數據一致性。當生產站點數據庫出現異常或者站點級別異常時,通過自動或者手動的方式切換到同城站點,但是這個切換過程其實是有損的,故障期間業務會出現全局性的不可用。那麼想進一步提高業務的可用性,降低站點級故障的業務影響,實現數據庫層的同城雙活架構,將如何實現?

2、數據庫層同城雙活實現

2.1 常用的數據複製技術

在探討數據庫層的雙活架構實現之前,先來看下在同城架構中常用的數據複製技術有哪些。數據複製是指將一組數據從一個數據源拷貝到一個或多個數據源的技術,在同城雙活架構中有明確的 RPO 和 RTO 要求,因此數據複製的性能和時效性是技術選擇的重要考量。常用的數據複製技術包括幾種:

2.2 數據庫同城雙寫的難點

在數據庫主備節點的高可用部署架構中,如果要實現數據庫雙寫,涉及到將數據同時寫入多個數據庫實例,在技術實現上存在諸多難點。

1)數據一致性問題

2)性能問題

2.3 類 RAC 集羣架構

RAC(Real Application Clusters)架構允許在多個物理服務器節點上部署相同的數據庫實例,這些實例共享相同的數據庫文件和存儲資源,底層使用分佈式鎖管理器(DLM)等機制來控制多個節點對共享資源的併發訪問,確保數據的一致性和完整性,避免數據衝突和丟失。與傳統的主備模式不同,RAC 是一種並行模式,每個節點都可以對數據庫進行讀寫操作,當一個實例出現問題時,請求會自動轉發到另外一個實例。

以達夢共享集羣架構爲例,在同一個站點內實現 RAC 共享存儲架構,實現存算分離,計算實例有多個可以併發讀寫,數據文件、控制文件在集羣系統中只有一份,這些文件保存在共享存儲上。另外在共享存儲上使用 DMASM 文件系統管理共享存儲設備,並通過配置 DMASM 鏡像提供多副本技術。當出現磁盤損壞或數據丟失時,系統無需人工干預即可利用其他鏡像副本繼續提供數據庫服務,同時又可以自動或手動通過使用其他鏡像副本進行數據恢復。

RAC 架構實現了同一站點級別同時寫操作,那麼能否延伸到同城雙中心的 RAC 部署實現呢?

該技術方案在實現上尚存在諸多技術難點:

從技術架構實現上來看,基於 RAC + 共享存儲的數據庫雙活方案,技術實現難度很大,業內也少有成功實施的案例。

2.4 原生分佈式數據庫實現

原生的分佈式數據庫具備數據自動分片的功能,以 OceanBase 數據庫爲例,它將大表劃分爲多個較小的分片(Tablet),這些分片自動分佈到多個節點上,每個節點處理數據的一部分。另外每個分片有多個副本,並分佈在不同的節點上,副本之間通過 Paxos 一致性算法實現數據一致性。當生產和同城部署在同一個數據庫集羣中,通過配置分片的策略,在雙中心都會有主節點分佈,也就是實現了生產和同城同時寫的操作。

基於原生分佈式數據庫的實現生產和同城雙中心雙活架構,當生產或同城中心故障時,自動將主副本切換到其它節點,保證了可用性。不過這種架構下不可避免的存在跨中心的寫業務操作,存在以下問題:

2.5 單元化部署架構

單元化部署是將應用服務和數據按照某種規則進行分片,使得某個單元提供面向部分數據分片的完整服務能力。每個單元都是一個獨立的實體,包含完整的服務和數據副本,可以獨立運行和擴展。單元化可以實現系統的水平擴展,提高系統整體處理能力,提高系統的容錯性和可用性。單元化架構要求系統具備數據分區能力,數據分區承載了各個單元的業務流量比例,數據分區就是將全局數據按照某個維度水平劃分開來,每個分區的數據互不重疊、每個節點有自己的應用系統和數據庫。比如業務服務單元包含多個客戶的業務數據以及爲此類客戶提供服務支持的應用實例。

單元化與分佈式數據庫能夠有機結合,不同的單元存儲在不同的數據庫節點,每個數據庫節點根據業務大小還可以進行數據分片分爲不同的數據庫實例,單元和單元之間實現物理上的隔離和數據上的邏輯隔離。單元化架構在實現過程中有以下難點:

基於單元化的部署架構實現數據庫層的同城雙活,也是業務比較普遍的做法,在架構實現上將部分單元的數據庫主節點部署在同城單元,在網關層進行單元的路由分發,實現哪些業務訪問生產單元、哪些業務訪問同城單元。

2.6 總結

本文討論了同城雙活的實現架構以及如何實現數據庫層同城雙活,對於對同一份數據同時寫操作在集羣的機制上本身比較複雜,雖然 RAC 架構能夠實現本站點的部署,但是在同城架構下 RAC 集羣要依賴底層的數據庫網絡和存儲網絡,架構中的不穩定因素太多,而且 RAC 集羣的性能相比單集羣的架構反而會有下降。原生的分佈式數據庫架構也支持生產同城雙寫,但是存在跨中心的寫操作以及集羣間跨站點的網絡影響,對業務的性能會有影響。而基於單元化的數據庫雙活方案,結合應用的單元化設計,自上而下實現單元的物理和邏輯上的隔離性,並且生產和同城同時承載數據庫寫業務,在一定程度上實現數據庫層的雙活部署,也是業務在雙活改造過程中推薦的部署方案。

參考資料:

  1. https://cloud.tencent.com/developer/article/1645727

  2. https://zhuanlan.zhihu.com/p/703395844

  3. 基於 Oracle RAC 實現雙活方案的分析,twt 社區

  4. 分佈式數據庫單元業務應用研究報告,北京金融科技產業聯盟

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/idxRFTlkU3WHwn8YrPpZuQ