-
同步雙寫
-
優點:業務邏輯簡單。
-
缺點:
- 硬編碼,有需要寫入mysql的地方都需要添加寫入ES的代碼;
- 業務強耦合;
- 存在雙寫失敗丟數據風險;
- 性能較差:本來mysql的性能不是很高,再加一個ES,系統的性能必然會下降。
雙寫失敗風險,包括以下幾種:
1) ES系統不可用;
2) 程序和ES之間的網絡故障;
3) 程序重啟,導致系統來不及寫入ES等。
針對這種情況,有數據強一致性要求的,就必須雙寫放到事物中來處理,而一旦用上事物,則性能下降更加明顯。
-
-
異步雙寫(MQ方式)
- 優點:
- 性能高;
- 不存在丟數據問題。
- 缺點:
- 存在硬編碼、業務強耦合等問題;
- 系統中增加了mq的代碼,復雜度增加;
- 可能存在時延問題,程序的寫入性能提高了,但是由於MQ的消費可能由於網絡或其它原因導致用戶寫入的數據不一定可以馬上看到。
- 優點:
-
異步雙寫(Worker方式)
上面2中方案中都存在硬編碼問題,也就是有任何對mysq進行增刪改查的地方要么植入ES代碼,要么替換為MQ代碼,代碼的侵入性太強,若是實時要求不高的情況下,可以考慮用定時器來處理,具體步驟如下:
- 數據庫的相關表中增加一個字段為timestamp的字段,任何crud操作都會導致該字段的時間發生變化;
- 原來程序中的crud操作不做任何變化;
- 增加一個定時器程序,讓該程序按一定的時間周期掃描指定的表,把該時間段內發生變化的數據提取出來;
- 逐條寫入到ES中。
- 優點:
- 不改變原來代碼,沒有侵入性、沒有硬編碼;
- 沒有業務強耦合;
- 不改變原來程序的性能;
- Worker代碼編寫簡單不需要考慮增刪改查。
- 缺點:
- 時效性較差,由於定時器工作周期不可能設在秒級,所以實時性沒有上面2中好;
- 對數據庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。
-
Binlog同步方式
上面三種方案要不有代碼侵入、要不有硬編碼、要不有時延,那么有沒有一種更好的方法?答案就是利用mysql的binlog!
具體步驟如下:
- 讀取mysql的binlog日志,獲取指定表的日志信息;
- 將讀取的信息轉為MQ;
- 編寫一個MQ消費程序;
- 不斷消費MQ,每消費完一條消息,將消息寫入到ES中。
- 優點:
- 沒有代碼侵入、沒有硬編碼;
- 原有系統不需要任何變化,沒有感知;
- 性能高; 業務解耦,不需要關注原來系統的業務邏輯。
- 缺點:
- 構建Binlog系統復雜;
- 存在MQ延時的風險。