Mysql和ES使用匯總

一、mysql和ES在業務上的配合使用

在這里插入圖片描述
一般使用時使用ES 中存儲全文檢索的關鍵字與獲取的商品詳情的id,通過ES查詢獲取查詢商品的列表中展示的數據,通過展示id 操作去獲取展示商品的所有信息。mysql根據id去查詢數據庫數據是很快的;

在這里插入圖片描述

在這里插入圖片描述

為什么ES一般不存儲所有表的數據?因為數據表的所有字段列并不一定參與業務查詢,如果將業務表中超多列的字段全部存儲在ES中反而影響ES的查詢性能。
在實際使用中ES中一般存儲,全文檢索列或者列表展示列字段和id。通過id去數據庫hash散列分庫分表查詢大數據列是比較快的;
在這里插入圖片描述
通過點擊商品詳情獲取商品詳情id,通過點擊id去數據庫查詢獲取所有數據的數據;id在數據庫根據分庫分表策略去查詢,查詢是很快的;

一般情況下使用mysql這種關系型數據庫去為所有的Nosql類型(redis、mogodb、es、clickhos)的數據庫進行兜底數據,因為關系型數據庫支持事務對保持數據的一致性有比較好的支持。但是查詢效率在大數據量的時候比較低。而非關系型數據庫在查詢效率比較高,對數據的事務比較低,對數據的一致性支持比較差。所以使用mysql作為其他nosql類型的數據的兜底支持;

二、mysql和ES的數據同步

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

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

2.1 同步雙寫

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

在這里插入圖片描述

優點:

  • 業務邏輯簡單;
  • 實時性高。

缺點:

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

2.2 異步雙寫

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

  • 性能高;
  • 不易出現數據丟失問題,主要基于 MQ 消息的消費保障機制,比如 ES 宕機或者寫入失敗,還能重新消費 MQ 消息;
  • 多源寫入之間相互隔離,便于擴展更多的數據源寫入。

缺點:

  • 硬編碼問題,接入新的數據源需要實現新的消費者代碼;
  • 系統復雜度增加,引入了消息中間件;
  • MQ是異步消費模型,用戶寫入的數據不一定可以馬上看到,造成延時。

2.3 基于 SQL 抽取

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

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

  • 增加一個定時器程序,讓該程序按一定的時間周期掃描指定的表,把該時間段內發生變化的數據提取出來;
    逐條寫入到 ES 中。
    在這里插入圖片描述
    優點:

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

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

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

缺點:

  • 時效性較差,由于是采用定時器根據固定頻率查詢表來同步數據,盡管將同步周期設置到秒級,也還是會存在一定時間的延遲;
  • 對數據庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。
  • 經典方案:借助 Logstash 實現數據同步,其底層實現原理就是根據配置定期使用 SQL 查詢新增的數據寫入 ES 中,實現數據的增量同步。

2.4 基于 Binlog 實時同步

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

具體步驟如下:

  1. 讀取 MySQL 的 Binlog 日志,獲取指定表的日志信息;
  2. 將讀取的信息轉為 MQ;
  3. 編寫一個 MQ 消費程序;
  4. 不斷消費 MQ,每消費完一條消息,將消息寫入到 ES 中。

優點:

  • 沒有代碼侵入、沒有硬編碼;
  • 原有系統不需要任何變化,沒有感知;
  • 性能高;
  • 業務解耦,不需要關注原來系統的業務邏輯。

缺點:

  • 構建 Binlog 系統復雜;
  • 如果采用 MQ 消費解析的 Binlog 信息,也會像方案二一樣存在 MQ 延時的風險。

三 、數據遷移工具選型

對于上面 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。
    在這里插入圖片描述
    下面是 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 其它

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

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

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

相關文章

JavaScript如何聲明json對象

在JavaScript中,JSON(JavaScript Object Notation)對象實際上是以JavaScript對象的形式表示的。JSON是一種輕量級的數據交換格式,它基于ECMAScript(歐洲計算機協會制定的js規范)的一個子集,采用…

10 - Python文件編程和異常

文件和異常 在實際開發中,常常需要對程序中的數據進行持久化操作,而實現數據持久化最直接簡單的方式就是將數據保存到文件中。說到“文件”這個詞,可能需要先科普一下關于文件系統的知識,對于這個概念,維基百科上給出…

【CSharp】在class中申明public const int常量的應用

【CSharp】在class中申明public const int常量的應用 1.背景2.代碼3.運行1.背景 常量本身是靜態的,即常量屬于class本身與其實例化對象無關,且常量不可更改。 以上兩種特性在許多應用場景中都有其優勢和應用場合。 1.在定義定義固定值的場景,例如狀態碼、事件類型、配置參…

亞馬遜云科技AWS免費大熱AI應用開發證書(含題庫、開卷)

亞馬遜云科技AWS官方生成式AI免費證書來了!內含免費AI基礎課程!快速掌握AWS的前沿AI技術,后端開發程序員也可以速成AI專家,了解當下最🔥的AWS AI架構解決方案! 本證書內容包括AWS上的AI基礎知識&#xff0c…

解析Kotlin中的Unit【筆記摘要】

1. Kotlin的Unit 和 Java的void 的區別 // Java public void sayHello() {System.out.println("Hello!") }// Kotlin fun sayHello(): Unit {println("Hello!") }Unit 和 Java 的 void 真正的區別在于,void 是真的表示什么都不返回&#xff0c…

剖析DeFi交易產品之UniswapV4:Swap

文章首發于公眾號:Keegan小鋼 Swap 可分為兩種場景:單池交易和跨池交易。在 PoolManager 合約里,要完成交易流程,會涉及到 lock()、swap()、settle()、take() 四個函數。單池交易時只需要調一次 swap() 函數,而跨池交易…

【面向就業的Linux基礎】從入門到熟練,探索Linux的秘密(七)-shell語法(5)

shell語法的一些知識和練習,可以當作筆記收藏一下!! 文章目錄 前言 一、shell 二、shell語法 1.文件重定向 2.引入外部腳本 3.作業 總結 前言 shell語法的一些知識和練習,可以當作筆記收藏一下!! 提示&…

七種大模型微調方法:讓你的Offer拿到爽

在當今的人工智能和機器學習領域,大型預訓練模型(如GPT、BERT等)已成為解決自然語言處理(NLP)任務的強大工具。然而,要讓這些模型更好地適應特定任務或領域,往往需要進行微調。本文將詳細介紹七…

手把手教你:如何在51建模網免費下載3D模型?

作為國內領先的3D互動展示平臺,51建模網不僅匯聚了龐大的3D模型資源庫,供用戶免費下載,更集成了在線編輯、格式轉換、內嵌展示及互動體驗等一站式功能,為3D創作者及愛好者搭建起夢想與現實的橋梁。 如何在51建模網免費下載3D模型…

鴻蒙認證值得考嗎?

鴻蒙認證值得考嗎? 鴻蒙認證(HarmonyOS Certification)是華為為了培養和認證開發者在鴻蒙操作系統(HarmonyOS)領域的專業技能而設立的一系列認證項目。這些認證旨在幫助開發者和企業工程師提升在鴻蒙生態中的專業技能…

linux——IPC 進程間通信

IPC 進程間通信 interprocess communicate IPC(Inter-Process Communication),即進程間通信,其產生的原因主要可以歸納為以下幾點: 進程空間的獨立性 資源隔離:在現代操作系統中,每個進程都…

圖解 Kafka 架構

寫在前面 Kafka 是一個可橫向擴展,高可靠的實時消息中間件,常用于服務解耦、流量削峰。 好像是 LinkedIn 團隊開發的,后面捐贈給apache基金會了。 kafka 總體架構圖 Producer:生產者,消息的產生者,是消息的…

【高考志愿】測繪科學與技術

目錄 一、專業介紹 1.1 專業概述 1.2 專業方向 1.3 課程內容 二、就業前景 三、報考注意事項 四、測繪科學與技術專業排名 五、職業規劃與未來發展 高考志愿選擇測繪科學與技術專業,對于許多有志于空間信息技術領域發展的學生來說,無疑是一個極具…

怎么把錄音轉文字?推薦幾個簡單易操作的方法

在小暑這個節氣里,炎熱的天氣讓人分外渴望效率up!Up!Up! 對于那些在會議或課堂中急需記錄信息的朋友們,手寫筆記的速度往往難以跟上講話的節奏。此時,電腦錄音轉文字軟件就像一陣及時雨,讓記錄…

PHP pwn 學習 (1)

文章目錄 A. PHP extensions for C1. 運行環境與工作目錄初始化2. 構建與加載3. 關鍵結構定義PHP_FUNCTIONINTERNAL_FUNCTION_PARAMETERSzend_execute_data等ZEND_PARSE_PARAMETERS_START等zend_parse_arg_stringzend_module_entryzend_function_entry等PHP類相關 原文鏈接&…

Python 作業題1 (猜數字)

題目 你要根據線索猜出一個三位數。游戲會根據你的猜測給出以下提示之一:如果你猜對一位數字但數字位置不對,則會提示“Pico”;如果你同時猜對了一位數字及其位置,則會提示“Fermi”;如果你猜測的數字及其位置都不對&…

Flower花所:穩定運營的數字貨幣交易所

Flower花所是一家穩定運營的數字貨幣交易所,致力于為全球用戶提供安全、高效的數字資產交易服務。作為一家長期穩定運營的數字貨幣交易平臺,Flower花所以其可靠的技術基礎和優質的客戶服務而聞名。 平臺穩定性與可靠性: 持續運營:…

Vue前端練習

此練習項目只涉及前端,主要是vue和ElementUI框架的使用。(ElementUI官網:Element - The worlds most popular Vue UI framework) 一、環境準備 安裝idea 安裝Node.js 一鍵式安裝(不需要做任何配置) npm -v(也可用nod…

mysql-sql-第十五周

學習目標: sql 學習內容: 41.查詢沒有學全所有課程的同學的信息 select *from students where students.stunm not in (select score.stunm from score group by score.stunm having count(score.counm) (select count(counm) from course)) 42.查詢…

數據結構_線性表

線性表的定義和特點 線性表是具有相同特性的數據元素的一個有限序列 :線性起點/起始節點 :的直接前驅 :的直接后繼 :線性終點/終端節點 n:元素總個數,表長 下標:是元素的序號,表示元素在表中的位置 n0時稱為空表 線性表 由n(n>0)個數據元素(結點),組成的有限序列 將…