TiDB叢集基於Binlog的跨機房高可用實踐

語言: CN / TW / HK

總篇120篇 2021年第11篇

1.     背景介紹

之家要求對核心業務做跨機房部署,當 A 機房整體故障時,業務可以快速切換到 B 機房繼續提供服務,提升業務容災能力。涉及到了多套 TiDB 叢集跨機房高可用佈署,在此我對 TiDB 叢集基於 Binlog 的跨機房高可用實踐做下總結和回顧。

本文主要涉及以下幾項內容:

幾種基於 TiDB 的跨機房高可用方案及優缺點

基於 Binlog 雙向複製的高可用方案工作原理

當前線上叢集高可用架構及對未來的展望

2.   跨機房高可用概述

下面介紹下 TiDB 幾種跨機房叢集高可用方案的優缺點:

通過以上分析,1、2 方案成本太高,3方案缺乏實際意義,4方案還在外部試點測試中,暫時未達到生產級別可用。難道沒有方案可用?下面還有兩種方案沒提到,這裡從技術層面分析下兩種方案的優缺點。

經過分析,我們最終選擇了過度方案 5:基於 Binlog 雙向複製部署跨機房叢集。後續時間成熟,我們會升級到方案 4或者 6。

3.   工作原理

下面簡單描述下基於 Binlog 雙向同步的工作原理

在 A 和 B 兩個叢集間開啟雙向同步,則寫入叢集 A 的資料會同步到叢集 B 中,然後這部分資料又會繼續同步到叢集 A,這樣就會出現無限迴圈同步的情況。如上圖所示,在同步資料的過程中 Drainer 對 Binlog 加上標記,通過過濾掉有標記的 Binlog 來避免迴圈同步。詳細的實現流程如下:

(1)為兩個叢集分別啟動 TiDB Binlog 同步程式。

(2)待同步的事務經過 A 的Drainer 時,Drainer 為事務加入_drainer_repl_mark 標識表,並在表中寫入本次 DML event 更新,將事務同步至叢集 B。

(3)叢集 B 向叢集 A 返回帶有 _drainer_repl_mark 標識表的 Binlog event。叢集 B 的 Drainer 在解析該Binlog event 時發現帶有 DML event 的標識表,放棄同步該 Binlog event 到叢集 A。

注意事項:

叢集間雙向同步的前提條件是,寫入兩個叢集的資料必須保證無衝突,即在兩個叢集中,不會同時修改同一張表的同一主鍵和具有唯一索引的行。

更詳細的內容請參考官方文件

https://docs.pingcap.com/zh/tidb/dev/bidirectional-replication-between-tidb-clusters#%E9%9B%86%E7%BE%A4%E9%97%B4%E5%8F%8C%E5%90%91%E5%90%8C%E6%AD%A5

4.   叢集架構

叢集資訊如下:

叢集架構如下

5.   部署步驟

本節簡要介紹一下基於 Binlog 的跨機房部署步驟,如何對一個線上未開啟 Binlog 的叢集配置跨機房雙向複製,主要分為兩部分配置:A 叢集配置,B 叢集配置。

5.1 部署雙向複製

A 叢集配置步驟概要

(1)A 叢集部署 Pump

(2)A 叢集開啟 Binlog

(3)A 叢集匯出全量資料,將全量資料匯入B 叢集

(4)A 叢集配置 Drainer ,實現增量複製

B 叢集部署步驟概要

(1)B 叢集部署 Pump

(2)B 叢集開啟 Binlog

(3)B 叢集配置 Drainer ,實現反向複製

5.2 測試雙向複製

我們重點對下面幾種場景做了測試:

測試結果滿足業務需求。

6.   展望

基於 Binlog 的跨機房部署方案執行比較穩定,但是存在一些缺點:併發處理能力不足,無法做到高可用。因此基於 Binlog 的方案目前屬於過度方案,我們還是希望不久的將來能夠使用基於 TiCDC 的方案替代 Binlog 方案,TiCDC 彌補了上述 Binlog 的不足,也是官方大力開發並支援的方案。

介於目前 TiCDC 的雙向同步方案還沒正式 GA,而且存在一些問題,例如使用記憶體較多,同步中斷等。值得期待的是,官方正在大力推進測試,應該會在2022年 GA。屆時,我們將重點進行測試,讓我們拭目以待。

作者簡介

▼ 關注「 之家技術 」,獲取更多技術乾貨 

「其他文章」