記錄一個將數據從mysql同步到es的思路(全量與增量)

個人認爲一個項目當它做大做當後都可能會需要將數據從傳統的數據庫同步到另一種數據集合中,一般用於提高查詢效率或將數據進行備份的目的。

其中比較常見的一種同步方式是從關係型數據庫同步到es,在查閱了相關的資料後,在這裏簡單記錄下。

全量同步

所謂全量同步就是將一個mysql的整個表的所有數據都同步到es中。全量的同步在網上查詢的資料中我感覺比較簡單又靠譜一點是這個:logstash-input-jdbc,通過logstash的插件來進行同步,比較簡單實用,logstash通過sql語句分區間對數據進行查詢,然後輸出到es進行實現。(etl中也有插件可以實現,但都大同小異)

增量同步

當然logstash-input-jdbc插件也可完成將數據從mysql同步過es,但是logstash是基於sql來完成的,並且是通過cron表達式來調用,如果業務場景需要實時性較高並對要求對數據庫的壓力比較小的話,通過logstash來進行實現就不太合適了。

通過查詢資料後發現阿里在做大做強的過程中也遇到過類似的問題,但阿里不愧就是阿里,爲了達到性能的最優,他們自己通過JAVA代碼實現了mysql的數據同步功能,通過解析mysql 的日誌進行實現的。同時,阿里還將此項目進行了開源,那就是canal。

地址爲:https://github.com/alibaba/canal

簡單看了下代碼,它裏面是通過一個server和一個client來進行實現的,及server負責mysql的日誌監聽與收集,然後再傳給client端,server與client端使用的netty進行數據的tcp通信。當然現在也有了kafka和rocketMQ作爲通信渠道的版本。同時canal也有專門的可視化監控界面,方便進行查看,同時也有HA的實現方式,通過zookeeper來進行實現的。

在看了後感覺用canal來實現數據的增量同步還是比較靠譜的,想將數據從mysql同步到es通過canal的一個adapter就可以直接實現了。https://github.com/alibaba/canal/tree/master/client-adapter

總結

canal實現數據的增量同步性能高,可監控,但裏面沒有全量同步的實現;

logstash-input-jdbc實現數據同步性能差,不夠及時,但設計的思路還是很值得借鑑的,通過偏移量來分段進行數據同步;

 

所以個人感覺如果遇到有需要對mysql數據表進行整表同步並後期持續同步的話,通過在canal的增量同步前先通過jdbc通過遊標(避免數據量過大導致內存不夠用)的方法來對數據表進行一次查詢,如果想要提升性能可通過偏移量(自增id或createTime)進行分片的多任務查詢並彙總,全量同步完成後再記錄最後一條數據的偏移量位置(自增id或createTime),然後再通知canal client進行調用進行增量同步,通過全量同步時的偏移量來處理掉數據重複的問題。

嗯~空了我還是來自己寫下具體的實現,歡迎各位多多提供寶貴意見!

共同學習,共同進步~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章