天天看點

MongoDB雲上災備:如何快速複制阿裡異地災備、多活架構

1. 背景

  目前的資料庫系統生态中,大部分系統都支援多個節點執行個體間的資料同步機制 ,如Mysql Master/Slave主從同步,Redis AOF主從同步等,MongoDB更是支援3節點(及以上)ReplicaSet同步,上述機制很好的支撐了一個邏輯單元的資料備援及HA。

  跨邏輯單元(3節點執行個體、主從執行個體),甚至跨單元、跨資料中心的資料同步,在業務層有時候就顯得很重要,可以支援同城多機房的負載均衡,多機房的互備,甚至是異地多資料中心容災(比如 光纖被挖斷、地震等小機率事件)和多活。

  基于以上背景,雲資料庫MongoDB版本正式推出MongoDB執行個體間的雙向同步産品“MongoDB雲上災備”(也稱BLS),助力企業快速複制阿裡巴巴異地災備、多活架構。

  

産品位址

2. 産品介紹

  “MongoDB雲上災備”通過從源資料庫拉取Oplog(Operations Log)資料(其是MongoDB的日志,所有對資料庫的修改操作都會儲存到oplog中),然後将其傳輸到目的資料庫進行回放實作複制的目的。我們通過構造兩條複制鍊路實作雙向同步的功能,基于此,可以實作災備和多活的功能。

MongoDB雲上災備:如何快速複制阿裡異地災備、多活架構

  上圖給出了整體複制同步的流程。目前,“MongoDB雲上災備”支援的源、目的資料庫類型為ReplicaSet副本集,Sharding模式即将上線,不支援單節點模式。為了減緩主節點的壓力,系統從備(Secondary)上拉取Oplog。

全量加增量

  同步模型采用全量+增量的方式:在建立時會對源資料庫進行全量同步,後續的修改通過增量來同步。

雙活以及多活模型

  由于複制是異步模式,是以對于雙活/多活模式,由使用者保證不會對同一個唯一鍵同時修改,因為同時修改将可能導緻資料錯亂。目前沖突政策可以為覆寫或者忽略。後續将會上線校驗程式,在使用者操作相同唯一鍵時提供接口報錯。

高效性保證

  同步延遲因地域和網絡不同而不同,理論TPS能夠接近20萬(每秒傳輸20萬條oplog)。為了保證批量傳輸的高效性,資料發送存在緩存緩存機制,是以極限情況下,單條oplog時延可能為1秒。正常情況下,全球範圍内資料同步時延小于3秒。

  • 源資料庫并行拉取,解決沖突依賴
  • 并行發往Kafka通道
  • 目的端在解決依賴的同時并行寫入資料庫

環形複制

  為了防止環形複制(資料從源複制到目的,又從目的複制到源),在Oplog日志中打入gid解決該問題。

可靠性傳輸

  支援斷點續傳,執行個體重新開機時資料同步不受影響。

高可用

  鍊路同步具有高可用性,如果同步程序挂掉,會有備程序啟動接管服務。

限制說明

  • DDL語句同步暫未開放,是以如果修改了源、目的資料的索引操作,無法同步。
  • 目的資料庫需要建立,暫不支援在2個已有MongoDB執行個體之間直接搭通道。
  • 目前隻支援雙活功能(2個MongoDB執行個體之間同步資料),後續會上線多活功能(多個MongoDB執行個體之間同步資料)。

3. 架構

  在“MongoDB雲上災備”産品中,主要有3大元件:

  • BLS Manager。中心控制子產品,負責Collector、Receiver的排程、監控等任務。
  • BLS Collector。資料采集子產品,負責從源MongoDB資料庫拉取Oplog資料後發送到Kafka通道。
  • BLS Receiver。資料回放子產品,負責從Kafka通道中擷取資料,然後寫入目的MongoDB資料庫。

下圖展示了系統的整體架構圖。

MongoDB雲上災備:如何快速複制阿裡異地災備、多活架構

4. 使用者使用案例

  高德地圖 App是國内首屈一指的地圖及導航應用,阿裡雲MongoDB資料庫服務為該應用提供了部分功能的存儲支撐,存儲億級别資料。現在高德使用國内三中心的政策,通過地理位置等資訊路由最近中心提升服務品質,業務方(高德地圖)通過使用者路由到三個城市資料中心,如下圖所示,機房資料之間無依賴計算。資料在不同中心的同步通過“MongoDB雲上災備”産品實作。

MongoDB雲上災備:如何快速複制阿裡異地災備、多活架構

  這三個城市地理上從北到南橫跨了整個中國 ,這對多資料中心如何做好複制、容災提出了挑戰,如果某個地域的機房、網絡出現問題,可以平滑的将流量切換到另一個地方,做到使用者幾乎無感覺?

  目前政策是,拓撲采用機房兩兩互聯方式,每個機房的資料都通過“MongoDB雲上災備”異步地将資料同步到另外兩個機房。然後通過高德的路由層,将使用者請求路由到不同的資料中心,讀寫均發送在同一個資料中心,保證一定的事務性。這樣保證每個資料中心都有全量的資料(保證最終一緻性) 。任意機房出現問題,另兩個機房中的一個可以通過切換後提供讀寫服務。下圖展示了城市1和城市2機房的同步情況。

MongoDB雲上災備:如何快速複制阿裡異地災備、多活架構

遇到某個單元不能通路的問題,Manager通過“MongoDB雲上災備”産品管理接口,可以獲得各個機房的同步偏移量和時間戳,通過判斷采集和寫入值即可判斷異步複制是否在某個時間點已經完成。再配合業務方的DNS切流,切走單元流量并保證原有單元的請求在新單元是可以讀寫的,如下圖所示。

MongoDB雲上災備:如何快速複制阿裡異地災備、多活架構