國際計費系統基於Sharding-Proxy大資料遷移方案實踐

京東雲發表於2022-08-09

1 背景

  • 計費資料量劇增,需要將老庫進行資料拆分到多個分庫,資料分片;
  • 拆分規則為收付款物件(或ID)欄位,進行HASH,取模(32),分32個庫

2 目標

  • 實現資料從老庫,按照分片規則,遷移到分庫中
  • 保證資料平滑遷移,儘量停產時間最小
  • 支援回滾,同步失敗,支援回滾單庫

3 方案

3.1 基於蜂巢中介軟體實現

3.2 半自研同步資料處理程式

  1. 開發資料處理程式,消費歷史資料MQ;消費增量資料MQ
  2. 基於dts同步歷史資料(指定時間位點,同步歷史)
  3. 基於JDQ同步實時資料(指定時間位點,恢復實時同步)

3.3 基於開源中介軟體策略

3.4 完全自研資料處理工具

  1. 開發資料查詢程式,歷史資料查詢傳送MQ寫入
  2. 實時資料雙寫
  3. 統一傳送MQ,由MQ非同步處理寫入

3.5 方案對比

綜上整體評估,我們最終選取,基於sharding-proxy做資料遷移整體方案

4 Proxy介紹與搭建

4.1 簡介

4.1.1 設計意義

定位為透明化的資料庫代理端,提供封裝了資料庫二進位制協議的服務端版本,用於完成對異構語言的支援。 目前提供 MySQL 和 PostgreSQL(相容 openGauss 等基於 PostgreSQL 的資料庫)版本,它可以使用任何相容 MySQL/PostgreSQL 協議的訪問客戶端(如:MySQL Command Client, MySQL Workbench, Navicat 等)運算元據,對 DBA 更加友好。

  • 嚮應用程式完全透明,可直接當做 MySQL/PostgreSQL 使用;
  • 適用於任何相容 MySQL/PostgreSQL 協議的的客戶端。

4.1.2 整體架構

整個架構可以分為前端、後端和核心元件三部分。

前端負責與客戶端進行網路通訊,採用的是基於NIO的客戶端/伺服器框架,在Windows和Mac作業系統下采用NIO模型,Linux系統自動適配為Epoll模型。通訊的過程中完成對MySQL協議的編解碼。核心元件得到解碼的MySQL命令後,開始呼叫Sharding-Core對SQL進行解析、路由、改寫、結果歸併等核心功能。後端與真實資料庫的互動目前藉助於Hikari連線池。

4.2 搭建

4.2.1 關鍵字解讀

下載,解壓,安裝mysql驅動,啟動,完事

4.2.2 安裝shareding-proxy

安裝包下載,選擇合適版本(本文選用4.1.1),在官網進行下載,官網地址https://shardingsphere.apache.org/document/current/cn/downloads

  • 安裝包解壓(自動解壓,或是命令解壓),解壓目錄自己隨意指定(有許可權目錄均可)

  • 解壓後shareding-proxy目錄

  • shareding-proxy配置目錄conf,包含所有配置資料

4.2.3 安裝mysql驅動

將mysql的驅動jar包(mysql-connector-java-5.1.44.jar )放在shareding-proxy的lib目錄下ShardingSphere-Proxy不帶mysql驅動jar包,需要手動下載
下載地址https://dev.mysql.com/downloads/connector/j/

4.2.4 proxy啟動

shareding-proxy的bin目錄start.sh,透過./start.sh啟動

4.2.5 Remark

Sharding-Proxy預設的啟動埠是3307

4.3 配置

4.3.1 關鍵字解讀

六大配置——日誌配置(logback.xml),基礎服務配置(server.yaml),邏輯配置(四個conf配置檔案,分片(核心)/影子/讀寫分離/加密配置)
本例基於server.yaml、config-sharding.yaml配置分片策略

4.3.2 server.yaml

基礎服務配置,三部分組成

1)shareding-jdbc的編排治理配置,提供資料治理功能,包含如下:
  • 配置集中化與動態化。(支援資料來源,表與分片讀寫分離策略的動態切換)
  • 資料治理。提供熔斷資料庫訪問程式對資料庫的訪問和禁用從庫的訪問的能力
  • 支援Zookeeper和etcd的註冊中心;

2)許可權配置,配置使用者名稱和密碼以及授權資料庫
  • 下例配置兩個使用者,分別為:root/root和sharding/sharding,其中root預設授權所有的資料庫,而sharding使用者則授權sharding_db資料庫。在這裡的資料庫(schema)是邏輯資料庫,在config-*.yaml中配置對應分庫對映

  • 代理資料來源引數配置

配置資料連結,執行緒,核數等

4.3.3 config-sharding.yaml

shareding-proxy核心配置,分片規則相關配置,包含schemaName、dataSources、shardingRule三部分

1)下圖邏輯庫對應分庫資料來源的對映配置
  • schemaName邏輯庫名,在server.yaml宣告的授權的schema就是這裡的schemaName
  • dataSources為資料來源配置,本例對映倆個分庫(ds0,ds_1),ds${0..1}對應邏輯分庫名,url填寫實際庫

4.3.4 logback.xml

基於logback的日誌配置

4.3.5 剩餘三項配置

config-shadow.yaml/config-master_slave.yaml/config-encrypt.yaml
分別為影子庫配置,主從配置,資料欄位加密配置,有意可以自行看下文連結

5 除錯

基於搭建ShardingSphere-Proxy代理選擇直連工具客戶端

  1. 用Navicat或者mysql命令直連
  2. 手動mysql命令連結如下

查詢不帶拆分鍵預設搜全庫,新增預設根據拆分鍵路由對應真實庫

6 資料遷移

遷移三步

1)線上安裝sharding-proxy
2)資料同步:建立遷移任務,啟動同步,原理即是建立DTS任務

3)資料完整性校驗

  • 全量比對,整體同步進度查詢

  • 時間分段比對,按照各個時間段抽樣進行新庫老庫總量比對,手動校驗

  • 隨機抽樣比對:隨機新庫某個時間段的資料逐條進行比對,手動工具校驗
    手動根據開發工具分別抽樣查詢,並查詢出的資料與老庫進行比對
  • 全量資料校驗:對比同步資料進行全量資料校驗,根據DTS工具進行校驗,耗時較長

7 配置查詢機

基於easyops或者myops配置物流指定查詢機,透過查詢機查詢proxy代理實現

8 問題與總結

整體資料遷移過程中遇到的最大的問題即是資料不可測,針對各種歷史資料問題導致資料遷移中斷,造成返工,清理垃圾資料,重新遷移

8.1 拆分鍵為空

拆分鍵為空預設不支援

8.2 更新拆分鍵

更新語句預設不支援更新拆分鍵(實際4.x不支援更新帶拆分鍵,5.x已經支援更新帶拆分鍵不改的情況下)
Unknown exception: [INSERT INTO …. ON DUPLICATE KEY UPDATE can not support update for sharding column.]

8.3 針對以上倆種異常的解決方法

拆分鍵不能為空,設定預設拆分鍵
更新帶拆分鍵,升級sharding-proxy到5.x或配置同步DTS去掉拆分鍵更新


作者:任洪波


相關文章