文章目錄
-
-
- 前言
- 一、數(shù)據(jù)同步方案
-
-
1.同步雙寫
- [2.異步雙寫(MQ方式)](#2MQhttpssocsdnnetsosearchqMQspm1001210130017020_53)
- 3.基于Mysql表定時掃描同步
- [4.基于Binlog實時同步](#4BinloghttpssocsdnnetsosearchqBinlogspm1001210130017020_119)
-
1.同步雙寫
- [二、數(shù)據(jù)遷移同步工具選型](#httpssocsdnnetsosearchqspm1001210130017020_141)
-
- 總結(jié)
-
前言
我們一般會使用Mysql用來存儲數(shù)據(jù),用Es來做全文檢索和特殊查詢,用redis來做數(shù)據(jù)的緩存
那么如何將數(shù)據(jù)優(yōu)雅的從Mysql同步到Es以及redis呢?
一、數(shù)據(jù)同步方案
1.同步雙寫
這是一種最為簡單的方式,在將數(shù)據(jù)寫到mysql時,同時將數(shù)據(jù)寫到ES或者redis。
這個方法的缺點是代碼嚴重耦合,需要手動維護Mysql和Es數(shù)據(jù)關(guān)系,非常不便于維護。
偽代碼:
/\*\*
\* 新增商品
\*/
@Transactional(rollbackFor = Exception.class)
public void addGoods(GoodsDto goodsDto) {
//1、保存Mysql
Goods goods = new Goods();
BeanUtils.copyProperties(goodsDto,goods);
goodsMapper.insert();
//2、保存ES
IndexRequest indexRequest = new IndexRequest("goods\_index","\_doc");
indexRequest.source(JSON.toJSONString(goods), XContentType.JSON);
indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
highLevelClient.index(indexRequest);
}
- 優(yōu)點:
1、業(yè)務邏輯簡單
2、實時性高 - 缺點:
1、 硬編碼,有需要寫入mysql的地方都需要添加寫入ES的代碼;
2、 業(yè)務強耦合;
3、 存在雙寫失敗丟數(shù)據(jù)風險;
4、 性能較差:本來mysql的性能不是很高,再加一個ES,系統(tǒng)的性能必然會下降。 - 雙寫失敗風險,包括以下幾種:
1) ES系統(tǒng)不可用;
2) 程序和ES之間的網(wǎng)絡(luò)故障;
3) 程序重啟,導致系統(tǒng)來不及寫入ES等。
針對這種情況,有數(shù)據(jù)強一致性要求的,就必須雙寫放到事務中來處理,而一旦用上事物,則性能下降更加明顯。
2.異步雙寫(MQ方式)
針對多數(shù)據(jù)源寫入的場景,可以借助MQ實現(xiàn)異步的多源寫入,這種情況下各個源的寫入邏輯互不干擾,不會由于單個數(shù)據(jù)源寫入異?;蚓徛绊懫渌麛?shù)據(jù)源的寫入,雖然整體寫入的吞吐量增大了,但是由于MQ消費是異步消費,所以不適合實時業(yè)務場景。
在執(zhí)行完向Mysql中寫入數(shù)據(jù)的邏輯后,發(fā)送MQ,告訴消費端這個數(shù)據(jù)需要寫入Es,消費端收到消息后執(zhí)行向Es寫入數(shù)據(jù)的邏輯。這個方式的優(yōu)點是Mysql和Es數(shù)據(jù)維護分離,開發(fā)Mysql和Es的人員只需要關(guān)心各自的業(yè)務。缺點是依然需要維護發(fā)送、接收MQ的邏輯,并且引入了MQ組件,增加了系統(tǒng)的復雜度。
偽代碼:
@Transactional(rollbackFor = Exception.class)
public boolean parseJdDb(String keyword) throws IOException {
//向數(shù)據(jù)庫中插入
List<JdGoods> jdGoods = htmlParseUtil.parseJd(keyword);
//批量更新Mysql
boolean b = this.saveBatch(jdGoods);
log.info("異步同步至ES");
rabbitTemplate.convertAndSend("es.exchange","es.renew.key", jdGoods);
return b;
}
優(yōu)點:
1、性能高
2、不易出現(xiàn)數(shù)據(jù)丟失問題,主要基于MQ消息的消費保障機制,比如ES宕機或者寫入失敗,還能重新消費MQ消息。
3、多源寫入之間相互隔離,便于擴展更多的數(shù)據(jù)源寫入
缺點:
1、硬編碼問題,接入新的數(shù)據(jù)源需要實現(xiàn)新的消費者代碼
3、系統(tǒng)復雜度增加:引入了消息中間件
4、可能出現(xiàn)延時問題:MQ是異步消費模型,用戶寫入的數(shù)據(jù)不一定可以馬上看到,造成延時。
3.基于Mysql表定時掃描同步
上面兩種方案中都存在硬編碼問題,也就是有任何對mysq進行增刪改查的地方要么植入ES代碼,要么替換為MQ代碼,代碼的侵入性太強。
如果對實時性要求不高的情況下,可以考慮用定時器來處理,具體步驟如下:
1、數(shù)據(jù)庫的相關(guān)表中增加一個字段為timestamp的字段,任何crud操作都會導致該字段的時間發(fā)生變化;
2、原來程序中的CURD操作不做任何變化;
3、增加一個定時器程序,讓該程序按一定的時間周期掃描指定的表,把該時間段內(nèi)發(fā)生變化的數(shù)據(jù)提取出來;
4、逐條寫入到ES中。
如下圖所示:
該方案的典型實現(xiàn)是借助logstash
實現(xiàn)數(shù)據(jù)同步,其底層實現(xiàn)原理就是根據(jù)配置定期使用sql查詢新增的數(shù)據(jù)寫入ES中,實現(xiàn)數(shù)據(jù)的增量同步。
具體實現(xiàn)可以參考:通過Logstash實現(xiàn)mysql數(shù)據(jù)定時增量同步到ES
優(yōu)點:
1、不改變原來代碼,沒有侵入性、沒有硬編碼;
2、沒有業(yè)務強耦合,不改變原來程序的性能;
3、Worker代碼編寫簡單不需要考慮增刪改查;
缺點:
1、時效性較差,由于是采用定時器根據(jù)固定頻率查詢表來同步數(shù)據(jù),盡管將同步周期設(shè)置到秒級,也還是會存在一定時間的延遲。
2、對數(shù)據(jù)庫有一定的輪詢壓力,一種改進方法是將輪詢放到壓力不大的從庫上。
業(yè)界目前較為流行的方案:Canal實現(xiàn)Mysql數(shù)據(jù)同步至Redis、Elasticsearch
4.基于Binlog實時同步
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進入阿里一直到現(xiàn)在。
深知大多數(shù)大數(shù)據(jù)工程師,想要提升技能,往往是自己摸索成長或者是報班學習,但對于培訓機構(gòu)動則幾千的學費,著實壓力不小。自己不成體系的自學效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年大數(shù)據(jù)全套學習資料》,初衷也很簡單,就是希望能夠幫助到想自學提升又不知道該從何學起的朋友。
既有適合小白學習的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗的小伙伴深入學習提升的進階課程,基本涵蓋了95%以上大數(shù)據(jù)開發(fā)知識點,真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學習筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新文章來源:http://www.zghlxwxcb.cn/news/detail-856407.html
如果你覺得這些內(nèi)容對你有幫助,可以添加VX:vip204888 (備注大數(shù)據(jù)獲?。?/strong>
開發(fā)知識點,真正體系化!**
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點里面都包含大廠面經(jīng)、學習筆記、源碼講義、實戰(zhàn)項目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加VX:vip204888 (備注大數(shù)據(jù)獲?。?/strong>
[外鏈圖片轉(zhuǎn)存中…(img-0htuFViP-1712853349909)]文章來源地址http://www.zghlxwxcb.cn/news/detail-856407.html
到了這里,關(guān)于Mysql和ES、Redis數(shù)據(jù)同步方案匯總_redis同步數(shù)據(jù)從mysql到es的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!