ElasticSearch數(shù)據(jù)同步與無縫遷移

ElasticSearch作為一款開源的全文搜索引擎在如今的軟件開發(fā)得到了越來越廣泛的應(yīng)用训柴,在業(yè)務(wù)功能開發(fā)方面,可以選用ElasticSearch提供比數(shù)據(jù)庫查詢更強(qiáng)大的搜索方式嘉裤,同時(shí)基于搜索結(jié)果評分(權(quán)重)和高亮讓我們很輕易地通過它實(shí)現(xiàn)一個(gè)站內(nèi)的搜索引擎面哥。

ElasticSearch VS 數(shù)據(jù)庫

剛接觸ElasticSearch(ES)時(shí)我們經(jīng)常將它與數(shù)據(jù)庫類比起來學(xué)習(xí),從結(jié)構(gòu)上:

  • Indices類似于數(shù)據(jù)庫的database
  • Type類似于數(shù)據(jù)庫的table
  • Fields類似于數(shù)據(jù)表的列
  • Documents類似于數(shù)據(jù)表的行(即每條記錄)
    同時(shí),數(shù)據(jù)庫提供的搜索語法都能在ES上找到影子拂募,比如數(shù)據(jù)庫提供AND、OR邏輯運(yùn)算符窟她,ES中有must, should陈症,而數(shù)據(jù)庫的如“l(fā)ike”等文字匹配功能在ES中則更加強(qiáng)大。

盡管如此震糖,ES本質(zhì)上的定位仍是一個(gè)搜索引擎录肯。NoSQL和ES一樣都有著相同松散的結(jié)構(gòu),雖然我們也有一些討論是否可以用ES來替代非關(guān)系型數(shù)據(jù)庫(撇開ES是不是一種NoSQL)吊说,但是一個(gè)現(xiàn)實(shí)是ES和NoSQL依舊是互有利弊论咏;再者优炬,傳統(tǒng)關(guān)系型數(shù)據(jù)庫的事務(wù)性、多表關(guān)聯(lián)結(jié)構(gòu)也是ES無法提供的厅贪。
所以蠢护,在實(shí)際的開發(fā)過程中,關(guān)系型數(shù)據(jù)庫养涮、NoSQL葵硕、ES依舊是相輔相成的關(guān)系,我們一般只會(huì)在較復(fù)雜的搜索場景下會(huì)選用ES提供搜索服務(wù)贯吓,而其源數(shù)據(jù)依舊來自于數(shù)據(jù)庫贬芥,所以這就引出了ES與數(shù)據(jù)庫之間的數(shù)據(jù)同步問題。

全量數(shù)據(jù)導(dǎo)入

在第一次將存儲(chǔ)在數(shù)據(jù)庫里面的數(shù)據(jù)導(dǎo)入到ES需要執(zhí)行全量導(dǎo)入宣决,當(dāng)后續(xù)有數(shù)據(jù)更新時(shí)通過消息隊(duì)列通知ES更新數(shù)據(jù)。

使用消息隊(duì)列實(shí)現(xiàn)ES增量同步

消息隊(duì)列在軟件開發(fā)領(lǐng)域是一個(gè)十分常見的名詞昏苏。
在操作系統(tǒng)層面尊沸,我們可以利用消息隊(duì)列做進(jìn)程間的通信;在一個(gè)單體應(yīng)用贤惯,比如Android應(yīng)用洼专,利用一個(gè)MessageQueue類來解決UI線程與耗時(shí)子線程之間的界面刷新問題,在物聯(lián)網(wǎng)領(lǐng)域孵构,基于發(fā)布/訂閱模型模型的MQTT協(xié)議被廣泛應(yīng)用于平臺(tái)對海量設(shè)備的消息分發(fā)屁商,而在分布式系統(tǒng),以及最近幾年日益熱門的微服務(wù)架構(gòu)中颈墅,是一個(gè)十分常用的實(shí)現(xiàn)異步消息蜡镶、解耦應(yīng)用、最終一致性的組件恤筛。
常見的消息隊(duì)列采用“發(fā)布-訂閱”模式官还,初入門者幾乎可以認(rèn)為這是個(gè)“觀察者模式”。

消息隊(duì)列模式-“發(fā)布-訂閱”模式

目前常用的消息隊(duì)列框架有Kafka毒坛、RabbitMQ望伦。
消息隊(duì)列實(shí)現(xiàn)增量同步的方式,是在主服務(wù)對數(shù)據(jù)庫進(jìn)行創(chuàng)建煎殷、刪除屯伞、修改一條記錄時(shí),發(fā)布一條主題消息給消息隊(duì)列豪直,同時(shí)同步服務(wù)需要訂閱相關(guān)主題劣摇,這樣消息隊(duì)列就可以將更新的記錄轉(zhuǎn)發(fā)給同步服務(wù),同步服務(wù)再根據(jù)消息的內(nèi)容在ES里面進(jìn)行更新記錄顶伞。
消息隊(duì)列實(shí)現(xiàn)增量同步除了可以解耦主服務(wù)和同步服務(wù)饵撑,還有一個(gè)好處就是保證同步的容錯(cuò)性剑梳,比如當(dāng)數(shù)據(jù)庫添加一條記錄時(shí),如果直接采用HTTP的方式(可能是一個(gè)post請求)與同步服務(wù)取得聯(lián)系時(shí)出現(xiàn)連接失敗滑潘、post請求失敗的時(shí)候垢乙,如果不采取任何措施這條記錄就會(huì)無法得到同步。而消息隊(duì)列的失敗重發(fā)的機(jī)制可以很好的解決這個(gè)問題语卤,同時(shí)消息隊(duì)列追逮,F(xiàn)IFO(先進(jìn)先出)的機(jī)制也保證了消息轉(zhuǎn)發(fā)的順序。

ES索引更改后怎樣做無縫重建

ES索引更改發(fā)生在ElasticSearch 索引結(jié)構(gòu)發(fā)生變化粹舵,比如隨著業(yè)務(wù)的發(fā)展對Type中字段的增減以及字段類型的更改钮孵,或者發(fā)生在ES版本升級帶來的結(jié)構(gòu)變化時(shí),例如ES 5.0版本將之前的string類型拆分為textkeyword類型眼滤,當(dāng)我們希望對ES進(jìn)行版本升級時(shí)巴席,那么之前的string類型就不可再用了。

與常見的Web服務(wù)的藍(lán)綠部署實(shí)現(xiàn)無宕機(jī)升級類似诅需,ES無縫升級也可以類比實(shí)現(xiàn)漾唉。Web服務(wù)的藍(lán)綠部署的原理是使用LoadBalancer(負(fù)載均衡器)做流量切換,新舊服務(wù)都有不同的訪問URL堰塌,但是只有LoadBalancer的URL對外可訪問赵刑,即:

    1. 服務(wù)升級前:負(fù)載均衡指向舊服務(wù)V1
    1. 服務(wù)升級中:發(fā)布新服務(wù)V2,負(fù)載均衡依舊指向舊服務(wù)场刑,此時(shí)存在新舊服務(wù)同時(shí)存在
    1. 服務(wù)升級完成:新服務(wù)V2啟動(dòng)完成般此,負(fù)載均衡切換指向,將訪問流量導(dǎo)向新服務(wù)V2
    1. 服務(wù)升級完成:負(fù)載均衡切換指向后停掉舊服務(wù)V1
藍(lán)綠部署

ES索引的別名

ES提供了通過索引別名(alias)來訪問索引的方式:比如

curl -XPOST 'http://localhost:9200/_aliases' -d 
{
    "actions": [
        {"add": {"index": "test_20181007", "alias": "test"}}
    ]
}

就為索引test_20181007創(chuàng)建了一條別名test牵现,這樣訪問localhost:9200/test/_searchlocalhost:9200/test_20181007/_search都可以搜索索引里面的內(nèi)容铐懊。
ES的別名的存在為ES的無縫升級和切換提供了可能,類似于負(fù)載均衡切換指向一樣瞎疼,我們可以讓ES別名在升級前后居扒,指向新舊不同版本的索引即可。

ES無縫升級

    1. 新建帶版本的新索引
PUT /test_v2
{
    "settings": { ... any settings ... },
    "mappings": {
        "type_one": { ... any mappings ... },
    }
}
    1. 暫停增量更新
      由于在升級期間我們不希望后續(xù)的記錄更新到舊索引上丑慎,所以需要將消息隊(duì)列進(jìn)行暫停(pause)操作喜喂,在新索引創(chuàng)建成功后再開啟。
    1. 執(zhí)行全量數(shù)據(jù)導(dǎo)入
    1. 切換對外別名指向
      一個(gè)別名可以指向多個(gè)索引竿裂,所以我們在添加別名到新索引的同時(shí)必須從舊的索引中刪除它玉吁。這個(gè)操作需要原子化,這意味著我們需要使用 _aliases 操作:
POST /_aliases
{
    "actions": [
        { "remove": { "index": "test_v1", "alias": "test" }},
        { "add":    { "index": "test_v2", "alias": "test" }}
    ]
}
    1. 刪除舊索引
DELETE /test_v1
    1. 開啟增量更新
      這樣在升級過程中的數(shù)據(jù)庫中有更新的記錄將會(huì)在新索引上同步

我的博客即將入駐“云棲社區(qū)”腻异,誠邀技術(shù)同仁一同入駐进副。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子影斑,更是在濱河造成了極大的恐慌给赞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矫户,死亡現(xiàn)場離奇詭異片迅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皆辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門柑蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驱闷,你說我怎么就攤上這事耻台。” “怎么了空另?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵盆耽,是天一觀的道長。 經(jīng)常有香客問我扼菠,道長征字,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任娇豫,我火速辦了婚禮,結(jié)果婚禮上畅厢,老公的妹妹穿的比我還像新娘冯痢。我一直安慰自己,他們只是感情好框杜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布浦楣。 她就那樣靜靜地躺著,像睡著了一般咪辱。 火紅的嫁衣襯著肌膚如雪振劳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天油狂,我揣著相機(jī)與錄音历恐,去河邊找鬼。 笑死专筷,一個(gè)胖子當(dāng)著我的面吹牛弱贼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磷蛹,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吮旅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了味咳?” 一聲冷哼從身側(cè)響起庇勃,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤檬嘀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后责嚷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸳兽,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年再层,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贸铜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聂受,死狀恐怖蒿秦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛋济,我是刑警寧澤棍鳖,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站碗旅,受9級特大地震影響渡处,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祟辟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一医瘫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旧困,春花似錦醇份、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拗盒,卻和暖如春怖竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陡蝇。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工痊臭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人登夫。 一個(gè)月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓趣兄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悼嫉。 傳聞我的和親對象是個(gè)殘疾皇子艇潭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,410評論 8 265
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常。 O...
    我想起個(gè)好名字閱讀 5,334評論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,111評論 1 32
  • 當(dāng)小草披上晨曦的露滴 我在淺淺的明溪中流浪 左岸的黃牛成群游蕩 右岸的春風(fēng)掠過草上 一不小心碰醒了青苔石 我被法律...
    年少不知愛閱讀 101評論 0 0
  • 伊洛蕓閱讀 251評論 0 0