1. 程式人生 > >增量資料同步中介軟體DataLink分享(已開源)

增量資料同步中介軟體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月份上線,在神州優車集團內部服役到現在,基本上滿足了公司所有業務線的同步需求,目前內部的同步規模大體如下

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

架構簡介

DataLink是典型管理系統架構,Manager(Web管理)+Worker(工作節點): a. Manager負責Worker的負載均衡、叢集的配置管理和系統監控 b. Worker核心功能是管理Task的生命週期,並配合Manager進行Re-Balance下面對DataLink架構模型重點模組做概要介紹:

Manager

  • Manager是整個DataLink叢集的大腦
  • Manager有三個核心功能
  1. 擔任整個叢集的負載均衡協調器:當叢集出現狀態變更時,第一時間進行Re-Balance
  2. 負責整個叢集的配置管理:提供管理後臺,配置發生變更時進行事件通知、快取重新整理等操作,保證系統能夠獲取到最新的變更
  3. 監控整個叢集的健康狀況,主要有:同步是否出現延遲、同步是否出現異常、資料同步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的時機
  1. Manager發生主備切換
  2. 新的Worker加入分組
  3. 某個Worker離開分組
  4. 新增Task
  5. 刪除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,註冊資訊主要有兩類
  1. Task的狀態資訊(執行、暫停還是出錯),通過狀態資訊可以監控task的健康狀況
  2. 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的問題交流方式有如下幾種,歡迎各位加入進行技術討論。