MySQL 實戰 4 種將數據同步到ES方案

文章目錄
  • 1. 前言
  • 2. 數據同步方案
    • 2.1 同步雙寫
    • 2.2 異步雙寫
    • 2.3 定時更新
    • 2.4 基于 Binlog 實時同步
  • 3. 數據遷移工具選型
    • 3.1 Canal
    • 3.2 阿里云 DTS
    • 3.3 Databus
    • 3.4 Databus和Canal對比
    • 3.4 其它
  • 4. 后記

上周聽到公司新同事分享 MySQL 同步數據到 ES 的方案,發現很有意思,感覺有必要將這塊知識點再總結提煉一下,就有了這篇文章。

1. 前言

在實際項目開發中,我們經常將 MySQL 作為業務數據庫,ES 作為查詢數據庫,用來實現讀寫分離,緩解 MySQL 數據庫的查詢壓力,應對海量數據的復雜查詢。
這其中有一個很重要的問題,就是如何實現 MySQL 數據庫和 ES 的數據同步,今天和大家聊聊 MySQL 和 ES 數據同步的各種方案。
我們先看看下面 4 種常用的數據同步方案。

2. 數據同步方案

2.1 同步雙寫

這是一種最為簡單的方式,在將數據寫到 MySQL 時,同時將數據寫到 ES。
在這里插入圖片描述
優點:

  • 業務邏輯簡單;
  • 實時性高。
    缺點:
  • 硬編碼,有需要寫入 MySQL 的地方都需要添加寫入 ES 的代碼;
  • 業務強耦合;
  • 存在雙寫失敗丟數據風險;
  • 性能較差,本來 MySQL 的性能不是很高,再加一個 ES,系統的性能必然會下降。

2.2 異步雙寫

針對多數據源寫入的場景,可以借助 MQ 實現異步的多源寫入。
在這里插入圖片描述
優點:

  • 性能高;
  • 不易出現數據丟失問題,主要基于 MQ 消息的消費保障機制,比如 ES 宕機或者寫入失敗,還能重新消費 MQ 消息;
  • 多源寫入之間相互隔離,便于擴展更多的數據源寫入。
    缺點:
  • 硬編碼問題,接入新的數據源需要實現新的消費者代碼;
  • 系統復雜度增加,引入了消息中間件;
  • MQ是異步消費模型,用戶寫入的數據不一定可以馬上看到,造成延時。

2.3 定時更新

上面兩種方案中都存在硬編碼問題,代碼的侵入性太強,如果對實時性要求不高的情況下,可以考慮用定時器來處理:

  1. 數據庫的相關表中增加一個字段為 timestamp 的字段,任何 CURD 操作都會導致該字段的時間發生變化;
  2. 原來程序中的 CURD 操作不做任何變化;
  3. 增加一個定時器程序,讓該程序按一定的時間周期掃描指定的表,把該時間段內發生變化的數據提取出來;
  4. 逐條寫入到 ES 中。
    在這里插入圖片描述

優點:

  • 不改變原來代碼,沒有侵入性、沒有硬編碼;
  • 沒有業務強耦合,不改變原來程序的性能;
  • Worker 代碼編寫簡單不需要考慮增刪改查。
    缺點:
  • 時效性較差,由于是采用定時器根據固定頻率查詢表來同步數據,盡管將同步周期設置到秒級,也還是會存在一定時間的延遲;
  • 對數據庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。

經典方案:借助 Logstash 實現數據同步,其底層實現原理就是根據配置定期使用 SQL 查詢新增的數據寫入 ES 中,實現數據的增量同步。

2.4 基于 Binlog 實時同步

上面三種方案要么有代碼侵入,要么有硬編碼,要么有延遲,那么有沒有一種方案既能保證數據同步的實時性又沒有代入侵入呢?當然有,可以利用 MySQL 的 Binlog 來進行同步。
在這里插入圖片描述
具體步驟如下:

  • 讀取 MySQL 的 Binlog 日志,獲取指定表的日志信息;
  • 將讀取的信息轉為 MQ;
  • 編寫一個 MQ 消費程序;
  • 不斷消費 MQ,每消費完一條消息,將消息寫入到 ES 中。
    優點:
  • 沒有代碼侵入、沒有硬編碼;
  • 原有系統不需要任何變化,沒有感知;
  • 性能高;
  • 業務解耦,不需要關注原來系統的業務邏輯。
    缺點:
  • 構建 Binlog 系統復雜;
  • 如果采用 MQ 消費解析的 Binlog 信息,也會像方案二一樣存在 MQ 延時的風險。

3. 數據遷移工具選型

對于上面 4 種數據同步方案,“基于 Binlog 實時同步”方案是目前最常用的,也誕生了很多優秀的數據遷移工具,這里主要對這些遷移工具進行介紹。
這些數據遷移工具,很多都是基于 Binlog 訂閱的方式實現,模擬一個 MySQL Slave 訂閱 Binlog 日志,從而實現 CDC(Change Data Capture),將已提交的更改發送到下游,包括 INSERT、DELETE、UPDATE。

3.1 Canal

基于數據庫增量日志解析,提供增量數據訂閱&消費,目前主要支持 MySQL。
Canal 原理就是偽裝成 MySQL 的從節點,從而訂閱 master 節點的 Binlog 日志,主要流程為:

  1. Canal 服務端向 MySQL 的 master 節點傳輸 dump 協議;
  2. MySQL 的 master 節點接收到 dump 請求后推送 Binlog 日志給 Canal 服務端,解析 Binlog 對象(原始為 byte 流)轉成 Json 格式;
  3. Canal 客戶端通過 TCP 協議或 MQ 形式監聽 Canal 服務端,同步數據到 ES。
    在這里插入圖片描述
    下面是 Cannel 執行的核心流程,其中 Binlog Parser 主要負責 Binlog 的提取、解析和推送,EventSink 負責數據的過濾 、路由和加工,僅作了解即可。
    在這里插入圖片描述

3.2 阿里云 DTS

數據傳輸服務 DTS(Data Transmission Service)支持 RDBMS、NoSQL、OLAP 等多種數據源之間的數據傳輸。
它提供了數據遷移、實時數據訂閱及數據實時同步等多種數據傳輸方式。相對于第三方數據流工具,DTS 提供豐富多樣、高性能、高安全可靠的傳輸鏈路,同時它提供了諸多便利功能,極大方便了傳輸鏈路的創建及管理。
特點:

  • 多數據源:支持 RDBMS、NoSQL、OLAP 等多種數據源間的數據傳輸;
  • 多傳輸方式:支持多種傳輸方式,包括數據遷移、實時數據訂閱及數據實時同步;
  • 高性能:底層采用了多種性能優化措施,全量數據遷移高峰期時性能可以達到70MB/s,20萬的TPS,使用高規格服務器來保證每條遷移或同步鏈路都能擁有良好的傳輸性能;
  • 高可用:底層為服務集群,如果集群內任何一個節點宕機或發生故障,控制中心都能夠將這個節點上的所有任務快速切換到其他節點上,鏈路穩定性高;
  • 簡單易用:提供可視化管理界面,提供向導式的鏈路創建流程,用戶可以在其控制臺簡單輕松地創建傳輸鏈路;
  • 需要付費。

再看看 DTS 的系統架構。
在這里插入圖片描述

  • 高可用:數據傳輸服務內部每個模塊都有主備架構,保證系統高可用。容災系統實時檢測每個節點的健康狀況,一旦發現某個節點異常,會將鏈路快速切換到其他節點。
  • 數據源地址動態適配:對于數據訂閱及同步鏈路,容災系統還會監測數據源的連接地址切換等變更操作,一旦發現數據源發生連接地址變更,它會動態適配數據源新的連接方式,在數據源變更的情況下,保證鏈路的穩定性。
    更多內容,請查看阿里官方文檔:https://help.aliyun.com/product/26590.html

3.3 Databus

Databus 是一個低延遲、可靠的、支持事務的、保持一致性的數據變更抓取系統。由 LinkedIn 于 2013 年開源。
Databus 通過挖掘數據庫日志的方式,將數據庫變更實時、可靠的從數據庫拉取出來,業務可以通過定制化 client 實時獲取變更并進行其他業務邏輯。
特點:

  • 多數據源:Databus 支持多種數據來源的變更抓取,包括 Oracle 和 MySQL。
  • 可擴展、高度可用:Databus 能擴展到支持數千消費者和事務數據來源,同時保持高度可用性。
  • 事務按序提交:Databus 能保持來源數據庫中的事務完整性,并按照事務分組和來源的提交順尋交付變更事件。
  • 低延遲、支持多種訂閱機制:數據源變更完成后,Databus 能在毫秒級內將事務提交給消費者。同時,消費者使用D atabus 中的服務器端過濾功能,可以只獲取自己需要的特定數據。
  • 無限回溯:對消費者支持無限回溯能力,例如當消費者需要產生數據的完整拷貝時,它不會對數據庫產生任何額外負擔。當消費者的數據大大落后于來源數據庫時,也可以使用該功能。
    再看看 Databus 的系統架構。
    Databus 由 Relays、bootstrap 服務和 Client lib 等組成,Bootstrap 服務中包括 Bootstrap Producer 和 Bootstrap Server。
    在這里插入圖片描述
  • 快速變化的消費者直接從 Relay 中取事件;
  • 如果一個消費者的數據更新大幅落后,它要的數據就不在 Relay 的日志中,而是需要請求 Bootstrap 服務,返回的將會是自消費者上次處理變更之后的所有數據變更快照。
    開源地址:https://github.com/linkedin/databus

3.4 Databus和Canal對比

在這里插入圖片描述

3.4 其它

Flink
● 有界數據流和無界數據流上進行有狀態計算分布式處理引擎和框架。
● 官網地址:https://flink.apache.org

CloudCanal
● 數據同步遷移系統,商業產品。
● 官網地址:https://www.clougence.com/utm_source=wwek

Maxwell
● 使用簡單,直接將數據變更輸出為json字符串,不需要再編寫客戶端。
● 官網地址:http://maxwells-daemon.io

DRD
● 阿里巴巴集團自主研發的分布式數據庫中間件產品,專注于解決單機關系型數據庫擴展性問題,具備輕量(無狀態)、靈活、穩定、高效等特性。
● 官方地址:https://www.aliyun.com/product/drds

yugong
● 幫助用戶完成從 Oracle 數據遷移到 MySQL。
● 訪問地址:https://github.com/alibaba/yugong

4. 后記

通過這篇文章,讓你知道 MySQL 和其它多維數據的同步方案,以及常用的數據遷移工具,幫助你更好選型。
寫文章不是目的,最重要的是如何應用到項目中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66553.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛幻基礎-1:cpu挑選(14600kf)

能幫到你的話,就給個贊吧 😘 文章目錄 ue非常吃cpu拉滿主頻打開項目編寫藍圖運行原因 時間長 關于壓力測試 本文以14600kf為例,雙12購入,7月份產。 ue非常吃cpu 經本人測試,ue是非常吃cpu的。 拉滿主頻 無論任何時間…

QTableWidget的簡單使用

1.最簡單的表格示例&#xff1a; ui->tableWidget->setRowCount(2);// 設置行數ui->tableWidget->setColumnCount(3);// 設置列數&#xff0c;一定要放在設置行表頭之前QStringList rowHeaderList;// 行表頭rowHeaderList << QStringLiteral("姓名"…

深入探究分布式日志系統 Graylog:架構、部署與優化

文章目錄 一、Graylog簡介二、Graylog原理架構三、日志系統對比四、Graylog部署傳統部署MongoDB部署OS或者ES部署Garylog部署容器化部署 五、配置詳情六、優化網絡和 REST APIMongoDB 七、升級八、監控九、常見問題及處理 一、Graylog簡介 Graylog是一個簡單易用、功能較全面的…

2024年我的技術成長之路

2024年我的技術成長之路 大家好&#xff0c;我是小寒。又到年底了&#xff0c;一年過得真快啊&#xff01;趁著這次活動的機會&#xff0c;和大家聊聊我這一年在技術上的收獲和踩過的坑。 說實話&#xff0c;今年工作特別忙&#xff0c;寫博客的時間比去年少了不少。不過還是…

嵌入式硬件篇---基本組合邏輯電路

文章目錄 前言基本邏輯門電路1.與門&#xff08;AND Gate&#xff09;2.或門&#xff08;OR Gate&#xff09;3.非門&#xff08;NOT Gate&#xff09;4.與非門&#xff08;NAND Gate&#xff09;5.或非門&#xff08;NOR Gate&#xff09;6.異或門&#xff08;XOR Gate&#x…

數據庫管理-第285期 Oracle 23ai:深入淺出向量索引(20250117)

數據庫管理285期 20245-01-17 數據庫管理-第285期 Oracle 23ai&#xff1a;深入淺出向量索引&#xff08;20250117&#xff09;1 HNSW事務支持解讀 2 IVF分區支持解讀 3 混合向量索引何時選擇混合向量索引為何選擇混合向量索引 總結 數據庫管理-第285期 Oracle 23ai&#xff1a…

行人識別檢測數據集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的標注都支持,準確識別率可達99.5%

作者簡介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing從事網格計算&#xff0c;淘米網&#xff0c;網易從事游戲服務器開發&#xff0c;擁有豐富的C&#xff0c;go等語言開發經驗&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等數據庫&#xff0c;設計模…

【Spring】原型 Bean 被固定

問題描述 在定義 Bean 時&#xff0c;有時候我們會使用原型 Bean&#xff0c;例如定義如下&#xff1a; Service Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class ServiceImpl { }然后我們按照下面的方式去使用它&#xff1a; RestController public class Hello…

2024年美賽C題評委文章及O獎論文解讀 | AI工具如何影響數學建模?從評委和O獎論文出發-O獎論文做對了什么?

模型假設僅僅是簡單陳述嗎&#xff1f;允許AI的使用是否降低了比賽難度&#xff1f;還在依賴機器學習的模型嗎&#xff1f;處理題目的方法有哪些&#xff1f;O獎論文的優點在哪里&#xff1f; 本文調研了當年賽題的評委文章和O獎論文&#xff0c;這些問題都會在文章中一一解答…

PyTorch框架——基于深度學習YOLOv8神經網絡學生課堂行為檢測識別系統

基于YOLOv8深度學習的學生課堂行為檢測識別系統&#xff0c;其能識別三種學生課堂行為&#xff1a;names: [舉手, 讀書, 寫字] 具體圖片見如下&#xff1a; 第一步&#xff1a;YOLOv8介紹 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 號開源的 YOLOv5 的下一個重大更新版本…

kafka學習筆記6 ACL權限 —— 筑夢之路

在Kafka中&#xff0c;ACL&#xff08;Access Control List&#xff09;是用來控制誰可以訪問Kafka資源&#xff08;如主題、消費者組等&#xff09;的權限機制。ACL配置基于Kafka的kafka-acls.sh工具&#xff0c;能夠管理對資源的讀取、寫入等操作權限。 ACL介紹 Kafka的ACL是…

探秘自然地理:從太陽到地球的奇妙之旅與災害預警

在浩瀚無垠的宇宙中&#xff0c;我們的地球與太陽緊密相連&#xff0c;它們的奧秘和變化&#xff0c;時刻影響著我們的生活。今天&#xff0c;就讓我們一同深入探索自然地理的基礎知識&#xff0c;揭開太陽與地球的神秘面紗&#xff0c;同時了解那些可能給我們帶來巨大影響的自…

領域算法 - 負載均衡算法

負載均衡算法 文章目錄 負載均衡算法一&#xff1a;常規負載均衡算法二&#xff1a;Nginx負載均衡算法 一&#xff1a;常規負載均衡算法 二&#xff1a;Nginx負載均衡算法 # 定義負載均衡設備的Ip及設備狀態 upstream bakend {ip_hash; server 127.0.0.1:9090 down; server…

Access數據庫教案(Excel+VBA+Access數據庫SQL Server編程)

文章目錄: 一:Access基礎知識 1.前言 1.1 基本流程 1.2 基本概念?? 2.使用步驟方法 2.1 表【設計】 2.1.1 表的理論基礎 2.1.2 Access建庫建表? 2.1.3 表的基本操作 2.2 SQL語句代碼【設計】 2.3 窗體【交互】? 2.3.1 多方式創建窗體 2.3.2 窗體常用的控件 …

圖片生成Prompt編寫技巧

1. 圖片情緒&#xff08;場景氛圍&#xff09; 一張圖片一般都會有一個情緒基調&#xff0c;因為作畫本質上也是在傳達一些情緒&#xff0c;一般都會借助圖片的氛圍去轉達。例如&#xff1a;比如家庭聚會一般是歡樂、喜樂融融。斷壁殘垣一般是悲涼。還有蕭瑟、孤寂等。 2.補充細…

算法題目總結-鏈表

文章目錄 1.環形鏈表1.答案2.思路 2.兩數相加1.答案2.結果 3.反轉鏈表1.答案2.思路 4.反轉鏈表 II1.答案2.思路 5.K 個一組翻轉鏈表1.答案2.思路 6.刪除鏈表的倒數第 N 個結點1.答案2.思路 7.刪除排序鏈表中的重復元素 II1.答案2.思路 8.旋轉鏈表1.答案2.思路 9.LRU 緩存1.答案…

【Unity3D】3D物體擺放、場景優化案例Demo

目錄 PlaceManager.cs(放置管理類) Ground.cs(地板類) 和 GroundData.cs(地板數據類) 額外知識點說明 1、MeshFilter和MeshRenderer的Bounds區別 2、Gizmos 繪制一個平行于斜面的立方體 通過網盤分享的文件&#xff1a;PlaceGameDemo2.unitypackage 鏈接: https://pan.baid…

OpenEuler學習感悟

在初次接觸 OpenEuler 時&#xff0c;我深感其學習難度較大。它與我之前熟悉的操作系統存在諸多差異&#xff0c;學習過程中&#xff0c;需要理解復雜的內核機制、掌握獨特的系統配置方法。但正是這種挑戰&#xff0c;激發了我深入探索的熱情。 從理論學習入手&#xff0c;我發…

C# OpenCvSharp 部署文檔矯正,包括文檔扭曲/模糊/陰影等情況

目錄 說明 效果 模型 項目 代碼 下載 參考 C# OpenCvSharp 部署文檔矯正&#xff0c;包括文檔扭曲/模糊/陰影等情況 說明 地址&#xff1a;https://github.com/RapidAI/RapidUnDistort 修正文檔扭曲/模糊/陰影等情況&#xff0c;使用onnx模型簡單輕量部署&#xff0c…

CSS 溢出問題及解決方案:實用案例與技巧

在網頁開發中&#xff0c;CSS 的布局和樣式起著至關重要的作用&#xff0c;但經常會遇到一個棘手的問題——溢出問題。溢出是指元素內的內容超出了其設定的容器大小&#xff0c;這不僅會影響頁面的美觀&#xff0c;還可能干擾用戶體驗。本文將詳細探討 CSS 溢出問題的案例&…