1. 程式人生 > >增量資料同步中介軟體

增量資料同步中介軟體

增量資料同步中介軟體DataLink分享(已開源)

https://www.cnblogs.com/ucarinc/p/9770990.html

專案介紹
名稱: DataLink['deitə liŋk]
譯意: 資料鏈路,資料(自動)傳輸器
語言: 純java開發(JDK1.8+)
定位: 滿足各種異構資料來源之間的實時增量同步,一個分散式、可擴充套件的資料同步系統
開源地址:https://github.com/ucarGroup/DataLink

此次開源為去除內部依賴後的版本(開源的是增量同步子系統),在集團內部datalink和阿里的datax還進行了深度整合,增量(datalink)+全量(datax)共同組成統一的資料交換平臺

專案背景
隨著神州優車集團業務的高速發展,各種各樣的資料同步場景應運而生,原有的系統架構難以支撐複雜多變的業務需求,so,從2016年底開始,團隊內部開始醞釀datalink這個產品。著眼於未來,我們的目標是打造一個新平臺,滿足各種異構資料來源之間的實時增量同步,支撐公司業務的快速發展。在充分調研的基礎之上,我們發現,沒有任何一款開源產品能輕易的滿足我們的目標,每個產品都有其明顯的短板和侷限性,所以最終的選項只有"自行設計"。但自行設計並不是憑空設計,現有的資料交換平臺、已有的經驗、大大小小的開源產品都是我們的設計根基,與其說是自行設計,倒不如說是站在巨人的肩膀上做了一次飛躍。由此誕生了DataLink這樣一個產品,其產品特性主要如下:

滿足各種異構資料來源之間的實時增量同步,提供抽象模型,支援高可擴充套件
平臺提供統一的基礎設施(高可用、動態負載、同步任務管理、外掛管理、監控報警、公用業務元件等等),讓設計人員專注於同步外掛開發,一次投入,長久受益
吸收、整合業內經驗,在架構模型、設計方法論、功能特性、可運維、易用性上進行全面的升級,在前瞻性和擴充套件性上下足功夫,滿足公司未來5-10年內的各種同步需求
應用現狀
DataLink從2016年12月開始立項,第一版於2017年5月份上線,在神州優車集團內部服役到現在,基本上滿足了公司所有業務線的同步需求,目前內部的同步規模大體如下

日均資料同步量800G+
涉及272個數據庫例項之間的3208個同步對映
60臺Worker+2臺Manager機器的叢集規模
架構簡介

DataLink是典型管理系統架構,Manager(Web管理)+Worker(工作節點):

a. Manager負責Worker的負載均衡、叢集的配置管理和系統監控

b. Worker核心功能是管理Task的生命週期,並配合Manager進行Re-Balance
下面對DataLink架構模型重點模組做概要介紹:

Manager
Manager是整個DataLink叢集的大腦
Manager有三個核心功能
擔任整個叢集的負載均衡協調器:當叢集出現狀態變更時,第一時間進行Re-Balance
負責整個叢集的配置管理:提供管理後臺,配置發生變更時進行事件通知、快取重新整理等操作,保證系統能夠獲取到最新的變更
監控整個叢集的健康狀況,主要有:同步是否出現延遲、同步是否出現異常、資料同步TPS、資料同步吞吐量、機器健康狀況檢查等等
Group
分組是DataLink的一個核心概念,Worker和Task在執行之前必須先知道自己屬於哪個分組
分組的目的是:實現組內自治、組間隔離,不同分組會有不同的引數配置、執行策略、高可用級別等等
Worker
Worker必須歸屬於某個分組
Worker的核心功能是管理Task的生命週期,並配合Manager進行Re-Balance
Worker執行哪些Task受Manager的分配
Task
Task的核心功能是進行資料同步
一個Task由一個TaskReader和多個TaskWriter組成,Reader和Writer使用獨立的Classloader
Task必須歸屬於某個分組
(Re-)Balance
(Re-)Balance的定義:通過一定的負載均衡策略,使Task在Worker節點上均衡的分佈
(Re-)Balance的單位是Group,一個分組發生(Re-)Balance不會影響其它分組的正常執行
發生(Re-)Balance的時機
Manager發生主備切換
新的Worker加入分組
某個Worker離開分組
新增Task
刪除Task
Plugin
外掛模型最大的意義在於解耦和複用,只需要提供一套基礎框架,開發一系列同步外掛,通過配置組合便可以支援"無限多"的同步場景
外掛劃分為兩種:Reader外掛和Writer外掛,外掛之間通過Task串聯起來
Task執行時,每個外掛都有自己獨立的Classloader,保證外掛之間的jar包隔離
Mysql
DataLink的執行需要依賴各種配置資訊,這些配置資訊統一儲存到Mysql中
DataLink在執行過程中會動態產生監控和統計資料,這些資料也統一儲存到Mysql中
儲存的配置資訊主要有: 同步任務資訊、工作節點資訊、分組資訊、資料來源配置資訊、對映規則資訊、監控資訊、角色許可權資訊等
Zookeeper
Manager的高可用需要依賴於zookeeper,通過搶佔和監聽"/datalink/managers/active"節點,實現秒級switch
注:Worker的高可用並不依賴zookeeper,只要manager能夠保證高可用,worker就是高可用的
Task會將執行時資訊註冊到zookeeper,註冊資訊主要有兩類
Task的狀態資訊(執行、暫停還是出錯),通過狀態資訊可以監控task的健康狀況
Task的position資訊,通過postion資訊可以檢視當前的同步進度,也可以實現故障恢復
Netty&Jetty
Manager使用Netty提供Tcp服務,用來監聽Worker端傳送的Coordinator資訊(注:Netty只用來做高可用和負載均衡)
Manager使用Jetty提供Http服務,主要用來提供web管理功能和接收Worker傳送的監控和統計資料
Worker使用Jetty提供Http服務,主要用來接收Manager傳送的管理指令
Kafka-Client
DataLink套用了kafka的(Re-)balance協議
在Worker端和Manager端分別定義了各自的Coordinate模組,這些模組都需要依賴kafka的client包
同步模型

外掛體系
外掛體系一般由兩部分組成:Framework+Plugin,DataLink中的Framework主要指【TaskRuntime】,Plugin對應的是各種型別的【TaskReader&TaskWriter】
TaskRuntime
提供了Task的高層抽象、Task的執行時環境和Task的外掛規範
TaskReader&TaskWriter
一個個具體的資料同步外掛,遵從Task外掛規範,功能自治,和TaskRuntime完全解耦,理論上外掛數量可無限擴充
Task
DataLink中資料同步的基本單位是Task,一個Worker程序中可以執行一批Task,一個執行中的Task由一個TaskReader和至少一個TaskWriter組成,即有:

程式執行期,同一型別的外掛在一個程序中可以有多個例項,例項個數取決於有多少個Task用到了該外掛

程式執行期,外掛的生命週期歸屬於Task,在不同的生命週期階段,依照Task的配置資訊或相關指令,進行建立、初始化、執行或銷燬等操作

理論上,TaskReader和TaskWriter可動態任意組合(能否組合,主要取決於待組合的TaskWriter能否適配TaskReader的Record型別)

理論上,每新增一種外掛,可支援的同步場景可以成倍數的增加(具體幾倍,和外掛型別和當前已有的外掛數量有關係),新增一個TaskReader,可新增的同步場景數量取決於已有TaskWriter的數量,反之亦然

目前,DataLink的TaskReader支援的型別有MYSQL, FLEXIBLEQ, HBASE,TaskWriter支援的型別有Rdbms、ElasticSearch、Hdfs、HBase、FlexibleQ、SDDL

ClassLoader
Datalink-Worker程序中,每個型別的外掛,都有自己獨立的classloader和classpath。
原因很簡單:class版本隔離的需要,DataLink中,可以開發任意多個外掛,出現jar包衝突很正常,必須通過classloader隔離這些衝突。

Contract
Contract是針對某種型別的資料來源定義的【資料模型】,是一份契約和規範,是最高層次的抽象,和程式語言無關,和具體平臺無關,和DataLink也沒有必然關係
Contract是TaskReader和TaskWriter可任意組合的關鍵,TaskReader輸出Contract資料,TaskWriter輸入Contract資料,互不感知,但都理解Contract定義的【資料模型】
Contract定義的【資料模型】的主要表現形式是Record,如:RdbEventRecord,HRecord
Adapt
TaskReader:
負責輸出Contract資料,適配模式很簡單,一對一,直接把底層資料組裝成對應的Record即可,如:MysqlTaskReader對應RdbEventRecord

TaskWriter:
負責輸入Contract資料,並寫入目標資料來源。TaskWriter可以接收不同型別的【資料模型】,內部由不同的Handler把不同【資料模型】的資料寫入目標資料來源

應用場景
DataLink可以支撐的常見應用場景有:

ReSharding
BigData
CQRS
EDA
SearchBuild
基礎引數共享
實時歸檔
資料映象
資料庫的遷庫、拆庫、合庫以及災備等等
具體介紹可參見git文件:https://github.com/ucarGroup/DataLink/wiki/1.9_%E6%B7%B1%E5%85%A5%E5%9C%BA%E6%99%AF

專案未來
datalink專案借鑑了很多開源產品的思想,這裡要重點感謝的產品有:canal,otter,datax,yugong,databus,kafka-connect,ersatz
站在巨人的肩膀上,我們進行了開源,一方面回饋社群,一方面拋磚引玉
展望未來,我們希望這個專案能夠活躍起來,為社群做出更大的貢獻,內部的各種新特性也會盡快同步到開源版本,同時也希望有更多的人蔘與進來
目前內部正在規劃中的功能有:

雙機房(中心)同步
通用審計功能
各種同步工具

問題反饋
目前有關datalink的問題交流方式有如下幾種,歡迎各位加入進行技術討論。

qq交流群: 758937055
郵件交流: [email protected]
報告issue:issues