MySQL數(shù)據(jù)同步Elasticsearch的4種方案
今天給大家介紹一個電商中常見的場景 —— MySQL 數(shù)據(jù)同步 Elasticsearch。
商品檢索
大家應(yīng)該都在各種電商網(wǎng)站檢索過商品,檢索商品一般都是通過什么實(shí)現(xiàn)呢?搜索引擎Elasticsearch。
那么問題來了,商品上架,數(shù)據(jù)一般寫入到MySQL的數(shù)據(jù)庫中,那么用于檢索的數(shù)據(jù)又是怎么同步到Elasticsearch的呢?
MySQL同步ES
1.同步雙寫
這是能想到的最直接的方式,在寫入MySQL,直接也同步往ES里寫一份數(shù)據(jù)。
同步雙寫
對于這種方式:
優(yōu)點(diǎn):實(shí)現(xiàn)簡單
缺點(diǎn):
- 業(yè)務(wù)耦合,商品的管理中耦合大量數(shù)據(jù)同步代碼
- 影響性能,寫入兩個存儲,響應(yīng)時間變長
- 不便擴(kuò)展:搜索可能有一些個性化需求,需要對數(shù)據(jù)進(jìn)行聚合,這種方式不便實(shí)現(xiàn)
2.異步雙寫
我們也很容易想到異步雙寫的辦法,上架商品的時候,先把商品數(shù)據(jù)丟進(jìn)MQ,為了解耦合,我們一般會拆分一個搜索服務(wù),由搜索服務(wù)去訂閱商品變動的消息,來完成同步。
異步雙寫
前面說的,一些數(shù)據(jù)需要聚合處理成類似寬表的結(jié)構(gòu)怎么辦呢?例如商品庫的商品品類、spu、sku表是分開的,但是查詢是跨維度的,在ES里再聚合一次效率就低一些,最好就是把商品的數(shù)據(jù)給聚合起來,在ES里以類似大寬表的形式存儲,這樣一來查詢效率就高一些。
多維度多條件查詢
這種其實(shí)沒什么好辦法,基本上還是得搜索服務(wù)直接查庫,或者遠(yuǎn)程調(diào)用,再查詢一遍商品的數(shù)據(jù)庫,就是所謂的回查。
回查完成聚合
這種方式:
優(yōu)點(diǎn):
- 解耦合,商品服務(wù)無需關(guān)注數(shù)據(jù)同步
- 實(shí)時性較好,使用MQ,正常情況下,同步完成在秒級
缺點(diǎn):
- 引入了新的組件和服務(wù),增加了復(fù)雜度
3.定時任務(wù)
假如我們要快速搞搞,數(shù)據(jù)量有沒那么大,怎么辦呢?定時任務(wù)也可以。
定時任務(wù)
定時任務(wù),最麻煩的一點(diǎn)是頻率不好選,頻率高的話,會非自然地形成業(yè)務(wù)的波峰,導(dǎo)致存儲的CPU、內(nèi)存占用波峰式上升,頻率低的話實(shí)時性比較差,而且也有波峰的情況。
這種方式:
優(yōu)點(diǎn):實(shí)現(xiàn)比較簡單
缺點(diǎn):
- 實(shí)時性難以保證
- 對存儲壓力較大
4.數(shù)據(jù)訂閱
還有一種方式,就是最時興的數(shù)據(jù)訂閱。
MySQL通過binlog訂閱實(shí)現(xiàn)主從同步,各路數(shù)據(jù)訂閱框架比如canal就依據(jù)這個原理,將client組件偽裝成從庫,來實(shí)現(xiàn)數(shù)據(jù)訂閱。
MySQL主從同步
我們以應(yīng)用最廣泛的canal為例,canal通過canal-adapter
,支持多種適配器,其中就有ES適配器,通過一些配置,啟動之后,就可以直接把MySQL數(shù)據(jù)同步到ES,這個過程是零代碼的。
canal同步數(shù)據(jù)
但是,和老板了解過,使用canal看起來很美好,幫我們把同步的事情都干了,但其實(shí),還是要寫代碼。為什么呢?
前面提到的多張表數(shù)據(jù)聚合,canal的支持沒那么好,所以還是得回查。這時候用canal-adapter就不合適了,需要自己實(shí)現(xiàn)canal-client,監(jiān)聽和聚合數(shù)據(jù),寫入ES:
數(shù)據(jù)訂閱+回查
這種看起來和異步雙寫比較像,但是第一降低了商品服務(wù)的耦合,第二數(shù)據(jù)的實(shí)時性更好。
所以使用數(shù)據(jù)訂閱:
優(yōu)點(diǎn):
- 業(yè)務(wù)入侵較少
- 實(shí)時性較好
至于數(shù)據(jù)訂閱框架的選型,主流的大體上是這些:
Cancal | Maxwell | Python-Mysql-Rplication | |
---|---|---|---|
開源方 | 阿里巴巴 | Zendesk | 社區(qū) |
開發(fā)語言 | Java | Java | Python |
活躍度 | 活躍 | 活躍 | 活躍 |
高可用 | 支持 | 支持 | 不支持 |
客戶端 | Java/Go/PHP/Python/Rust | 無 | Python |
消息落地 | Kafka/RocketMQ 等 | Kafka/RabbitNQ/Redis 等 | 自定義 |
消息格式 | 自定義 | JSON | 自定義 |
文檔詳略 | 詳細(xì) | 詳細(xì) | 詳細(xì) |
Boostrap | 不支持 | 支持 | 不支持 |
除了MySQL同步ES,MySQL同步到其它的數(shù)據(jù)存儲,例如HBase,其實(shí)大體上都是類似的幾種方法。
到此這篇關(guān)于MySQL數(shù)據(jù)同步Elasticsearch的4種方案的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)同步Elasticsearch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中的int類型對應(yīng)于java中的Long類型詳解
這篇文章主要介紹了mysql中的int類型對應(yīng)于java中的Long類型,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Mysql中文漢字轉(zhuǎn)拼音的實(shí)現(xiàn)(每個漢字轉(zhuǎn)換全拼)
這篇文章主要介紹了Mysql中文漢字轉(zhuǎn)拼音的實(shí)現(xiàn),并且每個漢字會轉(zhuǎn)換全拼,使用Mysql自定義函數(shù)實(shí)現(xiàn),需要的朋友可以參考下2014-06-06mysql5.7.17在win2008R2的64位系統(tǒng)安裝與配置實(shí)例
本篇文章主要給大家介紹了mysql5.7.17在win2008R2的64位系統(tǒng)安裝與配置實(shí)例,以及在配置過程中遇到的問題解決辦法。2017-11-11MySQL和Oracle的元數(shù)據(jù)抽取實(shí)例分析
MySQL和Oracle雖然在架構(gòu)上有很大的不同,但是如果從某些方面比較起來,它們有些方面也是相通的,下面這篇文章主要給大家介紹了關(guān)于MySQL和Oracle元數(shù)據(jù)抽取的相關(guān)資料,需要的朋友可以參考下2021-12-12MySL實(shí)現(xiàn)如等級成色等特殊順序的排序詳解
這篇文章主要為大家介紹了MySL實(shí)現(xiàn)如等級成色等特殊順序的排序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05