天天看點

MySQL資料同步ES方案選型大全

作者:散文随風想

商品上架,資料一般寫入到MySQL的資料庫中,那麼用于檢索的資料又是怎麼同步到Elasticsearch的呢?

MySQL資料同步ES方案選型大全

MySQL同步ES

一、同步雙寫

這是能想到的最直接的方式,在寫入MySQL,直接也同步往ES裡寫一份資料。

MySQL資料同步ES方案選型大全

優點:

  • 實作簡單

缺點:

  • 業務耦合,商品的管理中耦合大量資料同步代碼
  • 影響性能,寫入兩個存儲,響應時間變長
  • 不便擴充,搜尋可能有一些個性化需求,需要對資料進行聚合,這種方式不便實作

二、異步雙寫

我們也很容易想到異步雙寫的辦法,上架商品的時候,先把商品資料丢進MQ,為了解耦合,我們一般會拆分一個搜尋服務,由搜尋服務去訂閱商品變動的消息,來完成同步。

MySQL資料同步ES方案選型大全

前面說的,一些資料需要聚合處理成類似寬表的結構怎麼辦呢?例如商品庫的商品品類、spu、sku表是分開的,但是查詢是跨次元的,在ES裡再聚合一次效率就低一些,最好就是把商品的資料給聚合起來,在ES裡以類似大寬表的形式存儲,這樣一來查詢效率就高一些。

MySQL資料同步ES方案選型大全

多元度多條件查詢

這種其實沒什麼好辦法,基本上還是得搜尋服務直接查庫,或者遠端調用,再查詢一遍商品的資料庫,就是所謂的回查。

MySQL資料同步ES方案選型大全

回查完成聚合

優點:

  • 解耦合,商品服務無需關注資料同步
  • 實時性較好,使用MQ,正常情況下,同步完成在秒級

缺點:

  • 引入了新的元件和服務,增加了複雜度

三、定時任務

假如我們要快速搞搞,資料量又沒那麼大,怎麼辦呢?定時任務也可以。

MySQL資料同步ES方案選型大全

定時任務,最麻煩的一點是頻率不好選,頻率高的話,會非自然地形成業務的波峰,導緻存儲的CPU、記憶體占用波峰式上升,頻率低的話實時性比較差,而且也有波峰的情況。

優點:

  • 實作比較簡單
  • 缺點:

    • 實時性難以保證
    • 對存儲壓力較大

    四、資料訂閱

    還有一種方式,就是最時興的資料訂閱。

    MySQL通過binlog訂閱實作主從同步,各路資料訂閱架構比如canal就依據這個原理,将client元件僞裝成從庫,來實作資料訂閱。

    MySQL資料同步ES方案選型大全

    MySQL主從同步

    我們以應用最廣泛的canal為例,canal通過canal-adapter,支援多種擴充卡,其中就有ES擴充卡,通過一些配置,啟動之後,就可以直接把MySQL資料同步到ES,這個過程是零代碼的。

    MySQL資料同步ES方案選型大全

    canal同步資料

    但是,和老闆了解過,使用canal看起來很美好,幫我們把同步的事情都幹了,但其實,還是要寫代碼。為什麼呢?

    前面提到的多張表資料聚合,canal的支援沒那麼好,是以還是得回查。這時候用canal-adapter就不合适了,需要自己實作canal-client,監聽和聚合資料,寫入ES:

    MySQL資料同步ES方案選型大全

    資料訂閱+回查

    這種看起來和異步雙寫比較像,但是第一降低了商品服務的耦合,第二資料的實時性更好。

    優點:

    • 業務入侵較少
    • 實時性較好

    至于資料訂閱架構的選型,主流的大體上是這些:

    MySQL資料同步ES方案選型大全

    除了MySQL同步ES,MySQL同步到其它的資料存儲,例如HBase,其實大體上都是類似的幾種方法。

    繼續閱讀