最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL同步Elasticsearch的6種方案小結(jié)

 更新時間:2025年05月06日 09:43:28   作者:蘇三說技術  
在分布式架構(gòu)中,MySQL與Elasticsearch(ES)的協(xié)同已成為解決高并發(fā)查詢與復雜檢索的標配組合,本文整理了MySQL同步ES的6種主流方案,大家可以根據(jù)自己的需要進行選擇

引言

在分布式架構(gòu)中,MySQL與Elasticsearch(ES)的協(xié)同已成為解決高并發(fā)查詢與復雜檢索的標配組合。

然而,如何實現(xiàn)兩者間的高效數(shù)據(jù)同步,是架構(gòu)設計中繞不開的難題。

這篇文章跟大家一起聊聊MySQL同步ES的6種主流方案,結(jié)合代碼示例與場景案例,幫助開發(fā)者避開常見陷阱,做出最優(yōu)技術選型。

方案一:同步雙寫

場景:適用于對數(shù)據(jù)實時性要求極高,且業(yè)務邏輯簡單的場景,如金融交易記錄同步。

在業(yè)務代碼中同時寫入MySQL與ES。

代碼如下:

@Transactional  
public void createOrder(Order order) {  
    // 寫入MySQL  
    orderMapper.insert(order);  
    // 同步寫入ES  
    IndexRequest request = new IndexRequest("orders")  
        .id(order.getId())  
        .source(JSON.toJSONString(order), XContentType.JSON);  
    client.index(request, RequestOptions.DEFAULT);  
}

痛點

  • 硬編碼侵入:所有涉及寫操作的地方均需添加ES寫入邏輯。
  • 性能瓶頸:雙寫操作導致事務時間延長,TPS下降30%以上。
  • 數(shù)據(jù)一致性風險:若ES寫入失敗,需引入補償機制(如本地事務表+定時重試)。

方案二:異步雙寫

場景:電商訂單狀態(tài)更新后需同步至ES供客服系統(tǒng)檢索。

我們可以使用MQ進行解耦。

架構(gòu)圖如下

代碼示例如下

// 生產(chǎn)者端  
public void updateProduct(Product product) {  
    productMapper.update(product);  
    kafkaTemplate.send("product-update", product.getId());  
}  

// 消費者端  
@KafkaListener(topics = "product-update")  
public void syncToEs(String productId) {  
    Product product = productMapper.selectById(productId);  
    esClient.index(product);  
}

優(yōu)勢

  • 吞吐量提升:通過MQ削峰填谷,可承載萬級QPS。
  • 故障隔離:ES宕機不影響主業(yè)務鏈路。

缺陷

  • 消息堆積:突發(fā)流量可能導致消費延遲(需監(jiān)控Lag值)。
  • 順序性問題:需通過分區(qū)鍵保證同一數(shù)據(jù)的順序消費。

方案三:Logstash定時拉取

場景:用戶行為日志的T+1分析場景。

該方案低侵入但高延遲。

配置示例如下

input {  
  jdbc {  
    jdbc_driver => "com.mysql.jdbc.Driver"  
    jdbc_url => "jdbc:mysql://localhost:3306/log_db"  
    schedule => "*/5 * * * *"  # 每5分鐘執(zhí)行  
    statement => "SELECT * FROM user_log WHERE update_time > :sql_last_value"  
  }  
}  
output {  
  elasticsearch {  
    hosts => ["es-host:9200"]  
    index => "user_logs"  
  }  
}

適用性分析

  • 優(yōu)點:零代碼改造,適合歷史數(shù)據(jù)遷移。
  • 致命傷
    • 分鐘級延遲(無法滿足實時搜索)
    • 全表掃描壓力大(需優(yōu)化增量字段索引)

方案四:Canal監(jiān)聽Binlog

場景:社交平臺動態(tài)實時搜索(如微博熱搜更新)。

技術棧:Canal + RocketMQ + ES

該方案高實時,并且低侵入。

架構(gòu)流程如下

關鍵配置

# canal.properties  
canal.instance.master.address=127.0.0.1:3306  
canal.mq.topic=canal.es.sync

避坑指南

  • 數(shù)據(jù)漂移:需處理DDL變更(通過Schema Registry管理映射)。
  • 冪等消費:通過_id唯一鍵避免重復寫入。

方案五:DataX批量同步

場景:將歷史訂單數(shù)據(jù)從分庫分表MySQL遷移至ES。

該方案是大數(shù)據(jù)遷移的首選。

配置文件如下

{  
  "job": {  
    "content": [{  
      "reader": {  
        "name": "mysqlreader",  
        "parameter": { "splitPk": "id", "querySql": "SELECT * FROM orders" }  
      },  
      "writer": {  
        "name": "elasticsearchwriter",  
        "parameter": { "endpoint": "http://es-host:9200", "index": "orders" }  
      }  
    }]  
  }  
}

性能調(diào)優(yōu)

  • 調(diào)整channel數(shù)提升并發(fā)(建議與分片數(shù)對齊)
  • 啟用limit分批查詢避免OOM

方案六:Flink流處理

場景:商品價格變更時,需關聯(lián)用戶畫像計算實時推薦評分。

該方案適合于復雜的ETL場景。

代碼片段如下

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  
env.addSource(new CanalSource())  
   .map(record -> parseToPriceEvent(record))  
   .keyBy(event -> event.getProductId())  
   .connect(userProfileBroadcastStream)  
   .process(new PriceRecommendationProcess())  
   .addSink(new ElasticsearchSink());

優(yōu)勢

  • 狀態(tài)管理:精準處理亂序事件(Watermark機制)
  • 維表關聯(lián):通過Broadcast State實現(xiàn)實時畫像關聯(lián)

總結(jié)

對于文章上面給出的這6種技術方案,我們在實際工作中,該如何做選型呢?

下面用一張表格做對比:

方案實時性侵入性復雜度適用階段
同步雙寫秒級小型單體項目
MQ異步秒級中型分布式系統(tǒng)
Logstash分鐘級離線分析
Canal毫秒級高并發(fā)生產(chǎn)環(huán)境
DataX小時級歷史數(shù)據(jù)遷移
Flink毫秒級極高實時數(shù)倉

蘇三的建議

  • 若團隊無運維中間件能力 → 選擇Logstash或同步雙寫
  • 需秒級延遲且允許改造 → MQ異步 + 本地事務表
  • 追求極致實時且資源充足 → Canal + Flink雙保險

到此這篇關于MySQL同步Elasticsearch的6種方案小結(jié)的文章就介紹到這了,更多相關MySQL同步Elasticsearch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Windows中MySQL數(shù)據(jù)庫下載以及安裝教程(最最新版)

    Windows中MySQL數(shù)據(jù)庫下載以及安裝教程(最最新版)

    這篇文章主要給大家介紹了關于Windows中MySQL數(shù)據(jù)庫下載以及安裝的相關資料,很多朋友剛開始接觸mysql數(shù)據(jù)庫服務器,對安裝使用教程不太明白,這里給大家總結(jié)下,需要的朋友可以參考下
    2023-09-09
  • MySQL安裝出現(xiàn)starting the server報錯的解決方案

    MySQL安裝出現(xiàn)starting the server報錯的解決方案

    如果電腦是第一次安裝MySQL,一般不會出現(xiàn)這樣的報錯,如下圖所示,本文主要介紹了MySQL安裝出現(xiàn)starting the server報錯的解決方案,感興趣的可以了解一下
    2024-07-07
  • MySQL創(chuàng)建索引/判斷索引是否生效的問題

    MySQL創(chuàng)建索引/判斷索引是否生效的問題

    這篇文章主要介紹了MySQL創(chuàng)建索引/判斷索引是否生效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mysql binlog占用大量磁盤空間的解決方法

    mysql binlog占用大量磁盤空間的解決方法

    MySQL binlog(Binary Log)是MySQL數(shù)據(jù)庫的一種重要組件,用于記錄所有對數(shù)據(jù)庫的更改操作,當MySQL服務器接收到對數(shù)據(jù)庫的寫入請求并成功執(zhí)行后,這些更改會被寫入binlog,本文給大家介紹了mysql binlog占用大量磁盤空間的解決方法,需要的朋友可以參考下
    2024-06-06
  • SQL語句詳解 MySQL update的正確用法

    SQL語句詳解 MySQL update的正確用法

    以下的文章主要介紹的是MySQL update 語句的實際用法,我們首先是以單表的UPDATE語句來引出實現(xiàn)MySQL update 語句的實際方案,以下就是文章的詳細內(nèi)容描述,望你看完之后會有收獲
    2012-01-01
  • MySQL內(nèi)核探秘之主鍵與唯一鍵的深度解析以及設計哲學

    MySQL內(nèi)核探秘之主鍵與唯一鍵的深度解析以及設計哲學

    主鍵和唯一鍵都是用來保證MySQL數(shù)據(jù)表中數(shù)據(jù)完整性的約束,但它們在本質(zhì)和使用上存在一些關鍵區(qū)別,這篇文章主要介紹了MySQL內(nèi)核探秘之主鍵與唯一鍵的深度解析以及設計哲學的相關資料,需要的朋友可以參考下
    2026-04-04
  • MYSQL清空表和截斷表問題

    MYSQL清空表和截斷表問題

    這篇文章主要介紹了MYSQL清空表和截斷表問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 如何解決安裝MySQL5.0后出現(xiàn)1607異常

    如何解決安裝MySQL5.0后出現(xiàn)1607異常

    小伙們在安裝mysql5.0的時候是不是遇到過1607異常問題,大家都是怎么解決的呢?下面小編跟大家分享我是如何解決安裝MySQL5.0后出現(xiàn)1607異常的,需要的朋友可以參考下
    2015-10-10
  • MySQL中因一個雙引號錯位引發(fā)的血案詳析

    MySQL中因一個雙引號錯位引發(fā)的血案詳析

    這篇文章主要給大家介紹了關于MySQL中因一個雙引號錯位引發(fā)的血案的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • MySql中 is Null段判斷無效和IFNULL()失效的解決方案

    MySql中 is Null段判斷無效和IFNULL()失效的解決方案

    這篇文章主要介紹了MySql中 is Null段判斷無效和IFNULL()失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

伊金霍洛旗| 临湘市| 宽甸| 孝感市| 环江| 富宁县| 泗洪县| 北辰区| 鹤山市| 十堰市| 阜康市| 余江县| 夹江县| 富源县| 交口县| 定兴县| 盐城市| 临沂市| 咸宁市| 家居| 卓资县| 河西区| 阿瓦提县| 龙口市| 曲水县| 桑日县| 渝中区| 吐鲁番市| 白河县| 高陵县| 邵阳市| 仙居县| 临漳县| 江达县| 鹤峰县| 邳州市| 融水| 凤冈县| 政和县| 青海省| 鹿邑县|