ES数据同步方案
?
?
當(dāng)業(yè)務(wù)量上升后,由于mysql對(duì)全文檢索或模糊查詢支持的能力不強(qiáng),在系統(tǒng)中查詢的地方,往往會(huì)出現(xiàn)慢sql等,拖累系統(tǒng)其他模塊,造成性能低下。
隨著ES使用普及率的升高,ES是mysql的一個(gè)有效補(bǔ)充。我們可以將數(shù)據(jù)發(fā)送到搜索引擎(如ES)上,由搜索引擎來(lái)提供專業(yè)的服務(wù)。
接下來(lái),就結(jié)合工作中實(shí)際用到的場(chǎng)景,對(duì)數(shù)據(jù)從mysql到es的同步進(jìn)行一些分析。
在實(shí)踐中我總結(jié)出了以下幾種方式。
第1種:同步雙寫
這是一種最為簡(jiǎn)單的方式,在將數(shù)據(jù)寫到mysql時(shí),同時(shí)將數(shù)據(jù)寫到ES,實(shí)現(xiàn)數(shù)據(jù)的雙寫。
優(yōu)點(diǎn):
業(yè)務(wù)邏輯簡(jiǎn)單。
缺點(diǎn):
硬編碼:有需要寫入mysql的地方都需要添加寫入ES的代碼;業(yè)務(wù)強(qiáng)耦合;存在雙寫失敗丟數(shù)據(jù)風(fēng)險(xiǎn);性能較差:本來(lái)mysql的性能就不是很高,再加寫一個(gè)ES,系統(tǒng)的性能必然會(huì)下降。說(shuō)明:
上面第3點(diǎn)講到的雙寫失敗風(fēng)險(xiǎn),包括以下3種:
ES系統(tǒng)不可用;應(yīng)用系統(tǒng)和ES之間的網(wǎng)絡(luò)故障;應(yīng)用系統(tǒng)重啟,導(dǎo)致系統(tǒng)來(lái)不及寫入ES等。針對(duì)這種情況,有數(shù)據(jù)強(qiáng)一致性要求的,就必須雙寫放到事物中來(lái)處理,但是一旦用上事物,則性能下降更加明顯。
第2種:異步雙寫(MQ方式)
針對(duì)第一種同步雙寫的性能和數(shù)據(jù)丟失問(wèn)題,可以考慮引入MQ,從而形成了異步雙寫的方案,如下圖所示:
由于MQ的性能基本比mysql高出一個(gè)數(shù)量級(jí),所以性能可以得到顯著的提高。
優(yōu)點(diǎn):
性能高;不存在丟數(shù)據(jù)問(wèn)題。缺點(diǎn):
硬編碼問(wèn)題:依然存在業(yè)務(wù)強(qiáng)耦合:依然存在復(fù)雜度增加:系統(tǒng)中增加了mq的代碼,;可能存在時(shí)延問(wèn)題:程序的寫入性能提高了,但是由于MQ的消費(fèi)可能由于網(wǎng)絡(luò)或其它原因?qū)е掠脩魧懭氲臄?shù)據(jù)不一定可以馬上看到,造成延時(shí)。第3種:異步雙寫(Worker方式)
上面兩種方案中都存在硬編碼問(wèn)題,也就是有任何對(duì)mysq進(jìn)行增刪改查的地方要么植入ES代碼,要么替換為MQ代碼,代碼的侵入性太強(qiáng)。
如果對(duì)實(shí)時(shí)性要求不高的情況下,可以考慮用定時(shí)器來(lái)處理,具體步驟如下:
數(shù)據(jù)庫(kù)的相關(guān)表中增加一個(gè)字段為timestamp的字段,任何crud操作都會(huì)導(dǎo)致該字段的時(shí)間發(fā)生變化;原來(lái)程序中的CURD操作不做任何變化;增加一個(gè)定時(shí)器程序(京東內(nèi)部叫Worker),讓該程序按一定的時(shí)間周期掃描指定的表,把該時(shí)間段內(nèi)發(fā)生變化的數(shù)據(jù)提取出來(lái);逐條寫入到ES中。入下圖所示
優(yōu)點(diǎn):
不改變?cè)瓉?lái)代碼,沒(méi)有侵入性、沒(méi)有硬編碼;沒(méi)有業(yè)務(wù)強(qiáng)耦合;不改變?cè)瓉?lái)程序的性能;Worker代碼編寫簡(jiǎn)單不需要考慮增刪改查。缺點(diǎn):
時(shí)效性較差,由于定時(shí)器工作周期不可能設(shè)在秒級(jí),所以實(shí)時(shí)性沒(méi)有上面2中好;對(duì)數(shù)據(jù)庫(kù)有一定的輪詢壓力,一種改進(jìn)方法是將輪詢放到壓力不大的重庫(kù)上。第4種:Binlog 同步方式:
上面三種方案要么有代碼侵入,要么有硬編碼,要么有時(shí)延,第4中方案,可以利用mysql的binlog來(lái)進(jìn)行同步
具體步驟如下:
1) 讀取mysql的binlog日志,獲取指定表的日志信息;
2) 將讀取的信息轉(zhuǎn)為MQ;
3) 編寫一個(gè)MQ消費(fèi)程序;
4) 不斷消費(fèi)MQ,每消費(fèi)完一條消息,將消息寫入到ES中。
優(yōu)點(diǎn):
沒(méi)有代碼侵入、沒(méi)有硬編碼;原有系統(tǒng)不需要任何變化,沒(méi)有感知;性能高;業(yè)務(wù)解耦,不需要關(guān)注原來(lái)系統(tǒng)的業(yè)務(wù)邏輯。缺點(diǎn):
構(gòu)建Binlog系統(tǒng)復(fù)雜;也像方案二,存在MQ延時(shí)的風(fēng)險(xiǎn)。
總結(jié)
- 上一篇: java jacob语音合成_Java使
- 下一篇: 【新手入门】Oozie workflow