<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

介紹4種常用的MySQL同步ES方案

jf_ro2CN3Fa ? 來源:樓仔 ? 2023-11-20 10:45 ? 次閱讀

1. 前言

在實際項目開發中,我們經常將 MySQL 作為業務數據庫,ES 作為查詢數據庫,用來實現讀寫分離,緩解 MySQL 數據庫的查詢壓力,應對海量數據的復雜查詢。

這其中有一個很重要的問題,就是如何實現 MySQL 數據庫和 ES 的數據同步,今天和大家聊聊 MySQL 和 ES 數據同步的各種方案。

我們先看看下面 4 種常用的數據同步方案。

2. 數據同步方案

2.1 同步雙寫

這是一種最為簡單的方式,在將數據寫到 MySQL 時,同時將數據寫到 ES。

fd5f81fc-8748-11ee-939d-92fbcf53809c.png

優點:

業務邏輯簡單;

實時性高。

缺點:

硬編碼,有需要寫入 MySQL 的地方都需要添加寫入 ES 的代碼;

業務強耦合;

存在雙寫失敗丟數據風險;

性能較差,本來 MySQL 的性能不是很高,再加一個 ES,系統的性能必然會下降。

2.2 異步雙寫

針對多數據源寫入的場景,可以借助 MQ 實現異步的多源寫入。

fd7a5838-8748-11ee-939d-92fbcf53809c.png

優點:

性能高;

不易出現數據丟失問題,主要基于 MQ 消息的消費保障機制,比如 ES 宕機或者寫入失敗,還能重新消費 MQ 消息;

多源寫入之間相互隔離,便于擴展更多的數據源寫入。

缺點:

硬編碼問題,接入新的數據源需要實現新的消費者代碼;

系統復雜度增加,引入了消息中間件;

MQ是異步消費模型,用戶寫入的數據不一定可以馬上看到,造成延時。

2.3 基于 SQL 抽取

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

數據庫的相關表中增加一個字段為 timestamp 的字段,任何 CURD 操作都會導致該字段的時間發生變化;

原來程序中的 CURD 操作不做任何變化;

增加一個定時器程序,讓該程序按一定的時間周期掃描指定的表,把該時間段內發生變化的數據提取出來;

逐條寫入到 ES 中。

fd8737d8-8748-11ee-939d-92fbcf53809c.png

優點:

不改變原來代碼,沒有侵入性、沒有硬編碼;

沒有業務強耦合,不改變原來程序的性能;

Worker 代碼編寫簡單不需要考慮增刪改查。

缺點:

時效性較差,由于是采用定時器根據固定頻率查詢表來同步數據,盡管將同步周期設置到秒級,也還是會存在一定時間的延遲;

對數據庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。

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

2.4 基于 Binlog 實時同步

上面三種方案要么有代碼侵入,要么有硬編碼,要么有延遲,那么有沒有一種方案既能保證數據同步的實時性又沒有代入侵入呢?

當然有,可以利用 MySQL 的 Binlog 來進行同步。

fd981472-8748-11ee-939d-92fbcf53809c.png

具體步驟如下:

讀取 MySQL 的 Binlog 日志,獲取指定表的日志信息;

將讀取的信息轉為 MQ;

編寫一個 MQ 消費程序;

不斷消費 MQ,每消費完一條消息,將消息寫入到 ES 中。

優點:

沒有代碼侵入、沒有硬編碼;

原有系統不需要任何變化,沒有感知;

性能高;

業務解耦,不需要關注原來系統的業務邏輯。

缺點:

構建 Binlog 系統復雜;

如果采用 MQ 消費解析的 Binlog 信息,也會像方案二一樣存在 MQ 延時的風險。

3. 數據遷移工具選型

對于上面 4 種數據同步方案,“基于 Binlog 實時同步”方案是目前最常用的,也誕生了很多優秀的數據遷移工具,這里主要對這些遷移工具進行介紹。

這些數據遷移工具,很多都是基于 Binlog 訂閱的方式實現,模擬一個 MySQL Slave 訂閱 Binlog 日志,從而實現 CDC (Change Data Capture),將已提交的更改發送到下游,包括 INSERT、DELETE、UPDATE。

至于如何偽裝?大家需要先了解 MySQL 的主從復制原理,需要學習這塊知識的同學,可以看我之前寫的高并發教程,里面有詳細講解。

3.1 Cannel

基于數據庫增量日志解析,提供增量數據訂閱&消費,目前主要支持 MySQL。

Canal 原理就是偽裝成 MySQL 的從節點,從而訂閱 master 節點的 Binlog 日志,主要流程為:

Canal 服務端向 MySQL 的 master 節點傳輸 dump 協議;

MySQL 的 master 節點接收到 dump 請求后推送 Binlog 日志給 Canal 服務端,解析 Binlog 對象(原始為 byte 流)轉成 Json 格式;

Canal 客戶端通過 TCP 協議或 MQ 形式監聽 Canal 服務端,同步數據到 ES。

fda32ec0-8748-11ee-939d-92fbcf53809c.png

下面是 Cannel 執行的核心流程,其中 Binlog Parser 主要負責 Binlog 的提取、解析和推送,EventSink 負責數據的過濾 、路由和加工,僅作了解即可。

fdc3d328-8748-11ee-939d-92fbcf53809c.png

3.2 阿里云 DTS

數據傳輸服務 DTS(Data Transmission Service)支持 RDBMS、NoSQL、OLAP 等多種數據源之間的數據傳輸。

它提供了數據遷移、實時數據訂閱及數據實時同步等多種數據傳輸方式。相對于第三方數據流工具,DTS 提供豐富多樣、高性能、高安全可靠的傳輸鏈路,同時它提供了諸多便利功能,極大方便了傳輸鏈路的創建及管理。

特點:

多數據源:支持 RDBMS、NoSQL、OLAP 等多種數據源間的數據傳輸;

多傳輸方式:支持多種傳輸方式,包括數據遷移、實時數據訂閱及數據實時同步;

高性能:底層采用了多種性能優化措施,全量數據遷移高峰期時性能可以達到70MB/s,20萬的TPS,使用高規格服務器來保證每條遷移或同步鏈路都能擁有良好的傳輸性能;

高可用:底層為服務集群,如果集群內任何一個節點宕機或發生故障,控制中心都能夠將這個節點上的所有任務快速切換到其他節點上,鏈路穩定性高;

簡單易用:提供可視化管理界面,提供向導式的鏈路創建流程,用戶可以在其控制臺簡單輕松地創建傳輸鏈路;

需要付費。

再看看 DTS 的系統架構。

fdd2349a-8748-11ee-939d-92fbcf53809c.png

高可用:數據傳輸服務內部每個模塊都有主備架構,保證系統高可用。容災系統實時檢測每個節點的健康狀況,一旦發現某個節點異常,會將鏈路快速切換到其他節點。

數據源地址動態適配:對于數據訂閱及同步鏈路,容災系統還會監測數據源的連接地址切換等變更操作,一旦發現數據源發生連接地址變更,它會動態適配數據源新的連接方式,在數據源變更的情況下,保證鏈路的穩定性。

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。

fde5760e-8748-11ee-939d-92fbcf53809c.png

快速變化的消費者直接從 Relay 中取事件;

如果一個消費者的數據更新大幅落后,它要的數據就不在 Relay 的日志中,而是需要請求 Bootstrap 服務,返回的將會是自消費者上次處理變更之后的所有數據變更快照。

3.4 其它

Flink

有界數據流和無界數據流上進行有狀態計算分布式處理引擎和框架。

CloudCanal

數據同步遷移系統,商業產品。

Maxwell

使用簡單,直接將數據變更輸出為json字符串,不需要再編寫客戶端。

DRD

阿里巴巴集團自主研發的分布式數據庫中間件產品,專注于解決單機關系型數據庫擴展性問題,具備輕量(無狀態)、靈活、穩定、高效等特性。

yugong

幫助用戶完成從 Oracle 數據遷移到 MySQL。

4. 后記

通過這篇文章,讓你知道 MySQL 和其它多維數據的同步方案,以及常用的數據遷移工具,幫助你更好選型。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 定時器
    +關注

    關注

    23

    文章

    3154

    瀏覽量

    112451
  • SQL
    SQL
    +關注

    關注

    1

    文章

    740

    瀏覽量

    43530
  • MySQL
    +關注

    關注

    1

    文章

    776

    瀏覽量

    26079
  • MYSQL數據庫
    +關注

    關注

    0

    文章

    95

    瀏覽量

    9290

原文標題:4 種 MySQL 同步 ES 方案,yyds!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux中常用MySQL運維腳本

    在Linux中,使用MySQL進行常見的運維任務時,可以編寫一些腳本來簡化操作。以下是一些常用MySQL運維腳本,希望對你的工作有所幫助。
    發表于 09-07 09:49 ?376次閱讀

    FPGA 設計的四常用思想與技巧

    FPGA 設計的四常用思想與技巧FPGA設計的四常用思想與技巧 討論的四常用FPGA/C
    發表于 08-11 10:30

    0基礎學Mysql:mysql入門視頻教程!

    的性能調優技術掌握基于MySQL的架構設計方案課程目錄:第1節 MySQL課程介紹MySQL的基礎概念(1)第2節
    發表于 07-08 10:51

    MySql常用操作整理

    MySql——基本知識整理
    發表于 04-09 13:35

    MySQL及其常用命令介紹

    MySQL 數據庫常用命令
    發表于 04-12 13:19

    linux配置mysql的兩方式

    方式:a、$ find / -name mysql–print 查看是否有mysql文件夾b、$ netstat -a –n 查看是否打開3306端口
    發表于 07-26 07:46

    mysql數據庫優化方案

    MySQL千萬級大表優化解決方案
    發表于 08-19 12:18

    Canal是如何同步mysql的增量數據的

    Canal是什么?Canal的工作原理是什么?Canal是如何同步mysql的增量數據的?
    發表于 10-27 07:41

    mysql數據庫同步原理

    了數據庫的訪問壓力,提升整個系統的性能和可用性,降低了大訪問量引發數據庫宕機的故障率。 binlog簡介 MySQL主從同步是基于binlog文件主從復制實現,為了更好的理解主從同步過程,這里簡單
    發表于 09-28 11:49 ?0次下載
    <b class='flag-5'>mysql</b>數據庫<b class='flag-5'>同步</b>原理

    Mysql主從同步的實現原理

    MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬于 Oracle 旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL
    發表于 12-26 15:56 ?2877次閱讀
    <b class='flag-5'>Mysql</b>主從<b class='flag-5'>同步</b>的實現原理

    深度解讀ES+Redis+MySQL的高可用架構設計

    我們有兩個機房,分別是機房 A 和機房 B。我們把 ES 主集群部署在機房 A,把 ES 備集群部署在機房 B。會員系統的讀寫都在 ES 主集群,通過 MQ 將數據同步
    的頭像 發表于 06-01 10:09 ?513次閱讀
    深度解讀<b class='flag-5'>ES+Redis+MySQL</b>的高可用架構設計

    MySQL運維常用腳本

    進入MySQL:啟動MySQL Command Line Client(MySQL的DOS界面),直接輸入安裝時的密碼即可。此時的提示符是:mysql>
    的頭像 發表于 07-29 11:23 ?415次閱讀

    MySQLES的4種常用數據同步方案

    如何實現 MySQL 數據庫和 ES 的數據同步,今天和大家聊聊 MySQLES 數據同步
    發表于 08-09 11:36 ?418次閱讀
    <b class='flag-5'>MySQL</b>到<b class='flag-5'>ES</b>的4種<b class='flag-5'>常用</b>數據<b class='flag-5'>同步</b><b class='flag-5'>方案</b>

    mysql增刪改查語句以及常用方法

    MySQL是一種熱門的關系型數據庫管理系統,廣泛用于各種Web應用程序和企業級應用程序中。本文將詳細介紹MySQL中的增刪改查語句以及常用方法。 一、增加數據 在
    的頭像 發表于 11-16 15:36 ?655次閱讀

    MySQL常用語句

    MySQL是一個關系型數據庫管理系統,廣泛應用于Web應用程序的開發以及數據管理領域。在使用MySQL時,有一些常用的語句可以幫助我們進行數據的操作和管理。接下來,我將詳細介紹
    的頭像 發表于 11-21 11:11 ?305次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>