增量資料同步中介軟體DataLink分享(已開源)
專案介紹
名稱: 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
- 基礎引數共享
- 實時歸檔
- 資料映象
- 資料庫的遷庫、拆庫、合庫以及災備等等
專案未來
datalink專案借鑑了很多開源產品的思想,這裡要重點感謝的產品有:canal,otter,datax,yugong,databus,kafka-connect,ersatz站在巨人的肩膀上,我們進行了開源,一方面回饋社群,一方面拋磚引玉展望未來,我們希望這個專案能夠活躍起來,為社群做出更大的貢獻,內部的各種新特性也會盡快同步到開源版本,同時也希望有更多的人蔘與進來目前內部正在規劃中的功能有:
- 雙機房(中心)同步
- 通用審計功能
- 各種同步工具
- 等
問題反饋
目前有關datalink的問題交流方式有如下幾種,歡迎各位加入進行技術討論。