開源數據同步神器——canal

前言

現在大型的IT系統中,都會使用分佈式的方式,同時會有很是多的中間件,如redis、消息隊列、大數據存儲等,可是實際核心的數據存儲依然是存儲在數據庫,做爲使用最普遍的數據庫,如何將mysql的數據與中間件的數據進行同步,既能確保數據的一致性、及時性,也能作到代碼無侵入的方式呢?若是有這樣的一個需求,數據修改後,須要及時的將mysql中的數據更新到elasticsearch,咱們會怎麼進行實現呢?java

數據同步方案選擇

針對上文的需求,通過思考,初步有以下的一些方案:mysql

  • 代碼實現
    針對代碼中進行數據庫的增刪改操做時,同時進行elasticsearch的增刪改操做。git

  • mybatis實現
    經過mybatis plugin進行實現,截取sql語句進行分析, 針對insert、update、delete的語句進行處理。顯然,這些操做若是都是單條數據的操做,是很容易處理的。可是,實際開發中,老是會有一些批量的更新或者刪除操做,這時候,就很難進行處理了。github

  • Aop實現
    不論是經過哪一種Aop方式,根據制定的規則,如規範方法名,註解等進行切面處理,但依然仍是會出現沒法處理批量操做數據的問題。redis

  • logstash
    logstash相似的同步組件提供的文件和數據同步的功能,能夠進行數據的同步,只須要簡單的配置就能將mysql數據同步到elasticsearch,可是logstash的原理是每秒進行一次增量數據查詢,將結果同步到elasticsearch,實時性要求特別高的,可能沒法知足要求。且此方案的性能不是很好,形成資源的浪費。sql

實現方式 優缺點
代碼實現 技術難度低,侵入性強,實時性高
基於mybatis 有必定的技術難度,可是沒法覆蓋全部的場景
Aop實現 技術難度低,半侵入性,須要規範代碼,依然沒法覆蓋全部的場景
logstash 技術難度低,無侵入性,無需開發,但會形成資源浪費。

那麼是否有什麼更好的方式進行處理嗎?mysql binlog同步,實時性強,對於應用無任何侵入性,且性能更好,不會形成資源浪費,那麼就有了我今天的主角——canal數據庫

canal

介紹

canal 是阿里巴巴的一個開源項目,基於java實現,總體已經在不少大型的互聯網項目生產環境中使用,包括阿里、美團等都有普遍的應用,是一個很是成熟的數據庫同步方案,基礎的使用只須要進行簡單的配置便可。
canal是經過模擬成爲mysql 的slave的方式,監聽mysql 的binlog日誌來獲取數據,binlog設置爲row模式之後,不只能獲取到執行的每個增刪改的腳本,同時還能獲取到修改前和修改後的數據,基於這個特性,canal就能高性能的獲取到mysql數據數據的變動。
微信

使用

canal的介紹在官網有很是詳細的說明,若是想了解更多,你們能夠移步官網(https://github.com/alibaba/canal)瞭解。我這裏補充下使用中不太容易理解部分。
canal的部署主要分爲server端和client端。
server端部署好之後,能夠直接監聽mysql binlog,由於server端是把本身模擬成了mysql slave,因此,只能接受數據,沒有進行任何邏輯的處理,具體的邏輯處理,須要client端進行處理。
client端通常是須要你們進行簡單的開發。github.com/alibaba/can… 有一個簡單的示例,很容易理解。mybatis

canal Adapter

爲了便於你們的使用,官方作了一個獨立的組件Adapter,Adapter是能夠將canal server端獲取的數據轉換成幾個經常使用的中間件數據源,如今支持kafka、rocketmq、hbase、elasticsearch,針對這幾個中間件的支持,直接配置便可,無需開發。上文中,若是須要將mysql的數據同步到elasticsearch,直接運行 canal Adapter,修改相關的配置便可。app

常見問題

  • 沒法接收到數據,程序也沒有報錯?
    必定要確保mysql的binlog模式爲row模式,canal原理是解析Binlog文件,而且直接中文件中獲取數據的。

  • Adapter 使用沒法同步數據?
    按照官方文檔,檢查配置項,如sql的大小寫,字段的大小寫可能都會有影響,若是還沒法搞定,能夠本身獲取代碼調試下,Adapter的代碼仍是比較容易看懂的。

canal Adapter elasticsearch 改造

由於有了canal和canal Adapter這個神器,同步到elasticsearch、hbase等問題都解決了,可是本身的開發的過程當中發現,Adapter使用仍是有些問題,由於先使用的是elasticsearch同步功能,因此對elasticsearch進行了一些改造:

elasticsearch初始化

一個全新的elasticsearch沒法使用,由於沒有建立elasticsearch index和mapping,增長了對應的功能。 elasticsearch配置文件mapping節點增長兩個參數:

 enablefieldmap: true
 fieldmap:
 id: "text"
 name: "text"
 c_time: "text"
    
複製代碼

enablefieldmap 是否須要自動生成fieldmap,默認爲false,若是須要啓動的時候就生成這設置爲true,而且設置 fieldmap,相似elasticsearch mapping中每一個字段的類型。

esconfig bug處理

代碼中獲取binlog的日誌處理時,必需要獲取數據庫名,可是當獲取binlog爲type query時,是沒法獲取 數據庫名的,此處有bug,致使出現 "Outer adapter write failed" ,且未輸出錯誤日誌,修復此bug.

後續計劃

  • 增長rabbit MQ的支持
  • 增長redis的支持

源碼

源碼地址:github.com/itmifen/can…


微信號:itmifen

相關文章
相關標籤/搜索