增量數據同步中間件DataLink分享(已開源)

項目介紹

名稱: DataLink['deitə liŋk]
譯意: 數據鏈路,數據(自動)傳輸器
語言: 純java開發(JDK1.8+)
定位: 知足各類異構數據源之間的實時增量同步,一個分佈式、可擴展的數據同步系統
開源地址:https://github.com/ucarGroup/DataLink
java

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

項目背景

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

  • 知足各類異構數據源之間的實時增量同步,提供抽象模型,支持高可擴展
  • 平臺提供統一的基礎設施(高可用、動態負載、同步任務管理、插件管理、監控報警、公用業務組件等等),讓設計人員專一於同步插件開發,一次投入,長久受益
  • 吸取、整合業內經驗,在架構模型、設計方法論、功能特性、可運維、易用性上進行全面的升級,在前瞻性和擴展性上下足功夫,知足公司將來5-10年內的各類同步需求

應用現狀

DataLink從2016年12月開始立項,初版於2017年5月份上線,在神州優車集團內部服役到如今,基本上知足了公司全部業務線的同步需求,目前內部的同步規模大致以下web

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

架構簡介

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

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
  • 基礎參數共享
  • 實時歸檔
  • 數據鏡像
  • 數據庫的遷庫、拆庫、合庫以及災備等等

具體介紹可參見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的問題交流方式有以下幾種,歡迎各位加入進行技術討論。

    1. qq交流羣: 758937055
    2. 郵件交流: tech_plat_data@ucarinc.com
    3. 報告issue:issues

相關文章
相關標籤/搜索