日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 架構(gòu)師社區(qū)
[導(dǎo)讀]一、寫在前面?ES(Elasticsearch下文統(tǒng)一稱為ES)越來越多的企業(yè)在業(yè)務(wù)場景是使用ES存儲自己的非結(jié)構(gòu)化數(shù)據(jù),例如電商業(yè)務(wù)實(shí)現(xiàn)商品站內(nèi)搜索,數(shù)據(jù)指標(biāo)分析,日志分析等,ES作為傳統(tǒng)關(guān)系型數(shù)據(jù)庫的補(bǔ)充,提供了關(guān)系型數(shù)據(jù)庫不具備的一些能力。ES最先進(jìn)入大眾視野的是其能夠?qū)崿F(xiàn)...




一、寫在前面



ES(Elasticsearch下文統(tǒng)一稱為ES)越來越多的企業(yè)在業(yè)務(wù)場景是使用ES存儲自己的非結(jié)構(gòu)化數(shù)據(jù),例如電商業(yè)務(wù)實(shí)現(xiàn)商品站內(nèi)搜索,數(shù)據(jù)指標(biāo)分析,日志分析等,ES作為傳統(tǒng)關(guān)系型數(shù)據(jù)庫的補(bǔ)充,提供了關(guān)系型數(shù)據(jù)庫不具備的一些能力。



ES最先進(jìn)入大眾視野的是其能夠?qū)崿F(xiàn)全文搜索的能力,也是由于基于Lucene的實(shí)現(xiàn),內(nèi)部有一種倒排索引的數(shù)據(jù)結(jié)構(gòu)。



本文作者將介紹ES的分布式架構(gòu),以及ES的存儲索引機(jī)制,本文不會詳細(xì)介紹ES的API,會從整體架構(gòu)層面進(jìn)行分析,后續(xù)作者會有其他文章對ES的使用進(jìn)行介紹。



二、什么是倒排索引



要講明白什么是倒排索引,首先我們先梳理下什么索引,比如一本書,書的目錄頁,有章節(jié),章節(jié)名稱,我們想看哪個章節(jié),我們通過目錄頁,查到對應(yīng)章節(jié)和頁碼,就能定位到具體的章節(jié)內(nèi)容,通過目錄頁的章節(jié)名稱查到章節(jié)的頁碼,進(jìn)而看到章節(jié)內(nèi)容,這個過程就是一個索引的過程,那么什么是倒排索引呢?



比如查詢《java編程思想》這本書的文章,翻開書本可以看到目錄頁,記錄這個章節(jié)名字和章節(jié)地址頁碼,通過查詢章節(jié)名字“繼承”可以定位到“繼承”這篇章節(jié)的具體地址,查看到文章的內(nèi)容,我們可以看到文章內(nèi)容中包含很多“對象”這個詞。



那么如果我們要在這本書中查詢所有包含有“對象”這個詞的文章,那該怎么辦呢?



按照現(xiàn)在的索引方式無疑大海撈針,假設(shè)我們有一個“對象”--→文章的映射關(guān)系,不就可以了嗎?類似這樣的反向建立映射關(guān)系的就叫倒排索引。



如圖1所示,將文章進(jìn)行分詞后得到關(guān)鍵詞,在根據(jù)關(guān)鍵詞建立倒排索引,關(guān)鍵詞構(gòu)建成一個詞典,詞典中存放著一個個詞條(關(guān)鍵詞),每個關(guān)鍵詞都有一個列表與其對應(yīng),這個列表就是倒排表,存放的是章節(jié)文檔編號和詞頻等信息,倒排列表中的每個元素就是一個倒排項(xiàng),最后可以看到,整個倒排索引就像一本新華字典,所有單詞的倒排列表往往順序地存儲在磁盤的某個文件里,這個文件被稱之為倒排文件。



分布式搜索引擎Elasticsearch的架構(gòu)分析


(圖1)



詞典和倒排文件是Lucene的兩種基本數(shù)據(jù)結(jié)構(gòu),但是存儲方式不同,詞典在內(nèi)存中存儲,倒排文件在磁盤上。本文不會去介紹分詞,tf-idf,BM25,向量空間相似度等構(gòu)建倒排索引和查詢倒排索引所用到的技術(shù),讀者只需要對倒排索引有個基本的認(rèn)識即可。



三、ES的集群架構(gòu)



1. 集群節(jié)點(diǎn)



一個ES集群可以有多個節(jié)點(diǎn)構(gòu)成,一個節(jié)點(diǎn)就是一個ES服務(wù)實(shí)例,通過配置集群名稱cluster.name加入集群。那么節(jié)點(diǎn)是如何通過配置相同的集群名稱加入集群的呢?要搞明白這個問題,我們必須先搞清楚ES集群中節(jié)點(diǎn)的角色。



ES中節(jié)點(diǎn)有角色的區(qū)分的,通過配置文件conf/elasticsearch.yml中配置以下配置進(jìn)行角色的設(shè)定。


node.master: true/falsenode.data: true/false


集群中單個節(jié)點(diǎn)既可以是候選主節(jié)點(diǎn)也可以是數(shù)據(jù)節(jié)點(diǎn),通過上面的配置可以進(jìn)行兩兩組合形成四大分類:



(1)僅為候選主節(jié)點(diǎn)
(2)既是候選主節(jié)點(diǎn)也是數(shù)據(jù)節(jié)點(diǎn)
(3)僅為數(shù)據(jù)節(jié)點(diǎn)
(4)既不是候選主節(jié)點(diǎn)也不是數(shù)據(jù)節(jié)點(diǎn)



候選主節(jié)點(diǎn):只有是候選主節(jié)點(diǎn)才可以參與選舉投票,也只有候選主節(jié)點(diǎn)可以被選舉為主節(jié)點(diǎn)。



主節(jié)點(diǎn):負(fù)責(zé)索引的添加、刪除,跟蹤哪些節(jié)點(diǎn)是群集的一部分,對分片進(jìn)行分配、收集集群中各節(jié)點(diǎn)的狀態(tài)等,穩(wěn)定的主節(jié)點(diǎn)對集群的健康是非常重要。



數(shù)據(jù)節(jié)點(diǎn):負(fù)責(zé)對數(shù)據(jù)的增、刪、改、查、聚合等操作,數(shù)據(jù)的查詢和存儲都是由數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé),對機(jī)器的CPU,IO以及內(nèi)存的要求比較高,一般選擇高配置的機(jī)器作為數(shù)據(jù)節(jié)點(diǎn)。



此外還有一種節(jié)點(diǎn)角色叫做協(xié)調(diào)節(jié)點(diǎn),其本身不是通過設(shè)置來分配的,用戶的請求可以隨機(jī)發(fā)往任何一個節(jié)點(diǎn),并由該節(jié)點(diǎn)負(fù)責(zé)分發(fā)請求、收集結(jié)果等操作,而不需要主節(jié)點(diǎn)轉(zhuǎn)發(fā)。這種節(jié)點(diǎn)可稱之為協(xié)調(diào)節(jié)點(diǎn),集群中的任何節(jié)點(diǎn)都可以充當(dāng)協(xié)調(diào)節(jié)點(diǎn)的角色。每個節(jié)點(diǎn)之間都會保持聯(lián)系。



分布式搜索引擎Elasticsearch的架構(gòu)分析


(圖2)



2. 發(fā)現(xiàn)機(jī)制



前文說到通過設(shè)置一個集群名稱,節(jié)點(diǎn)就可以加入集群,那么ES是如何做到這一點(diǎn)的呢?



這里就要講一講ES特殊的發(fā)現(xiàn)機(jī)制ZenDiscovery。



ZenDiscovery是ES的內(nèi)置發(fā)現(xiàn)機(jī)制,提供單播和多播兩種發(fā)現(xiàn)方式,主要職責(zé)是集群中節(jié)點(diǎn)的發(fā)現(xiàn)以及選舉Master節(jié)點(diǎn)。



多播也叫組播,指一個節(jié)點(diǎn)可以向多臺機(jī)器發(fā)送請求。生產(chǎn)環(huán)境中ES不建議使用這種方式,對于一個大規(guī)模的集群,組播會產(chǎn)生大量不必要的通信。



單播,當(dāng)一個節(jié)點(diǎn)加入一個現(xiàn)有集群,或者組建一個新的集群時(shí),請求發(fā)送到一臺機(jī)器。當(dāng)一個節(jié)點(diǎn)聯(lián)系到單播列表中的成員時(shí),它就會得到整個集群所有節(jié)點(diǎn)的狀態(tài),然后它會聯(lián)系Master節(jié)點(diǎn),并加入集群。



只有在同一臺機(jī)器上運(yùn)行的節(jié)點(diǎn)才會自動組成集群。ES 默認(rèn)被配置為使用單播發(fā)現(xiàn),單播列表不需要包含集群中的所有節(jié)點(diǎn),它只是需要足夠的節(jié)點(diǎn),當(dāng)一個新節(jié)點(diǎn)聯(lián)系上其中一個并且通信就可以了。如果你使用 Master 候選節(jié)點(diǎn)作為單播列表,你只要列出三個就可以了。



這個配置在 elasticsearch.yml 文件中:


discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]


集群信息收集階段采用了 Gossip 協(xié)議,上面配置的就相當(dāng)于一個seed nodes,Gossip協(xié)議這里就不多做贅述了。



ES官方建議unicast.hosts配置為所有的候選主節(jié)點(diǎn),ZenDiscovery 會每隔ping_interval(配置項(xiàng))ping一次,每次超時(shí)時(shí)間是discovery.zen.ping_timeout(配置項(xiàng)),3次(ping_retries配置項(xiàng))ping失敗則認(rèn)為節(jié)點(diǎn)宕機(jī),宕機(jī)的情況下會觸發(fā)failover,會進(jìn)行分片重分配、復(fù)制等操作。



如果宕機(jī)的節(jié)點(diǎn)不是Master,則Master會更新集群的元信息,Master節(jié)點(diǎn)將最新的集群元信息發(fā)布出去,給其他節(jié)點(diǎn),其他節(jié)點(diǎn)回復(fù)Ack,Master節(jié)點(diǎn)收到discovery.zen.minimum_master_nodes的值-1個 候選主節(jié)點(diǎn)的回復(fù),則發(fā)送Apply消息給其他節(jié)點(diǎn),集群狀態(tài)更新完畢。如果宕機(jī)的節(jié)點(diǎn)是Master,則其他的候選主節(jié)點(diǎn)開始Master節(jié)點(diǎn)的選舉流程。



2.1 選主



Master的選主過程中要確保只有一個master,ES通過一個參數(shù)quorum的代表多數(shù)派閾值,保證選舉出的master被至少quorum個的候選主節(jié)點(diǎn)認(rèn)可,以此來保證只有一個master。



選主的發(fā)起由候選主節(jié)點(diǎn)發(fā)起,當(dāng)前候選主節(jié)點(diǎn)發(fā)現(xiàn)自己不是master節(jié)點(diǎn),并且通過ping其他節(jié)點(diǎn)發(fā)現(xiàn)無法聯(lián)系到主節(jié)點(diǎn),并且包括自己在內(nèi)已經(jīng)有超過minimum_master_nodes個節(jié)點(diǎn)無法聯(lián)系到主節(jié)點(diǎn),那么這個時(shí)候則發(fā)起選主。



選主流程圖



分布式搜索引擎Elasticsearch的架構(gòu)分析



(圖3)



選主的時(shí)候按照集群節(jié)點(diǎn)的參數(shù) 排序。stateVersion從大到小排序,以便選出集群元信息較新的節(jié)點(diǎn)作為Master,id從小到大排序,避免在stateVersion相同時(shí)發(fā)生分票無法選出 Master。



排序后第一個節(jié)點(diǎn)即為Master節(jié)點(diǎn)。當(dāng)一個候選主節(jié)點(diǎn)發(fā)起一次選舉時(shí),它會按照上述排序策略選出一個它認(rèn)為的Master。



2.2 腦裂



提到分布式系統(tǒng)選主,不可避免的會提到腦裂這樣一個現(xiàn)象,什么是腦裂呢?如果集群中選舉出多個Master節(jié)點(diǎn),使得數(shù)據(jù)更新時(shí)出現(xiàn)不一致,這種現(xiàn)象稱之為腦裂。



簡而言之集群中不同的節(jié)點(diǎn)對于 Master的選擇出現(xiàn)了分歧,出現(xiàn)了多個Master競爭。



一般而言腦裂問題可能有以下幾個原因造成:


  • 網(wǎng)絡(luò)問題:集群間的網(wǎng)絡(luò)延遲導(dǎo)致一些節(jié)點(diǎn)訪問不到Master,認(rèn)為Master 掛掉了,而master其實(shí)并沒有宕機(jī),而選舉出了新的Master,并對Master上的分片和副本標(biāo)紅,分配新的主分片。



  • 節(jié)點(diǎn)負(fù)載:主節(jié)點(diǎn)的角色既為Master又為Data,訪問量較大時(shí)可能會導(dǎo)致 ES 停止響應(yīng)(假死狀態(tài))造成大面積延遲,此時(shí)其他節(jié)點(diǎn)得不到主節(jié)點(diǎn)的響應(yīng)認(rèn)為主節(jié)點(diǎn)掛掉了,會重新選取主節(jié)點(diǎn)。



  • 內(nèi)存回收:主節(jié)點(diǎn)的角色既為Master又為Data,當(dāng)Data節(jié)點(diǎn)上的ES進(jìn)程占用的內(nèi)存較大,引發(fā)JVM的大規(guī)模內(nèi)存回收,造成ES進(jìn)程失去響應(yīng)。



如何避免腦裂:我們可以基于上述原因,做出優(yōu)化措施:


  • 適當(dāng)調(diào)大響應(yīng)超時(shí)時(shí)間,減少誤判。通過參數(shù) discovery.zen.ping_timeout 設(shè)置節(jié)點(diǎn)ping超時(shí)時(shí)間,默認(rèn)為 3s,可以適當(dāng)調(diào)大。



  • 選舉觸發(fā),我們需要在候選節(jié)點(diǎn)的配置文件中設(shè)置參數(shù) discovery.zen.munimum_master_nodes 的值。這個參數(shù)表示在選舉主節(jié)點(diǎn)時(shí)需要參與選舉的候選主節(jié)點(diǎn)的節(jié)點(diǎn)數(shù),默認(rèn)值是 1,官方建議取值(master_eligibel_nodes/2) 1,其中 master_eligibel_nodes 為候選主節(jié)點(diǎn)的個數(shù)。這樣做既能防止腦裂現(xiàn)象的發(fā)生,也能最大限度地提升集群的高可用性,因?yàn)橹灰簧儆?discovery.zen.munimum_master_nodes 個候選節(jié)點(diǎn)存活,選舉工作就能正常進(jìn)行。當(dāng)小于這個值的時(shí)候,無法觸發(fā)選舉行為,集群無法使用,不會造成分片混亂的情況。



  • 角色分離,即是上面我們提到的候選主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)進(jìn)行角色分離,這樣可以減輕主節(jié)點(diǎn)的負(fù)擔(dān),防止主節(jié)點(diǎn)的假死狀態(tài)發(fā)生,減少對主節(jié)點(diǎn)宕機(jī)的誤判。



四、索引如何寫入的



1.  寫索引原理



1.1 分片



ES支持PB級全文搜索,通常我們數(shù)據(jù)量很大的時(shí)候,查詢性能都會越來越慢,我們能想到的一個方式的將數(shù)據(jù)分散到不同的地方存儲,ES也是如此,ES通過水平拆分的方式將一個索引上的數(shù)據(jù)拆分出來分配到不同的數(shù)據(jù)塊上,拆分出來的數(shù)據(jù)庫塊稱之為一個分片Shard,很像MySQL的分庫分表。



不同的主分片分布在不同的節(jié)點(diǎn)上,那么在多分片的索引中數(shù)據(jù)應(yīng)該被寫入哪里?肯定不能隨機(jī)寫,否則查詢的時(shí)候就無法快速檢索到對應(yīng)的數(shù)據(jù)了,這需要有一個路由策略來確定具體寫入哪一個分片中,怎么路由我們下文會介紹。在創(chuàng)建索引的時(shí)候需要指定分片的數(shù)量,并且分片的數(shù)量一旦確定就不能修改。



1.2 副本



副本就是對分片的復(fù)制,每個主分片都有一個或多個副本分片,當(dāng)主分片異常時(shí),副本可以提供數(shù)據(jù)的查詢等操作。主分片和對應(yīng)的副本分片是不會在同一個節(jié)點(diǎn)上的,避免數(shù)據(jù)的丟失,當(dāng)一個節(jié)點(diǎn)宕機(jī)的時(shí)候,還可以通過副本查詢到數(shù)據(jù),副本分片數(shù)的最大值是 N-1(其中 N 為節(jié)點(diǎn)數(shù))。



對doc的新建、索引和刪除請求都是寫操作,這些寫操作是必須在主分片上完成,然后才能被復(fù)制到對應(yīng)的副本上。ES為了提高寫入的能力這個過程是并發(fā)寫的,同時(shí)為了解決并發(fā)寫的過程中數(shù)據(jù)沖突的問題,ES通過樂觀鎖的方式控制,每個文檔都有一個 _version號,當(dāng)文檔被修改時(shí)版本號遞增。



一旦所有的副本分片都報(bào)告寫成功才會向協(xié)調(diào)節(jié)點(diǎn)報(bào)告成功,協(xié)調(diào)節(jié)點(diǎn)向客戶端報(bào)告成功。



分布式搜索引擎Elasticsearch的架構(gòu)分析


(圖4)



1.3 Elasticsearch 的寫索引流程



上面提到了寫索引是只能寫在主分片上,然后同步到副本分片,那么如圖4所示,這里有四個主分片分別是S0、S1、S2、S3,一條數(shù)據(jù)是根據(jù)什么策略寫到指定的分片上呢?這條索引數(shù)據(jù)為什么被寫到S0上而不寫到 S1 或 S2 上?這個過程是根據(jù)下面這個公式?jīng)Q定的。


shard = hash(routing) % number_of_primary_shards


以上公式的值是在0到number_of_primary_shards-1之間的余數(shù),也就是數(shù)據(jù)檔所在分片的位置。routing通過Hash函數(shù)生成一個數(shù)字,然后這個數(shù)字再除以number_of_primary_shards(主分片的數(shù)量)后得到余數(shù)。routing是一個可變值,默認(rèn)是文檔的_id ,也可以設(shè)置成一個自定義的值。



在一個寫請求被發(fā)送到某個節(jié)點(diǎn)后,該節(jié)點(diǎn)按照前文所述,會充當(dāng)協(xié)調(diào)節(jié)點(diǎn),會根據(jù)路由公式計(jì)算出寫哪個分片,當(dāng)前節(jié)點(diǎn)有所有其他節(jié)點(diǎn)的分片信息,如果發(fā)現(xiàn)對應(yīng)的分片是在其他節(jié)點(diǎn)上,再將請求轉(zhuǎn)發(fā)到該分片的主分片節(jié)點(diǎn)上。



在ES集群中每個節(jié)點(diǎn)都通過上面的公式知道數(shù)據(jù)的在集群中的存放位置,所以每個節(jié)點(diǎn)都有接收讀寫請求的能力。



那么為什么在創(chuàng)建索引的時(shí)候就確定好主分片的數(shù)量,并且不可修改?因?yàn)槿绻麛?shù)量變化了,那么所有之前路由計(jì)算的值都會無效,數(shù)據(jù)也就再也找不到了。



分布式搜索引擎Elasticsearch的架構(gòu)分析



( 圖5)



如上圖5所示,當(dāng)前一個數(shù)據(jù)通過路由計(jì)算公式得到的值是 shard=hash(routing)%4=0,則具體流程如下:


(1)數(shù)據(jù)寫請求發(fā)送到 node1 節(jié)點(diǎn),通過路由計(jì)算得到值為1,那么對應(yīng)的數(shù)據(jù)會應(yīng)該在主分片S1上。



(2)node1節(jié)點(diǎn)將請求轉(zhuǎn)發(fā)到 S1 主分片所在的節(jié)點(diǎn)node2,node2 接受請求并寫入到磁盤。



(3)并發(fā)將數(shù)據(jù)復(fù)制到三個副本分片R1上,其中通過樂觀并發(fā)控制數(shù)據(jù)的沖突。一旦所有的副本分片都報(bào)告成功,則節(jié)點(diǎn) node2將向node1節(jié)點(diǎn)報(bào)告成功,然后node1節(jié)點(diǎn)向客戶端報(bào)告成功。



這種模式下,只要有副本在,寫入延時(shí)最小也是兩次單分片的寫入耗時(shí)總和,效率會較低,但是這樣的好處也很明顯,避免寫入后單個機(jī)器硬件故障導(dǎo)致數(shù)據(jù)丟失,在數(shù)據(jù)完整性和性能方面,一般都是優(yōu)先選擇數(shù)據(jù),除非一些允許丟數(shù)據(jù)的特殊場景。



在ES里為了減少磁盤IO保證讀寫性能,一般是每隔一段時(shí)間(比如30分鐘)才會把數(shù)據(jù)寫入磁盤持久化,對于寫入內(nèi)存,但還未flush到磁盤的數(shù)據(jù),如果發(fā)生機(jī)器宕機(jī)或者掉電,那么內(nèi)存中的數(shù)據(jù)也會丟失,這時(shí)候如何保證?



對于這種問題,ES借鑒數(shù)據(jù)庫中的處理方式,增加CommitLog模塊,在ES中叫transLog,在下面的ES存儲原理中會介紹。



2.  存儲原理



上面介紹了在ES內(nèi)部的寫索引處理流程,數(shù)據(jù)在寫入到分片和副本上后,目前數(shù)據(jù)在內(nèi)存中,要確保數(shù)據(jù)在斷電后不丟失,還需要持久化到磁盤上。



我們知道ES是基于Lucene實(shí)現(xiàn)的,內(nèi)部是通過Lucene完成的索引的創(chuàng)建寫入和搜索查詢,Lucene 工作原理如下圖所示,當(dāng)新添加一片文檔時(shí),Lucene進(jìn)行分詞等預(yù)處理,然后將文檔索引寫入內(nèi)存中,并將本次操作寫入事務(wù)日志(transLog),transLog類似于mysql的binlog,用于宕機(jī)后內(nèi)存數(shù)據(jù)的恢復(fù),保存未持久化數(shù)據(jù)的操作日志。



默認(rèn)情況下,Lucene每隔1s(refresh_interval配置項(xiàng))將內(nèi)存中的數(shù)據(jù)刷新到文件系統(tǒng)緩存中,稱為一個segment(段)。一旦刷入文件系統(tǒng)緩存,segment才可以被用于檢索,在這之前是無法被檢索的。



因此refresh_interval決定了ES數(shù)據(jù)的實(shí)時(shí)性,因此說ES是一個準(zhǔn)實(shí)時(shí)的系統(tǒng)。segment 在磁盤中是不可修改的,因此避免了磁盤的隨機(jī)寫,所有的隨機(jī)寫都在內(nèi)存中進(jìn)行。隨著時(shí)間的推移,segment越來越多,默認(rèn)情況下,Lucene每隔30min或segment 空間大于512M,將緩存中的segment持久化落盤,稱為一個commit point,此時(shí)刪掉對應(yīng)的transLog。



當(dāng)我們在進(jìn)行寫操作的測試的時(shí)候,可以通過手動刷新來保障數(shù)據(jù)能夠被及時(shí)檢索到,但是不要在生產(chǎn)環(huán)境下每次索引一個文檔都去手動刷新,刷新操作會有一定的性能開銷。一般業(yè)務(wù)場景中并不都需要每秒刷新。



可以通過在 Settings 中調(diào)大 refresh_interval = "30s" 的值,來降低每個索引的刷新頻率,設(shè)值時(shí)需要注意后面帶上時(shí)間單位,否則默認(rèn)是毫秒。當(dāng) refresh_interval=-1 時(shí)表示關(guān)閉索引的自動刷新。



分布式搜索引擎Elasticsearch的架構(gòu)分析


(圖6)



索引文件分段存儲并且不可修改,那么新增、更新和刪除如何處理呢?



  • 新增,新增很好處理,由于數(shù)據(jù)是新的,所以只需要對當(dāng)前文檔新增一個段就可以了。



  • 刪除,由于不可修改,所以對于刪除操作,不會把文檔從舊的段中移除而是通過新增一個 .del 文件,文件中會列出這些被刪除文檔的段信息,這個被標(biāo)記刪除的文檔仍然可以被查詢匹配到, 但它會在最終結(jié)果被返回前從結(jié)果集中移除。



  • 更新,不能修改舊的段來進(jìn)行文檔的更新,其實(shí)更新相當(dāng)于是刪除和新增這兩個動作組成。會將舊的文檔在 .del 文件中標(biāo)記刪除,然后文檔的新版本中被索引到一個新的段??赡軆蓚€版本的文檔都會被一個查詢匹配到,但被刪除的那個舊版本文檔在結(jié)果集返回前就會被移除。



segment被設(shè)定為不可修改具有一定的優(yōu)勢也有一定的缺點(diǎn)。



優(yōu)點(diǎn):


  • 不需要鎖。如果你從來不更新索引,你就不需要擔(dān)心多進(jìn)程同時(shí)修改數(shù)據(jù)的問題。


  • 一旦索引被讀入內(nèi)核的文件系統(tǒng)緩存,便會留在哪里,由于其不變性。只要文件系統(tǒng)緩存中還有足夠的空間,那么大部分讀請求會直接請求內(nèi)存,而不會命中磁盤。這提供了很大的性能提升.


  • 其它緩存(像 Filter 緩存),在索引的生命周期內(nèi)始終有效。它們不需要在每次數(shù)據(jù)改變時(shí)被重建,因?yàn)閿?shù)據(jù)不會變化。


  • 寫入單個大的倒排索引允許數(shù)據(jù)被壓縮,減少磁盤 I/O 和需要被緩存到內(nèi)存的索引的使用量。



缺點(diǎn):


  • 當(dāng)對舊數(shù)據(jù)進(jìn)行刪除時(shí),舊數(shù)據(jù)不會馬上被刪除,而是在 .del 文件中被標(biāo)記為刪除。而舊數(shù)據(jù)只能等到段更新時(shí)才能被移除,這樣會造成大量的空間浪費(fèi)。


  • 若有一條數(shù)據(jù)頻繁的更新,每次更新都是新增新的,標(biāo)記舊的,則會有大量的空間浪費(fèi)。


  • 每次新增數(shù)據(jù)時(shí)都需要新增一個段來存儲數(shù)據(jù)。當(dāng)段的數(shù)量太多時(shí),對服務(wù)器的資源例如文件句柄的消耗會非常大。


  • 在查詢的結(jié)果中包含所有的結(jié)果集,需要排除被標(biāo)記刪除的舊數(shù)據(jù),這增加了查詢的負(fù)擔(dān)。



2.1  段合并



由于每當(dāng)刷新一次就會新建一個segment(段),這樣會導(dǎo)致短時(shí)間內(nèi)的段數(shù)量暴增,而segment數(shù)目太多會帶來較大的麻煩。大量的segment會影響數(shù)據(jù)的讀性能。每一個segment都會消耗文件句柄、內(nèi)存和CPU 運(yùn)行周期。



更重要的是,每個搜索請求都必須輪流檢查每個segment然后合并查詢結(jié)果,所以segment越多,搜索也就越慢。



因此Lucene會按照一定的策略將segment合并,合并的時(shí)候會將那些舊的已刪除文檔從文件系統(tǒng)中清除。被刪除的文檔不會被拷貝到新的大segment中。



合并的過程中不會中斷索引和搜索,倒排索引的數(shù)據(jù)結(jié)構(gòu)使得文件的合并是比較容易的。



段合并在進(jìn)行索引和搜索時(shí)會自動進(jìn)行,合并進(jìn)程選擇一小部分大小相似的段,并且在后臺將它們合并到更大的段中,這些段既可以是未提交的也可以是已提交的。



合并結(jié)束后老的段會被刪除,新的段被刷新到磁盤,同時(shí)寫入一個包含新段且排除舊的和較小的段的新提交點(diǎn),新的段被打開,可以用來搜索。段合并的計(jì)算量龐大,而且還要吃掉大量磁盤 I/O,并且段合并會拖累寫入速率,如果任其發(fā)展會影響搜索性能。



ES在默認(rèn)情況下會對合并流程進(jìn)行資源限制,所以搜索性能可以得到保證。





(圖7)



五、寫在最后



作者對ES的架構(gòu)原理和索引存儲和寫機(jī)制進(jìn)行介紹,ES的整體架構(gòu)體系相對比較巧妙,我們在進(jìn)行系統(tǒng)設(shè)計(jì)的時(shí)候可以借鑒其設(shè)計(jì)思路,本文只介紹ES整體架構(gòu)部分,更多的內(nèi)容,后續(xù)作者會在其他文章中繼續(xù)分享。




本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉