1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        如何把MySQL數(shù)據(jù)同步到Elasticsearch?

        共 2941字,需瀏覽 6分鐘

         ·

        2023-02-18 09:59

        大家好,我是3y,這期給大家分享一個(gè)電商中常見(jiàn)的場(chǎng)景——MySQL數(shù)據(jù)同步Elasticsearch。

        fba027c76c03ea915260ed487f86d2cf.webp商品檢索

        大家應(yīng)該都在各種電商網(wǎng)站檢索過(guò)商品,檢索商品一般都是通過(guò)什么實(shí)現(xiàn)呢?搜索引擎Elasticsearch。

        那么問(wèn)題來(lái)了,商品上架,數(shù)據(jù)一般寫(xiě)入到MySQL的數(shù)據(jù)庫(kù)中,那么用于檢索的數(shù)據(jù)又是怎么同步到Elasticsearch的呢?

        baf7693e8ca40c470d114558dfde57e0.webpMySQL同步ES 1.同步雙寫(xiě)

        這是能想到的最直接的方式,在寫(xiě)入MySQL,直接也同步往ES里寫(xiě)一份數(shù)據(jù)。

        fd6e2c295990359f803778aaf8f9332a.webp同步雙寫(xiě)

        對(duì)于這種方式:

        • 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單
        • 缺點(diǎn):
          • 業(yè)務(wù)耦合,商品的管理中耦合大量數(shù)據(jù)同步代碼
          • 影響性能,寫(xiě)入兩個(gè)存儲(chǔ),響應(yīng)時(shí)間變長(zhǎng)
          • 不便擴(kuò)展:搜索可能有一些個(gè)性化需求,需要對(duì)數(shù)據(jù)進(jìn)行聚合,這種方式不便實(shí)現(xiàn)
        2.異步雙寫(xiě)

        我們也很容易想到異步雙寫(xiě)的辦法,上架商品的時(shí)候,先把商品數(shù)據(jù)丟進(jìn)MQ,為了解耦合,我們一般會(huì)拆分一個(gè)搜索服務(wù),由搜索服務(wù)去訂閱商品變動(dòng)的消息,來(lái)完成同步。

        2651263f9838608a4a3c28a3323ecbd1.webp異步雙寫(xiě)

        前面說(shuō)的,一些數(shù)據(jù)需要聚合處理成類(lèi)似寬表的結(jié)構(gòu)怎么辦呢?例如商品庫(kù)的商品品類(lèi)、spu、sku表是分開(kāi)的,但是查詢(xún)是跨維度的,在ES里再聚合一次效率就低一些,最好就是把商品的數(shù)據(jù)給聚合起來(lái),在ES里以類(lèi)似大寬表的形式存儲(chǔ),這樣一來(lái)查詢(xún)效率就高一些。

        0f31dfbbe652e52bed2e81988781904a.webp多維度多條件查詢(xún)

        這種其實(shí)沒(méi)什么好辦法,基本上還是得搜索服務(wù)直接查庫(kù),或者遠(yuǎn)程調(diào)用,再查詢(xún)一遍商品的數(shù)據(jù)庫(kù),就是所謂的回查。

        c5df62688fd701a73b276451ca5cd495.webp回查完成聚合

        這種方式:

        • 優(yōu)點(diǎn):
          • 解耦合,商品服務(wù)無(wú)需關(guān)注數(shù)據(jù)同步
          • 實(shí)時(shí)性較好,使用MQ,正常情況下,同步完成在秒級(jí)
        • 缺點(diǎn):
          • 引入了新的組件和服務(wù),增加了復(fù)雜度
        3.定時(shí)任務(wù)

        假如我們要快速搞搞,數(shù)據(jù)量有沒(méi)那么大,怎么辦呢?定時(shí)任務(wù)也可以。

        377f50f54b511fc8e0850b1de1ca4ac6.webp定時(shí)任務(wù)

        定時(shí)任務(wù),最麻煩的一點(diǎn)是頻率不好選,頻率高的話,會(huì)非自然地形成業(yè)務(wù)的波峰,導(dǎo)致存儲(chǔ)的CPU、內(nèi)存占用波峰式上升,頻率低的話實(shí)時(shí)性比較差,而且也有波峰的情況。

        這種方式:

        • 優(yōu)點(diǎn):實(shí)現(xiàn)比較簡(jiǎn)單
        • 缺點(diǎn):
          • 實(shí)時(shí)性難以保證
          • 對(duì)存儲(chǔ)壓力較大
        4.數(shù)據(jù)訂閱

        還有一種方式,就是最時(shí)興的數(shù)據(jù)訂閱。

        MySQL通過(guò)binlog訂閱實(shí)現(xiàn)主從同步,各路數(shù)據(jù)訂閱框架比如canal就依據(jù)這個(gè)原理,將client組件偽裝成從庫(kù),來(lái)實(shí)現(xiàn)數(shù)據(jù)訂閱。

        4942a2cd89eaee35f1b14fae656a1788.webpMySQL主從同步

        我們以應(yīng)用最廣泛的canal為例,canal通過(guò)canal-adapter,支持多種適配器,其中就有ES適配器,通過(guò)一些配置,啟動(dòng)之后,就可以直接把MySQL數(shù)據(jù)同步到ES,這個(gè)過(guò)程是零代碼的。

        a2cb4e9edb6d69bb884b18fe263b78a2.webpcanal同步數(shù)據(jù)

        但是,和老板了解過(guò),使用canal看起來(lái)很美好,幫我們把同步的事情都干了,但其實(shí),還是要寫(xiě)代碼。為什么呢?

        前面提到的多張表數(shù)據(jù)聚合,canal的支持沒(méi)那么好,所以還是得回查。這時(shí)候用canal-adapter就不合適了,需要自己實(shí)現(xiàn)canal-client,監(jiān)聽(tīng)和聚合數(shù)據(jù),寫(xiě)入ES:

        0a450dc89513d1664320f33980a23007.webp數(shù)據(jù)訂閱+回查

        這種看起來(lái)和異步雙寫(xiě)比較像,但是第一降低了商品服務(wù)的耦合,第二數(shù)據(jù)的實(shí)時(shí)性更好。

        所以使用數(shù)據(jù)訂閱:

        • 優(yōu)點(diǎn):
          • 業(yè)務(wù)入侵較少
          • 實(shí)時(shí)性較好

        至于數(shù)據(jù)訂閱框架的選型,主流的大體上是這些:


        Cancal Maxwell Python-Mysql-Rplication
        開(kāi)源方 阿里巴巴 Zendesk 社區(qū)
        開(kāi)發(fā)語(yǔ)言 Java Java Python
        活躍度 活躍 活躍 活躍
        高可用 支持 支持 不支持
        客戶(hù)端 Java/Go/PHP/Python/Rust 無(wú) Python
        消息落地 Kafka/RocketMQ 等 Kafka/RabbitNQ/Redis 等 自定義
        消息格式 自定義 JSON 自定義
        文檔詳略 詳細(xì) 詳細(xì) 詳細(xì)
        Boostrap 不支持 支持 不支持

        除了MySQL同步ES,MySQL同步到其它的數(shù)據(jù)存儲(chǔ),例如HBase,其實(shí)大體上都是類(lèi)似的幾種方法。

        推薦項(xiàng)目

        如果想學(xué)Java項(xiàng)目的,我還是 強(qiáng)烈推薦 我的開(kāi)源項(xiàng)目消息推送平臺(tái)Austin,可以用作 畢業(yè)設(shè)計(jì) ,可以用作 校招 ,可以看看 生產(chǎn)環(huán)境是怎么推送消息 的。

        倉(cāng)庫(kù)地址(可點(diǎn)擊閱讀原文跳轉(zhuǎn)):https://gitee.com/zhongfucheng/austin

        我開(kāi)通了 股東服務(wù) 內(nèi)容,感興趣可以點(diǎn)擊下方看看,主要針對(duì)的是項(xiàng)目喲

        VIP服務(wù)

        瀏覽 37
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天天搞夜夜 | 狠狠躁夜夜躁人人爽天天姦 | 超碰在线97人人 | 婷婷丁香综合 | av网站在线看 | 操逼亚洲 | 亚洲中文免费 | 国产又爽 又黄 视频在线看 | 啪啪AV网站 | 欧洲在线观看 |