淺談MySQL同步到ElasticSearch的幾種方式及其優缺點

  1. 同步雙寫

    • 優點:業務邏輯簡單。

    • 缺點:

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

      雙寫失敗風險,包括以下幾種:

      1)  ES系統不可用;

      2)  程式和ES之間的網路故障;

      3)  程式重啟,導致系統來不及寫入ES等。

      針對這種情況,有數據強一致性要求的,就必須雙寫放到事物中來處理,而一旦用上事物,則性能下降更加明顯。

  2. 非同步雙寫(MQ方式)

    • 優點:
      • 性能高;
      • 不存在丟數據問題。
    • 缺點:
      • 存在硬編碼、業務強耦合等問題;
      • 系統中增加了mq的程式碼,複雜度增加;
      • 可能存在時延問題,程式的寫入性能提高了,但是由於MQ的消費可能由於網路或其它原因導致用戶寫入的數據不一定可以馬上看到。
  3. 非同步雙寫(Worker方式)

    上面2中方案中都存在硬編碼問題,也就是有任何對mysq進行增刪改查的地方要麼植入ES程式碼,要麼替換為MQ程式碼,程式碼的侵入性太強,若是實時要求不高的情況下,可以考慮用定時器來處理,具體步驟如下:

    • 資料庫的相關表中增加一個欄位為timestamp的欄位,任何crud操作都會導致該欄位的時間發生變化;
    • 原來程式中的crud操作不做任何變化;
    • 增加一個定時器程式,讓該程式按一定的時間周期掃描指定的表,把該時間段內發生變化的數據提取出來;
    • 逐條寫入到ES中。
    • 優點:
      • 不改變原來程式碼,沒有侵入性、沒有硬編碼;
      • 沒有業務強耦合;
      • 不改變原來程式的性能;
      • Worker程式碼編寫簡單不需要考慮增刪改查。
    • 缺點:
      • 時效性較差,由於定時器工作周期不可能設在秒級,所以實時性沒有上面2中好;
      • 對資料庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。
  4. Binlog同步方式

    上面三種方案要不有程式碼侵入、要不有硬編碼、要不有時延,那麼有沒有一種更好的方法?答案就是利用mysql的binlog!

    具體步驟如下:

    • 讀取mysql的binlog日誌,獲取指定表的日誌資訊;
    • 將讀取的資訊轉為MQ;
    • 編寫一個MQ消費程式;
    • 不斷消費MQ,每消費完一條消息,將消息寫入到ES中。
    • 優點:
      • 沒有程式碼侵入、沒有硬編碼;
      • 原有系統不需要任何變化,沒有感知;
      • 性能高; 業務解耦,不需要關注原來系統的業務邏輯。
    • 缺點:
      • 構建Binlog系統複雜;
      • 存在MQ延時的風險。
Tags: