1. 前言
在項目開發(fā)中,我們經常將 MySQL 作為業(yè)務數據庫,ES 作為查詢數據庫,用來實現(xiàn)讀寫分離,緩解 MySQL 數據庫的查詢壓力,應對海量數據的復雜查詢。
這其中有一個很重要的問題,就是如何實現(xiàn) MySQL 數據庫和 ES 的數據同步,今天和大家聊聊 MySQL 和 ES 數據同步的各種方案。
2. 數據同步方案
2.1 同步雙寫
這是一種最為簡單的方式,在將數據寫到 MySQL 時,同時將數據寫到 ES。
優(yōu)點:
- 業(yè)務邏輯簡單;
- 實時性高。
缺點: - 硬編碼,有需要寫入 MySQL 的地方都需要添加寫入 ES 的代碼;
- 業(yè)務強耦合;
- 存在雙寫失敗丟數據風險;
- 性能較差,本來 MySQL 的性能不是很高,再加一個 ES,系統(tǒng)的性能必然會下降。
2.2 異步雙寫
針對多數據源寫入的場景,可以借助 MQ 實現(xiàn)異步的多源寫入。
優(yōu)點:
- 性能高;
- 不易出現(xiàn)數據丟失問題,主要基于 MQ 消息的消費保障機制,比如 ES 宕機或者寫入失敗,還能重新消費 MQ 消息;
- 多源寫入之間相互隔離,便于擴展更多的數據源寫入。
缺點: - 硬編碼問題,接入新的數據源需要實現(xiàn)新的消費者代碼;
- 系統(tǒng)復雜度增加,引入了消息中間件;
- MQ是異步消費模型,用戶寫入的數據不一定可以馬上看到,造成延時。
2.3 基于 SQL 抽取
如果對實時性要求不高的情況下,可以考慮用定時器來處理:
1.數據庫的相關表中增加一個 timestamp 的字段,任何 CUD 操作都會導致該字段的時間發(fā)生變化;
2.原來程序中的 CUD 操作不做任何變化;
3.增加一個定時器程序,按一定的時間周期掃描指定的表,把該時間段內發(fā)生變化的數據提取出來;
4.逐條寫入到 ES。
優(yōu)點:
- 不改變原來代碼,沒有侵入性、沒有硬編碼;
- 沒有業(yè)務強耦合,不改變原來程序的性能;
- Worker 代碼編寫簡單不需要考慮增刪改查。
缺點: - 時效性較差,由于是采用定時器根據固定頻率查詢表來同步數據,盡管將同步周期設置到秒級,也還是會存在一定時間的延遲;
- 對數據庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。
經典方案:借助 Logstash 實現(xiàn)數據同步,其底層實現(xiàn)原理就是根據配置定期使用 SQL 查詢新增的數據,然后寫入 ES,實現(xiàn)數據的增量同步。
2.4 基于SQL寫操作的后快照
1.從數據庫連接獲取表的元數據信息:TableMeta、ColumnMeta、IndexMeta
2.解析SQL的類型(增、刪、改),獲取記錄的主鍵信息(列名、類型、值),修改的字段信息(列名、類型、值)
3.根據上述信息生成查詢SQL,查詢修改后的數據
4.將修改后的數據寫入ES
優(yōu)點:
- 動態(tài)代理,不改變原來代碼,沒有侵入性、沒有硬編碼;
- 沒有業(yè)務強耦合;
- 實時性強,將ES納入數據庫的事務中,保證數據的一致性。
缺點: - 使用動態(tài)代理,在業(yè)務流程中增加了額外的復雜度,影響原來程序的性能。
2.5 基于 Binlog 實時同步
上面4種方案要么有代碼侵入,要么有硬編碼,要么有延遲,要么增加性能開銷,那么有沒有更好的方案呢?
當然有,可以利用 MySQL 的 Binlog 來進行同步。
具體步驟如下:
- 讀取 MySQL 的 Binlog 日志,獲取指定表的日志信息;
- 將讀取的日志信息轉為 MQ的消息,并寫入MQ;
- 編寫一個 MQ 消費程序;
- 不斷消費MQ的消息,將消息寫入 ES。
優(yōu)點: - 沒有代碼侵入、沒有硬編碼;
- 原有系統(tǒng)不需要任何變化,沒有感知;
- 性能高;
- 業(yè)務解耦,不需要關注原來系統(tǒng)的業(yè)務邏輯。
缺點: - 構建 Binlog 系統(tǒng)復雜;
- 如果采用 MQ 傳送已解析的 Binlog 信息,也會像方案2.2一樣存在 MQ 延時的風險。
3. 數據遷移工具
對于上述 5 種數據同步方案,“基于 Binlog 實時同步”方案是目前最常用的,也誕生了很多優(yōu)秀的數據遷移工具,這里主要對這些遷移工具進行介紹。
這些數據遷移工具,很多都是基于 Binlog 訂閱的方式實現(xiàn),模擬一個 MySQL Slave 訂閱 Binlog 日志,從而實現(xiàn) CDC(Change Data Capture),將已提交的更改發(fā)送到下游,包括 INSERT、DELETE、UPDATE。
3.1 Cannel
基于數據庫增量日志解析,提供增量數據訂閱&消費,目前主要支持 MySQL。
Canal 原理就是偽裝成 MySQL 的從節(jié)點,從而訂閱 master 節(jié)點的 Binlog 日志,主要流程為:
- Canal 服務端向 MySQL 的 master 節(jié)點傳輸 dump 協(xié)議;
- MySQL 的 master 節(jié)點接收到 dump 請求后,推送 Binlog 日志給 Canal 服務端,解析 Binlog 對象(原始為 byte 流)轉成 Json 格式;
- Canal 客戶端通過 TCP 協(xié)議或 MQ 形式監(jiān)聽 Canal 服務端,同步數據到 ES。
下面是 Cannel 執(zhí)行的核心流程,其中 Binlog Parser 主要負責 Binlog 的提取、解析和推送,EventSink 負責數據的過濾 、路由和加工,僅作了解即可。
3.2 阿里云 DTS
數據傳輸服務 DTS(Data Transmission Service)支持 RDBMS、NoSQL、OLAP 等多種數據源之間的數據傳輸。
它提供了數據遷移、實時數據訂閱及數據實時同步等多種數據傳輸方式。相對于第三方數據流工具,DTS 提供豐富多樣、高性能、高安全、可靠的傳輸鏈路,同時它提供了諸多便利功能,極大方便了傳輸鏈路的創(chuàng)建及管理。
特點:
- 多數據源:支持 RDBMS、NoSQL、OLAP 等多種數據源間的數據傳輸;
- 多傳輸方式:支持多種傳輸方式,包括數據遷移、實時數據訂閱及數據實時同步;
- 高性能:底層采用了多種性能優(yōu)化措施,全量數據遷移高峰期時性能可以達到70MB/s,20萬的TPS,使用高規(guī)格服務器來保證每條遷移或同步鏈路都能擁有良好的傳輸性能;
- 高可用:底層為服務集群,如果集群內任何一個節(jié)點宕機或發(fā)生故障,控制中心都能夠將失敗節(jié)點上的所有任務快速切換到其他節(jié)點上,鏈路穩(wěn)定性高;
- 簡單易用:提供可視化管理界面,提供向導式的鏈路創(chuàng)建流程,用戶可以在其控制臺簡單輕松地創(chuàng)建傳輸鏈路;
- 需要付費。
再看看 DTS 的系統(tǒng)架構。 - 高可用:數據傳輸服務內部每個模塊都有主備架構,保證系統(tǒng)高可用。容災系統(tǒng)實時檢測每個節(jié)點的健康狀況,一旦發(fā)現(xiàn)某個節(jié)點異常,會將鏈路快速切換到其他節(jié)點。
- 數據源地址動態(tài)適配:對于數據訂閱及同步鏈路,容災系統(tǒng)還會監(jiān)測數據源的連接地址切換等變更操作,一旦發(fā)現(xiàn)數據源發(fā)生連接地址變更,它會動態(tài)適配數據源新的連接方式,在數據源變更的情況下,保證鏈路的穩(wěn)定性。
3.3 Databus
Databus 是一個低延遲、可靠的、支持事務的、保持一致性的數據變更抓取系統(tǒng)。由 LinkedIn 于 2013 年開源。
Databus 通過挖掘數據庫日志的方式,將數據庫變更實時、可靠的從數據庫拉取出來,業(yè)務可以通過定制化 client 實時獲取變更并進行其他業(yè)務邏輯。
特點:文章來源:http://www.zghlxwxcb.cn/news/detail-847159.html
- 多數據源:Databus 支持多種數據來源的變更抓取,包括 Oracle 和 MySQL。
- 可擴展、高度可用:Databus 能擴展到支持數千消費者和數據來源,同時保持高度可用性。
- 事務按序提交:Databus 能保持來源數據庫中的事務完整性,并按照事務分組和來源的提交順尋交付變更事件。
- 低延遲、支持多種訂閱機制:數據源變更完成后,Databus 能在毫秒級內將事務提交給消費者。同時,消費者使用Databus 中的服務器端過濾功能,可以只獲取自己需要的特定數據。
- 無限回溯:對消費者支持無限回溯能力,例如當消費者需要產生數據的完整拷貝時,它不會對數據庫產生任何額外負擔。當消費者的數據大大落后于來源數據庫時,也可以使用該功能。
再看看 Databus 的系統(tǒng)架構。
Databus 由 Relays、Bootstrap 服務和 Client lib 等組成,Bootstrap 服務中包括 Bootstrap Producer 和 Bootstrap Server。 - 快速變化的消費者直接從 Relay 中取事件;
- 如果一個消費者的數據更新大幅落后,它要的數據就不在 Relay 的日志中,而是需要請求 Bootstrap 服務,返回的將會是自消費者上次處理變更之后的所有數據變更快照。
4. 后記
通過這篇文章,讓你知道 MySQL 和ES的同步方案,以及常用的數據遷移工具。文章來源地址http://www.zghlxwxcb.cn/news/detail-847159.html
到了這里,關于MySQL同步ES方案的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!