亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

ES分布式架構(gòu)及底層原理

Ocean / 1955人閱讀

摘要:分布式架構(gòu)原理設(shè)計(jì)的理念就是分布式搜索引擎,底層實(shí)現(xiàn)還是基于的,核心思想是在多態(tài)機(jī)器上啟動(dòng)多個(gè)進(jìn)程實(shí)例,組成一個(gè)集群。

es分布式架構(gòu)原理

elasticsearch設(shè)計(jì)的理念就是分布式搜索引擎,底層實(shí)現(xiàn)還是基于Lucene的,核心思想是在多態(tài)機(jī)器上啟動(dòng)多個(gè)es進(jìn)程實(shí)例,組成一個(gè)es集群。一下是es的幾個(gè)概念:

接近實(shí)時(shí)
es是一個(gè)接近實(shí)時(shí)的搜索平臺(tái),這就意味著,從索引一個(gè)文檔直到文檔能夠被搜索到有一個(gè)輕微的延遲

集群(cluster)
一個(gè)集群有多個(gè)節(jié)點(diǎn)(服務(wù)器)組成,通過所有的節(jié)點(diǎn)一起保存你的全部數(shù)據(jù)并且通過聯(lián)合索引和搜索功能的節(jié)點(diǎn)的集合,每一個(gè)集群有一個(gè)唯一的名稱標(biāo)識(shí)

節(jié)點(diǎn)(node)
一個(gè)節(jié)點(diǎn)就是一個(gè)單一的服務(wù)器,是你的集群的一部分,存儲(chǔ)數(shù)據(jù),并且參與集群和搜索功能,一個(gè)節(jié)點(diǎn)可以通過配置特定的名稱來加入特定的集群,在一個(gè)集群中,你想啟動(dòng)多少個(gè)節(jié)點(diǎn)就可以啟動(dòng)多少個(gè)節(jié)點(diǎn)。

索引(index)
一個(gè)索引就是還有某些共有特性的文檔的集合,一個(gè)索引被一個(gè)名稱唯一標(biāo)識(shí),并且這個(gè)名稱被用于索引通過文檔去執(zhí)行搜索,更新和刪除操作。

類型(type)
type 在6.0.0已經(jīng)不贊成使用

文檔(document)
一個(gè)文檔是一個(gè)基本的搜索單元

總結(jié):
es中,存儲(chǔ)數(shù)據(jù)的基本單位就是索引,比如說es中存儲(chǔ)了一些訂單系統(tǒng)的銷售數(shù)據(jù),就因該在es中創(chuàng)建一個(gè)索引,order—index,所有的銷售數(shù)據(jù)就會(huì)都寫到這個(gè)索引里面去,一個(gè)索引就像數(shù)據(jù)庫。而type就相當(dāng)于每一張表,
一個(gè)index里面可以有多個(gè)type,而mapping就相當(dāng)于表的結(jié)構(gòu)定義,定義了什么字段類型等,你往index的一個(gè)type里添加一行數(shù)據(jù)就叫做一個(gè)document,每一個(gè)document有多個(gè)filed,每一個(gè)filed就代表這個(gè)document的一個(gè)字段的值。

分片(shards)

在一個(gè)搜索里存儲(chǔ)的數(shù)據(jù),潛在的情況下可能會(huì)超過單個(gè)節(jié)點(diǎn)的硬件的存儲(chǔ)限制,為了解決這個(gè)問題,elasticsearch便提供了分片的功能,它可以將索引劃分為多個(gè)分片,當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候,你就可以簡(jiǎn)單的定義你想要的分片的數(shù)量,每一個(gè)分片本身是一個(gè)全功能的完全獨(dú)立的索引,可以部署到集群中的任何一個(gè)節(jié)點(diǎn)。分片的兩個(gè)總要原因:
(1)它允許你水平切分你的內(nèi)容卷
(2)它允許通過分片來分布和并執(zhí)行操作來應(yīng)對(duì)日益增長(zhǎng)的執(zhí)行量

復(fù)制(replica)
在一個(gè)網(wǎng)絡(luò)情況下,故障可能會(huì)隨時(shí)發(fā)生,有一個(gè)故障恢復(fù)機(jī)制是必須的,為了達(dá)到這個(gè)目的,ES允許你制作一個(gè)或多個(gè)拷貝放入一個(gè)叫做復(fù)制分片或短暫的復(fù)制品中。復(fù)制對(duì)于以下兩個(gè)主要原因很重要
(1)高可用。它提供了高可用的以來防止分片或者節(jié)點(diǎn)宕機(jī),為此,一個(gè)非常重要的注意點(diǎn)就是絕對(duì)不要講一個(gè)分片的拷貝放在跟這個(gè)分片相同的機(jī)器上。
(2)高并發(fā)。它允許你的分片可以提供超出自身吞吐量的搜索服務(wù),搜索行為可以在分片所有的拷貝中并行執(zhí)行。
總之,一個(gè)完整的流程就是,ES客戶端將一份數(shù)據(jù)寫入primary shard,它會(huì)將分成成對(duì)的shard分片,并將數(shù)據(jù)進(jìn)行復(fù)制,ES客戶端取數(shù)據(jù)的時(shí)候就會(huì)在replica或primary 的shard中去讀。ES集群有多個(gè)節(jié)點(diǎn),會(huì)自動(dòng)選舉一個(gè)節(jié)點(diǎn)為master節(jié)點(diǎn),這個(gè)master節(jié)點(diǎn)其實(shí)就是干一些管理類的操作,比如維護(hù)元數(shù)據(jù),負(fù)責(zé)切換primary shard 和replica shard的身份之類的,要是master節(jié)點(diǎn)宕機(jī)了,那么就會(huì)重新選舉下一個(gè)節(jié)點(diǎn)為master為節(jié)點(diǎn)。如果時(shí)非master宕機(jī)了,那么就會(huì)有master節(jié)點(diǎn),讓那個(gè)宕機(jī)的節(jié)點(diǎn)上的primary shard的身份轉(zhuǎn)移到replica shard上,如果修復(fù)了宕機(jī)的那臺(tái)機(jī)器,重啟之后,master節(jié)點(diǎn)就會(huì)控制將缺失的replica shard 分配過去,同步后續(xù)的修改工作,讓集群恢復(fù)正常。

es寫入數(shù)據(jù)的過程

客戶端選擇一個(gè)node發(fā)送請(qǐng)求過去,這個(gè)node就是coordinating node (協(xié)調(diào)節(jié)點(diǎn))

coordinating node,對(duì)document進(jìn)行路由,將請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的node

實(shí)際上的node上的primary shard處理請(qǐng)求,然后將數(shù)據(jù)同步到replica node

coordinating node,如果發(fā)現(xiàn)primary node和所有的replica node都搞定之后,就會(huì)返回請(qǐng)求到客戶端

es讀數(shù)據(jù)過程

查詢,GET某一條的數(shù)據(jù),寫入某個(gè)document,這個(gè)document會(huì)自動(dòng)給你分配一個(gè)全局的唯一ID,同時(shí)跟住這個(gè)ID進(jìn)行hash路由到對(duì)應(yīng)的primary shard上面去,當(dāng)然也可以手動(dòng)的設(shè)置ID

客戶端發(fā)送任何一個(gè)請(qǐng)求到任意一個(gè)node,成為coordinate node

coordinate node 對(duì)document進(jìn)行路由,將請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的node,此時(shí)會(huì)使用round-robin隨機(jī)輪訓(xùn)算法,在primary shard 以及所有的replica中隨機(jī)選擇一個(gè),讓讀請(qǐng)求負(fù)載均衡,

接受請(qǐng)求的node,返回document給coordinate note

coordinate node返回給客戶端

es搜索數(shù)據(jù)過程

客戶端發(fā)送一個(gè)請(qǐng)求給coordinate node

協(xié)調(diào)節(jié)點(diǎn)將搜索的請(qǐng)求轉(zhuǎn)發(fā)給所有的shard對(duì)應(yīng)的primary shard 或replica shard

query phase:每一個(gè)shard 將自己搜索的結(jié)果(其實(shí)也就是一些唯一標(biāo)識(shí)),返回給協(xié)調(diào)節(jié)點(diǎn),有協(xié)調(diào)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)的合并,排序,分頁等操作,產(chǎn)出最后的結(jié)果

fetch phase ,接著由協(xié)調(diào)節(jié)點(diǎn),根據(jù)唯一標(biāo)識(shí)去各個(gè)節(jié)點(diǎn)進(jìn)行拉去數(shù)據(jù),最總返回給客戶端

寫入數(shù)據(jù)的底層原理

數(shù)據(jù)先寫入到buffer里面,在buffer里面的數(shù)據(jù)時(shí)搜索不到的,同時(shí)將數(shù)據(jù)寫入到translog日志文件之中

如果buffer快滿了,或是一段時(shí)間之后,就會(huì)將buffer數(shù)據(jù)refresh到一個(gè)新的OS cache之中,然后每隔1秒,就會(huì)將OS cache的數(shù)據(jù)寫入到segment file之中,但是如果每一秒鐘沒有新的數(shù)據(jù)到buffer之中,就會(huì)創(chuàng)建一個(gè)新的空的segment file,只要buffer中的數(shù)據(jù)被refresh到OS cache之中,就代表這個(gè)數(shù)據(jù)可以被搜索到了。當(dāng)然可以通過restful api 和Java api,手動(dòng)的執(zhí)行一次refresh操作,就是手動(dòng)的將buffer中的數(shù)據(jù)刷入到OS cache之中,讓數(shù)據(jù)立馬搜索到,只要數(shù)據(jù)被輸入到OS cache之中,buffer的內(nèi)容就會(huì)被清空了。同時(shí)進(jìn)行的是,數(shù)據(jù)到shard之后,就會(huì)將數(shù)據(jù)寫入到translog之中,每隔5秒將translog之中的數(shù)據(jù)持久化到磁盤之中

重復(fù)以上的操作,每次一條數(shù)據(jù)寫入buffer,同時(shí)會(huì)寫入一條日志到translog日志文件之中去,這個(gè)translog文件會(huì)不斷的變大,當(dāng)達(dá)到一定的程度之后,就會(huì)觸發(fā)commit操作。

將一個(gè)commit point寫入到磁盤文件,里面標(biāo)識(shí)著這個(gè)commit point 對(duì)應(yīng)的所有segment file

強(qiáng)行將OS cache 之中的數(shù)據(jù)都fsync到磁盤文件中去。
解釋:translog的作用:在執(zhí)行commit之前,所有的而數(shù)據(jù)都是停留在buffer或OS cache之中,無論buffer或OS cache都是內(nèi)存,一旦這臺(tái)機(jī)器死了,內(nèi)存的數(shù)據(jù)就會(huì)丟失,所以需要將數(shù)據(jù)對(duì)應(yīng)的操作寫入一個(gè)專門的日志問價(jià)之中,一旦機(jī)器出現(xiàn)宕機(jī),再次重啟的時(shí)候,es會(huì)主動(dòng)的讀取translog之中的日志文件的數(shù)據(jù),恢復(fù)到內(nèi)存buffer和OS cache之中。

將現(xiàn)有的translog文件進(jìn)行清空,然后在重新啟動(dòng)一個(gè)translog,此時(shí)commit就算是成功了,默認(rèn)的是每隔30分鐘進(jìn)行一次commit,但是如果translog的文件過大,也會(huì)觸發(fā)commit,整個(gè)commit過程就叫做一個(gè)flush操作,我們也可以通過ES API,手動(dòng)執(zhí)行flush操作,手動(dòng)將OS cache 的數(shù)據(jù)fsync到磁盤上面去,記錄一個(gè)commit point,清空translog文件
補(bǔ)充:其實(shí)translog的數(shù)據(jù)也是先寫入到OS cache之中的,默認(rèn)每隔5秒之中將數(shù)據(jù)刷新到硬盤中去,也就是說,可能有5秒的數(shù)據(jù)僅僅停留在buffer或者translog文件的OS cache中,如果此時(shí)機(jī)器掛了,會(huì)丟失5秒的數(shù)據(jù),但是這樣的性能比較好,我們也可以將每次的操作都必須是直接fsync到磁盤,但是性能會(huì)比較差。

如果時(shí)刪除操作,commit的時(shí)候會(huì)產(chǎn)生一個(gè).del文件,里面講某個(gè)doc標(biāo)記為delete狀態(tài),那么搜索的時(shí)候,會(huì)根據(jù).del文件的狀態(tài),就知道那個(gè)文件被刪除了。

如果時(shí)更新操作,就是講原來的doc標(biāo)識(shí)為delete狀態(tài),然后重新寫入一條數(shù)據(jù)即可。

buffer每次更新一次,就會(huì)產(chǎn)生一個(gè)segment file 文件,所以在默認(rèn)情況之下,就會(huì)產(chǎn)生很多的segment file 文件,將會(huì)定期執(zhí)行merge操作

每次merge的時(shí)候,就會(huì)將多個(gè)segment file 文件進(jìn)行合并為一個(gè),同時(shí)將標(biāo)記為delete的文件進(jìn)行刪除,然后將新的segment file 文件寫入到磁盤,這里會(huì)寫一個(gè)commit point,標(biāo)識(shí)所有的新的segment file,然后打開新的segment file供搜索使用。

總之,segment的四個(gè)核心概念,refresh,flush,translog、merge

搜索的底層原理

查詢過程大體上分為查詢和取回這兩個(gè)階段,廣播查詢請(qǐng)求到所有相關(guān)分片,并將它們的響應(yīng)整合成全局排序后的結(jié)果集合,這個(gè)結(jié)果集合會(huì)返回給客戶端。

查詢階段

當(dāng)一個(gè)節(jié)點(diǎn)接收到一個(gè)搜索請(qǐng)求,這這個(gè)節(jié)點(diǎn)就會(huì)變成協(xié)調(diào)節(jié)點(diǎn),第一步就是將廣播請(qǐng)求到搜索的每一個(gè)節(jié)點(diǎn)的分片拷貝,查詢請(qǐng)求可以被某一個(gè)主分片或某一個(gè)副分片處理,協(xié)調(diào)節(jié)點(diǎn)將在之后的請(qǐng)求中輪訓(xùn)所有的分片拷貝來分?jǐn)傌?fù)載。

每一個(gè)分片將會(huì)在本地構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列,如果客戶端要求返回結(jié)果排序中從from 名開始的數(shù)量為size的結(jié)果集,每一個(gè)節(jié)點(diǎn)都會(huì)產(chǎn)生一個(gè)from+size大小的結(jié)果集,因此優(yōu)先級(jí)隊(duì)列的大小也就是from+size,分片僅僅是返回一個(gè)輕量級(jí)的結(jié)果給協(xié)調(diào)節(jié)點(diǎn),包括結(jié)果級(jí)中的每一個(gè)文檔的ID和進(jìn)行排序所需要的信息。

協(xié)調(diào)節(jié)點(diǎn)將會(huì)將所有的結(jié)果進(jìn)行匯總,并進(jìn)行全局排序,最總得到排序結(jié)果。

取值階段

查詢過程得到的排序結(jié)果,標(biāo)記處哪些文檔是符合要求的,此時(shí)仍然需要獲取這些文檔返回給客戶端

協(xié)調(diào)節(jié)點(diǎn)會(huì)確定實(shí)際需要的返回的文檔,并向含有該文檔的分片發(fā)送get請(qǐng)求,分片獲取的文檔返回給協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)節(jié)點(diǎn)將結(jié)果返回給客戶端。

倒排索引

倒排索引就建立分詞與文檔之間的映射關(guān)系,在倒排索引之中,數(shù)據(jù)時(shí)面向分詞的而不是面向文檔的。

在海量數(shù)據(jù)中怎樣提高效率

filesystem cache
ES的搜索引擎是嚴(yán)重的依賴底層的filesystem cache,如果給filesystem cache更多的內(nèi)存,盡量讓內(nèi)存可以容納所有的index segment file 索引數(shù)據(jù)文件

數(shù)據(jù)預(yù)熱
對(duì)于那些你覺得比較熱的數(shù)據(jù),經(jīng)常會(huì)有人訪問的數(shù)據(jù),最好做一個(gè)專門的緩存預(yù)熱子系統(tǒng),就是對(duì)熱數(shù)據(jù),每隔一段時(shí)間,你就提前訪問以下,讓數(shù)據(jù)進(jìn)入filesystem cache里面去,這樣期待下次訪問的時(shí)候,性能會(huì)更好一些。

冷熱分離

關(guān)于ES的性能優(yōu)化,數(shù)據(jù)拆分,將大量的搜索不到的字段,拆分到別的存儲(chǔ)中去,這個(gè)類似于MySQL的分庫分表的垂直才分。

document的模型設(shè)計(jì)

不要在搜索的時(shí)候去執(zhí)行各種復(fù)雜的操作,盡量在document模型設(shè)計(jì)的時(shí)候,寫入的時(shí)候就完成了,另外對(duì)于一些復(fù)雜的操作,盡量要避免

分頁性能優(yōu)化

翻頁的時(shí)候,翻得越深,每個(gè)shard返回的數(shù)據(jù)越多,而且協(xié)調(diào)節(jié)點(diǎn)處理的時(shí)間越長(zhǎng),當(dāng)然是用scroll,scroll會(huì)一次性的生成所有數(shù)據(jù)的一個(gè)快照,然后每次翻頁都是通過移動(dòng)游標(biāo)完成的。 api 只是在一頁一頁的往后翻

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69738.html

相關(guān)文章

  • 【最全】Java 進(jìn)階面試總結(jié)

    摘要:這里有一份面試題相關(guān)總結(jié),涉及高并發(fā)分布式高可用相關(guān)知識(shí)點(diǎn),在此分享給大家,希望大家能拿到一份理想的知識(shí)點(diǎn)會(huì)陸續(xù)更新在上,覺得還算湊和的話可以關(guān)注一下噢高并發(fā)架構(gòu)消息隊(duì)列為什么使用消息隊(duì)列消息隊(duì)列有什么優(yōu)點(diǎn)和缺點(diǎn)都有什么優(yōu)點(diǎn)和缺點(diǎn)如何保證消 這里有一份面試題相關(guān)總結(jié),涉及高并發(fā)、分布式、高可用相關(guān)知識(shí)點(diǎn),在此分享給大家,希望大家能拿到一份理想的 Offer! 知識(shí)點(diǎn)會(huì)陸續(xù)更新在 Git...

    nifhlheimr 評(píng)論0 收藏0
  • Android工程師轉(zhuǎn)型Java后端開發(fā)之路,自己選的路,跪著也要走下去!

    本文是公眾號(hào)讀者jianfeng投稿的面試經(jīng)驗(yàn)恭喜該同學(xué)成功轉(zhuǎn)型目錄:毅然轉(zhuǎn)型,沒頭蒼蠅制定目標(biāo),系統(tǒng)學(xué)習(xí)面試經(jīng)歷毅然轉(zhuǎn)崗,沒頭蒼蠅首先,介紹一下我的背景。本人坐標(biāo)廣州,2016年畢業(yè)于一個(gè)普通二本大學(xué),曾經(jīng)在某機(jī)構(gòu)培訓(xùn)過Android。2018年初的時(shí)候已經(jīng)在兩家小公司工作干了兩年的android開發(fā),然后會(huì)一些Tomcat、Servlet之類的技術(shù),當(dāng)時(shí)的年薪大概也就15萬這樣子。由于個(gè)人發(fā)展...

    番茄西紅柿 評(píng)論0 收藏0
  • 傳統(tǒng)行業(yè)程序員的深度焦慮?——快來互聯(lián)網(wǎng)行業(yè)吧!

    摘要:前言不少在傳統(tǒng)行業(yè)摸爬滾打的程序員越來越焦慮了,有些甚至睡不著覺。下面就幾個(gè)方面和大家談?wù)剛鹘y(tǒng)行業(yè)的技術(shù)人員如何轉(zhuǎn)型互聯(lián)網(wǎng)。傳統(tǒng)行業(yè)的程序員的晉升周期可能會(huì)非常長(zhǎng),年,甚至年時(shí)間才能做到高位。 前言 不少在傳統(tǒng)行業(yè)摸爬滾打的程序員越來越焦慮了,有些甚至睡不著覺。為什么?傳統(tǒng)行業(yè)的程序員們每天進(jìn)行的都是業(yè)務(wù)代碼的編寫,接觸不到更新更好的技術(shù);公司的效益并不好,如未達(dá)到目標(biāo)收益,只能進(jìn)行瘦...

    xuexiangjys 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<