1 背景
- 計費資料量劇增,需要將老庫進行資料拆分到多個分庫,資料分片;
- 拆分規則為收付款物件(或ID)欄位,進行HASH,取模(32),分32個庫
2 目標
- 實現資料從老庫,按照分片規則,遷移到分庫中
- 保證資料平滑遷移,儘量停產時間最小
- 支援回滾,同步失敗,支援回滾單庫
3 方案
3.1 基於蜂巢中介軟體實現
3.2 半自研同步資料處理程式
- 開發資料處理程式,消費歷史資料MQ;消費增量資料MQ
- 基於dts同步歷史資料(指定時間位點,同步歷史)
- 基於JDQ同步實時資料(指定時間位點,恢復實時同步)
3.3 基於開源中介軟體策略
3.4 完全自研資料處理工具
- 開發資料查詢程式,歷史資料查詢傳送MQ寫入
- 實時資料雙寫
- 統一傳送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配置目錄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代理選擇直連工具客戶端
- 用Navicat或者mysql命令直連
- 手動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去掉拆分鍵更新
作者:任洪波