項目介紹
名稱: 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
- 日均數據同步量800G+
- 涉及272個數據庫實例之間的3208個同步映射
- 60臺Worker+2臺Manager機器的集羣規模
架構簡介
DataLink是典型管理系統架構,Manager(Web管理)+Worker(工做節點):
a. Manager負責Worker的負載均衡、集羣的配置管理和系統監控
b. Worker核心功能是管理Task的生命週期,並配合Manager進行Re-Balance
下面對DataLink架構模型重點模塊作概要介紹:sql
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
Contract
- Contract是針對某種類型的數據源定義的【數據模型】,是一份契約和規範,是最高層次的抽象,和編程語言無關,和具體平臺無關,和DataLink也沒有必然關係
- Contract是TaskReader和TaskWriter可任意組合的關鍵,TaskReader輸出Contract數據,TaskWriter輸入Contract數據,互不感知,但都理解Contract定義的【數據模型】
- Contract定義的【數據模型】的主要表現形式是Record,如:RdbEventRecord,HRecord
Adapt
應用場景
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
- 郵件交流: tech_plat_data@ucarinc.com
- 報告issue:issues