天天看點

DB 與 Elasticsearch 混合應用之資料實時同步

作者介紹

李猛,Elastic Stack 深度使用者,通過 Elastic 工程師認證,2012年接觸 Elasticsearch,對 Elastic Stack 技術棧開發、架構、運維等方面有深入體驗,實踐過多種大中型項目;為企業提供 Elastic Stack 咨詢教育訓練以及調優實施;多年實戰經驗,愛搗騰各種技術産品,擅長大資料,機器學習,系統架構。

序言

前一篇文章

《DB與ES混合之應用系統場景分析探讨》

,我們主要探讨了混合場景下的多種模型映射類型,基本覆寫了應用業務系統如何借助

Elasticsearch

來解決DB局限性。

下面這篇文章,我們主要解決 DB 到 Elasticsearch 資料實時同步問題。

背景需求

DB與ES本質上是屬于不同應用領域的資料庫産品,混合應用在一起主要面臨2個問題 :

1、同步實時性,資料在DB更新之後,需要多久才能更新到 Elasticsearch,多久的時間是應用系統可以接受的範圍,一般需要控制在1s以内,如果是分鐘以上,那這就屬于離線同步。

2、資料一緻性,資料頻繁在DB變更修改,更新到Elasticsearch之後如何保證資料與DB一緻,在容許的時間範圍内應用系統查詢的資料有效的,可接受的,如果變更出現覆寫等,那資料是無效的,應用系統是不可接受的。

DB 與 Elasticsearch 混合應用之資料實時同步

同步模式

在資料同步方面,主要有3種同步模式

1、推送模式,資料源将變更資料推送到目标源,如RabbitMQ産品,服務端會主動MQ發送到用戶端。

2、拉取模式,目标源定時去資料源拉取變更資料,如Mysql資料庫的資料主從同步機制,Slave會去Master拉取變更資料。

3、推拉結合,資料源與目标源之間,既有推送方式,也有拉取方式,此種模式一般會借助于中間媒介實作,如基于Kafka産品的日志應用,資料源(采集端)會将日志資料發送到Kafka叢集,目标源會定期的從Kafka拉取資料更新。

DB 與 Elasticsearch 混合應用之資料實時同步

技術方案

從技術層面看,DB同步到ES有好多種方式

1、同步雙寫,更新DB時同步更新ES。此技術方案最簡單,附帶問題最多,資料沖突,資料覆寫,資料丢失,處處是坑,謹慎選擇。

2、異步雙寫,更新DB之後,記錄一條MQ,MQ通知消費端,消費端反向查詢DB資料,最後更新到ES。此技術方案與業務系統耦合嚴重,需要更加業務需求獨立編寫,且每個業務都需要專門編寫相關程式,非常不利于快速響應需求。

3、CDC,全稱Change Data Capture,變更資料捕捉,從資料庫内部捕捉變更資料,将變更資料推送到中間程式中,中間程式邏輯實作同步推送到ES。CDC機制速度極快,資料精準,且與應用程式耦合少,可抽象脫離業務系統,适合大規模使用。 如圖:

DB 與 Elasticsearch 混合應用之資料實時同步

CDC機制原有設計是為了同類型資料庫之間資料同步,應用在主從同步高可用方面,是以同類型資料庫之間資料同步非常容易實作,資料庫廠商本身天然支援,經過多年實戰驗證高效可靠。相反,在異構資料庫之間實作資料同步是比較複雜的,資料鍊路長,中間涉及到的技術點特别多,且每一步都非常關鍵,下面就以本人所在公司采用的技術棧講述如何實作,以及一些技術關鍵點。

案例:MySQL 同步到 Elasticsearch

DB 與 Elasticsearch 混合應用之資料實時同步

資料從Mysql同步到Elasticsearch主要涉及到以下幾個技術關鍵點

• Binlog機制

• Canal中間件

• Kakfa中間件

• 同步應用程式(業務型開發成中間件)

Binlog機制

DB 與 Elasticsearch 混合應用之資料實時同步

Binlog是Mysql自帶功能機制,設計之初是為了資料庫之間主從同步

• Master主庫,啟動Binlog機制,将變更資料寫入Binlog檔案

• Slave從庫,從Master主庫拉取binlon資料,回放Binlog,更新從庫資料

• 啟用Binlog注意以下幾點

• Master主庫一般會有多台Slave訂閱,且Master主庫要支援業務系統實時變更操作,伺服器資源會有瓶頸

• 需要同步的資料表一定要有主鍵

Canal中間件

DB 與 Elasticsearch 混合應用之資料實時同步

Canal是Mysql的中間件産品,專門應用在資料同步

• 僞裝Slave從庫,

• 拉取Binlog資料,

• 回放Binlog資料,

• 解析Binlog資料為Json,封包記錄了新舊資料,資料庫資料表,更新方式

DB 與 Elasticsearch 混合應用之資料實時同步

• 輸出資料,并保證變更順序,輸出目的源支援很多,正常的一般輸出到kafka

• 配置cannl注意以下幾點

• Canal基于Jvm運作,資料處理能力不如Mysql,Canal需要配置叢集模式。一組Canal叢集不能支援太多的事資料庫執行個體。

• 若是資料庫做了水準的分庫分表 ,原有Canal是不能識别為一類資料源,需要稍微修改部分代碼

• 建議Canal訂閱的Slave從機,因為Master是業務主庫,主庫承擔的業務系統職責太多

• Binlog日志模式建議啟動Gtid,Canal訂閱的資料庫如果出現故障,需要基于此切換到其他資料庫。

• 資料輸出到Kafka,若資料庫是做了分庫分表的,需要修改Canal部分代碼。

• 設定Kafka分區鍵相同,保障相同資料變更順序。

Kafka中間件

使用Kafka作為中間緩存,主要基于以下幾個方面考慮

• 分區特性,Kafka支援分區,并發性能好,資料吞吐能力超過mysql,性能不會成為瓶頸

• 分區順序存儲,Kafka資料存儲是有順序的,設定好主鍵,保障Binlog變更順序

• 消費順序,用戶端消費Kafk資料,會基于Offset,按順序消費,保障Binlog變更順序

• 消費組,嚴格意義上講,Kafka并非熟悉消息隊列,應該算消息流,我們在上一篇文中讨論資料模型映射需求,一個資料表可能會映射到多個索引,這就需要設定不同的消費組,保障多個消費組之間不沖突覆寫,同樣的變更資料有多次重複消費

DB 與 Elasticsearch 混合應用之資料實時同步

同步程式

同步程式目前基于Java自主開發,目前的主流同步工具不能很好支援自定義需求,主要包括兩大程式

同步任務排程程式

• 同步排程配置,配置同步任務,配置同步映射關系,DB到ES的映射,Kafka到ES的映射

• 同步排程配置設定,同步任務操作,啟動、停止、重新設定;同步任務配置設定,指定并行度等。

DB 與 Elasticsearch 混合應用之資料實時同步

同步任務執行程式

• 執行任務,将資料從Kafka經過映射寫入到Elasticsearch中,主要由4大子產品組成

• Kafka子產品,拉取消費資料,記錄消費位置

• Mapper子產品,執行映射過程,資料表與索引映射,表字段與索引字段映射,生成指定的Json格式資料

• Elastic子產品,将Mapper生成好的Json資料送出到Elasticsearch中,成功則送出消費記錄位置,失敗則走另外邏輯

• Schedule子產品,基于線程級别次元執行同步任務,支援同步任務啟動暫停等操作,實時彙總同步任務的名額資料

資料同步全過程回顧

資料從DB更新到ES,中間經過多個環節,同步模式既有推送,也拉取,且多次結合完成。

• Mysql寫入到本地binlog,推送模式

• Canal讀取binlog寫入Kafka,先是拉取模式,後是推送模式

• Worker同步程式從Kafka讀寫資料,經過處理寫入到Elasticsearch,先是拉取模式,後是推送模式

DB 與 Elasticsearch 混合應用之資料實時同步

注意事項

DB到ES實時同步整體項目鍊路很長,且涉及技術點較多,任意環境都會導緻一些問題,有一些特别注意

• DB刷資料問題,由于DB是批量更新,後面幾個技術節點會出現部分性能瓶頸

• DB多表關聯深度問題,DB多表直接關聯最好的關系是1對1,主要ES映射也可以基于主鍵關聯更新,無需反向查詢

• ES進階類型限制問題,ES本身支援很多進階資料類型,但這些在同步程式中最好不要使用

DB 與 Elasticsearch 混合應用之資料實時同步

遺留問題

項目推進過程中,遇到不少問題,有的已經解決,有的是無法解決,有的會改善解決

• 資料校驗,DB資料雖然同步到ES中,但目前是沒有有效的方法去校驗正确性的,傳統的方式校驗方式是随機兩邊查詢對比,非常的低效,此處需要探讨更好的資料比對方法,

• 資料修複,當資料發現不正确時需要自動能夠修複,但由于資料校驗的低效,資料修複的準确性也有待考量

• 技術演進,資料同步程式是自主基于Java開發,但做了很多非業務時間工作,程式大量的工作在排程且涉及很傳統,考慮引入Flink平台,由平台負責底層資源掉度,上層隻需配置同步映射,目前正在測試中。

DB 與 Elasticsearch 混合應用之資料實時同步

結語

經驗總結

DB到ES資料實時同步,前後經過的時間很長,經過了好幾次的技術方案演進,未來還有很大的優化改進空間。

最終進化到CDC這種方案也是基于已有的經驗分享(參考馬蜂窩技術部落格),設計思路一樣,技術實作不一樣。

資料同步整體技術實作中間環節很多,任意技術點都需要了解透徹,否則會出現很多緻命事故,需要多人團隊協作完成。

CDC并非新概念,幾乎所有資料庫産品都支援,如下:

• Postgresql 有 Logical Decoding

• Sqlserver 有 Change data capture 和 Change Tracking

• Oralce 有 Redo log和 Oralce Golden Gate

• Mongodb 有 Replicate sets

• Elasticsearch 有 Translog

若之後遇到類似資料實時同步需求,優先選擇CDC技術方案 ,我們需要更強大的資料實時交換平台,歡迎讨論一起幹。

聲明:本文由原文作者“李猛”授權轉載,對未經許可擅自使用者,保留追究其法律責任的權利。
DB 與 Elasticsearch 混合應用之資料實時同步

阿裡雲Elastic Stack

】100%相容開源ES,獨有9大能力,提供免費X-pack服務(單節點價值$6000)

相關活動

更多折扣活動,請

通路阿裡雲 Elasticsearch 官網 阿裡雲 Elasticsearch 商業通用版,1核2G ,SSD 20G首月免費 阿裡雲 Logstash 2核4G首月免費
DB 與 Elasticsearch 混合應用之資料實時同步
DB 與 Elasticsearch 混合應用之資料實時同步