【ES】1. Elastic系統(tǒng)知識

核心概念

image.png

Node - 節(jié)點(diǎn)

  • 即節(jié)點(diǎn)。節(jié)點(diǎn)是組成Elasticsearch集群的基本服務(wù)單元,集群中的每個運(yùn)行中的Elasticsearch服務(wù)器都可稱之為節(jié)點(diǎn)。

  • 每個節(jié)點(diǎn)默認(rèn)都可以參加master選舉,可以禁止(比如配置比較低的機(jī)器)

  • 每個節(jié)點(diǎn)都保存了集群的狀態(tài),但是只有master才可以修改

  • 集群狀態(tài):

  • 1. 所有節(jié)點(diǎn)的信息。

  • 2.所有的索引以及其相關(guān)的mapping和setting的信息

  • 3. 分片的路由信息

  • 節(jié)點(diǎn)的類型:

  • data :數(shù)據(jù)節(jié)點(diǎn),可以存儲數(shù)據(jù)

  • coordinating : 協(xié)調(diào)節(jié)點(diǎn),接受客戶端請求,每個節(jié)點(diǎn)默認(rèn)都可以作為協(xié)調(diào)節(jié)點(diǎn)

  • Ingest: 預(yù)處理節(jié)點(diǎn)

  • hot/warm: 冷熱節(jié)點(diǎn)

Cluster - 集群

  • 集群。Elasticsearch的集群是由具有相同cluster.name (默認(rèn)值為elasticsearch)的一個或多個Elasticsearch節(jié)點(diǎn)組成的,各個節(jié)點(diǎn)協(xié)同工作,共享數(shù)據(jù)。同一個集群內(nèi)節(jié)點(diǎn)的名字不能重復(fù),但集群名稱一定要相同。

  • 在實(shí)際使用Elasticsearch集群時一般使用自定義集群名稱,可以防止錯誤加入集群

  • 集群狀態(tài):

  • 綠色 表示節(jié)點(diǎn)運(yùn)行狀態(tài)為健康狀態(tài)。所有的主分片和副本分片都可以正常工作,集群100%健康。

  • 黃色 表示節(jié)點(diǎn)的運(yùn)行狀態(tài)為預(yù)警狀態(tài)。所有的主分片都可以正常工作,但至少有一個副本分片是不能正常工作的。此時集群依然可以正常工作,但集群的高可用性在某種程度上被弱化。

  • 紅色 表示集群無法正常使用。此時,集群中至少有一個分片的主分片及它的全部副本分片都不可正常工作。雖然集群的查詢操作還可以進(jìn)行,但是也只能返回部分?jǐn)?shù)據(jù)(其他正常分片的數(shù)據(jù)可以返回),而分配到這個有問題分片上的寫入請求將會報(bào)錯,最終導(dǎo)致數(shù)據(jù)丟失。

image.png

Shards - 分片

  • 對于同一個索引進(jìn)行水平拆分,拆分后的每一個數(shù)據(jù)部分被稱為一個分片,一般來說,會將每個分片放入不同的節(jié)點(diǎn)上
  • 感覺和mysql的分表有點(diǎn)像,不同部分的數(shù)據(jù)存放到不同的數(shù)據(jù)片段中,所以也是,如果數(shù)量發(fā)生變化,自然需要把數(shù)據(jù)重新移動,所以es不允許修改分片數(shù)
  • 索引創(chuàng)建的時候指定分片數(shù)量,分片的數(shù)量一旦確定就不能更改。
  • 寫入數(shù)據(jù)的時候,是通過路由來確定具體寫入哪個分片中的
  • 在Elasticsearch中,默認(rèn)為一個索引創(chuàng)建5個主分片,并分別為每個主分片創(chuàng)建一個副本
  • 一個分片就是一個 lucene 索引
  • 分片越多搜索越慢

Replicas - 副本 備份

  • 副本是對主分片的備份,每個主分片可以有零個或多個副本,主分片和備份分片都可以對外提供數(shù)據(jù)查詢服務(wù)
  • 寫入: 首先在主分片上完成數(shù)據(jù)的索引,然后數(shù)據(jù)會從主分片分發(fā)到備份分片上進(jìn)行索引。
  • 主分片不可用時,Elasticsearch會在備份分片中選舉出一個分片作為主分片,從而避免數(shù)據(jù)丟失。
  • 優(yōu)點(diǎn):增加集群可用性 ,缺點(diǎn):如果分片過多,寫操作時會增加數(shù)據(jù)同步的負(fù)擔(dān)

Index - 索引

  • 在Elasticsearch中,索引由一個和多個分片組成。在使用索引時,需要通過索引名稱在集群內(nèi)進(jìn)行唯一標(biāo)識。

Mapping - 映射

  • Mapping表示中保存了定義索引中字段(Field)的存儲類型、分詞方式、是否存儲等信息,有點(diǎn)類似于關(guān)系數(shù)據(jù)庫(如MySQL)中的表結(jié)構(gòu)信息。
  • 一個索引的Mapping一旦創(chuàng)建,若已經(jīng)存儲了數(shù)據(jù),就不可修改了,但是我們可以增加一個新的Mapping

Settings - 配置

  • Settings是對集群中索引的定義信息,比如一個索引默認(rèn)的分片數(shù)、副本數(shù)等。

Analyzer - 分詞

  • Analyzer表示的是字段分詞方式的定義

Type - 類型 (6.2中只能包含1個type ,7移除了 type的概念)

  • type就是在一個索引可以創(chuàng)建多個Mapping,在老的版本有把索引比喻成數(shù)據(jù)庫,type比喻成表的說法。

為什么要移除Type呢?

  • 不同類型的“記錄”存儲在同一個index中,會影響lucene的壓縮性能,簡單說,影響效率

Document - 文檔

  • 索引中的每一條數(shù)據(jù)叫作一個文檔,與關(guān)系數(shù)據(jù)庫的使用方法類似,一條文檔數(shù)據(jù)通過_id在Type內(nèi)進(jìn)行唯一標(biāo)識。

Elasticsearch的架構(gòu)設(shè)計(jì)

服務(wù)發(fā)現(xiàn)以及選主

  • 在集群中配置一個相同的集群名稱(即cluster.name),就能將不同的節(jié)點(diǎn)連接到同一個集群

  • 有四種方式的實(shí)現(xiàn),默認(rèn)ZenDiscovery,一般有兩種方式加入,多播和單播

  • 多播:當(dāng)節(jié)點(diǎn)并非集群的一部分時(比如節(jié)點(diǎn)只是剛剛啟動或者重啟 ),它會發(fā)送一個多播的ping請求到網(wǎng)段中,該請求只是用來通知所有能連接到節(jié)點(diǎn)和集群它已經(jīng)準(zhǔn)備好加入到集群中。

  • 單播: 關(guān)閉多播,就可以安全地使用單播。當(dāng)節(jié)點(diǎn)不是集群的一部分時(比如節(jié)點(diǎn)重啟,啟動或者由于某些錯誤從集群中斷開),節(jié)點(diǎn)會發(fā)送一個ping請求到事先設(shè)置好的地址中,來通知集群它已經(jīng)準(zhǔn)備好加入到集群中了。

  • 多播是自行到網(wǎng)段中尋找,單播是在指定地址中尋找

  • 它會對所有可以成為master的節(jié)點(diǎn)(node.master: true)根據(jù)節(jié)點(diǎn)Id的字典排序,取第一個,暫且認(rèn)為它是master節(jié)點(diǎn)。如果對某個節(jié)點(diǎn)的投票數(shù)達(dá)到一定的值(可以成為master節(jié)點(diǎn)數(shù)n/2+1 discovery.zen.minimum_master_nodes )并且該節(jié)點(diǎn)自己也選舉自己,那這個節(jié)點(diǎn)就是master。否則重新選舉一直到滿足上述條件。

  • 如果只有一個本地節(jié)點(diǎn),則主節(jié)點(diǎn)就是它自己。

  • ES是如何避免腦裂現(xiàn)象的:可以通過discovery.zen.minimum_master_nodes這個參數(shù)的設(shè)置來避免腦裂,設(shè)置為(N/2)+1。

  • ES的集群只有一個節(jié)點(diǎn)的話可以有副本嗎?Elasticsearch 禁止同一個分片的主分片和副本分片在同一個節(jié)點(diǎn)上,所以如果是一個節(jié)點(diǎn)的集群是不能有副本的。其實(shí)在一個節(jié)點(diǎn)也就沒有了副本的意義

分片和路由

  • 分片一旦確定,不能修改
  • 對于并發(fā)的數(shù)據(jù)沖突,es采用樂觀鎖的方式來解決數(shù)據(jù)沖突,對于一些以最新數(shù)據(jù)為準(zhǔn)的數(shù)據(jù),可以采用自定義版本號的方式解決數(shù)據(jù)寫入沖突。默認(rèn)還可以設(shè)置樂觀鎖重試次數(shù)。
  • routing字段的取值默認(rèn)是id字段或者是parent字段,采用routing字段在Hash后之后再與有分片的數(shù)量取模。這個值可以更改
  • shard_num = hash(_routing) % num_primary_shards
  • 在做數(shù)據(jù)檢索時,Elasticsearch默認(rèn)會搜索所有分片上的數(shù)據(jù),最后在主節(jié)點(diǎn)上匯總各個分片數(shù)據(jù)并進(jìn)行排序處理后,返回最終的結(jié)果數(shù)據(jù)
  • 通過路由的方式,還可以實(shí)現(xiàn)冷熱數(shù)據(jù)架構(gòu)
  • 路由官方文檔

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

1. 分段存儲

  • 使用原因: 索引是不可變的,為了實(shí)現(xiàn)數(shù)據(jù)的更新,需要通過增加新的補(bǔ)充索引來反映新近的修改,而不是直接重寫整個倒排索引。
  • lucene 索引再次分割的最小單位
  • 分段一經(jīng)創(chuàng)建,便不會被修改
  • 新增數(shù)據(jù):新增一個數(shù)據(jù)段
  • 刪除數(shù)據(jù):增加.del文件,被標(biāo)記的可以查詢到,但是在返回的時候會被移除
  • 修改數(shù)據(jù):先刪除,然后新增新的數(shù)據(jù)段
  • 優(yōu)勢: 不需要鎖,從而提升Elasticsearch的讀寫性能,
  • 缺點(diǎn): 1. 分段越多 搜索越慢,因?yàn)樾枰^濾刪除的數(shù)據(jù) 2. 在刪除和更新數(shù)據(jù)時,存儲空間會浪費(fèi)

2. 延遲寫策略

索引寫入磁盤的過程是異步的

基本方式
  • 每當(dāng)有新的數(shù)據(jù)產(chǎn)生的時候,會將數(shù)據(jù)先寫入內(nèi)存當(dāng)中,當(dāng)數(shù)據(jù)到達(dá)一定程度的時候,或者到達(dá)刷新時間,會觸發(fā)一次刷新(Refresh)操作。刷新操作將內(nèi)存中的數(shù)據(jù)生成到一個新的分段上并緩存到文件緩存系統(tǒng),稍后再被刷新到磁盤中并生成提交點(diǎn)。

  • 當(dāng)數(shù)據(jù)寫入內(nèi)存的時候,內(nèi)存的數(shù)據(jù)并不是用段來存儲的,因此不能提供檢索功能。只有當(dāng)數(shù)據(jù)由內(nèi)存刷新到文件緩存系統(tǒng)的時候,并生成一個新的段的時候,才能被搜索到,而不用等刷新到磁盤

  • 在es中,寫入和打開一個新的段,叫做刷新。在默認(rèn)情況下,每個分片會每秒自動刷新一次。這就是Elasticsearch能做到近實(shí)時搜索的原因,因?yàn)槲臋n的變化并不是立即對搜索可見的,但會在一秒之內(nèi)變?yōu)榭梢?。也可以手動刷新?/p>

  • 可以通過 refresh_interval 來調(diào)整刷新頻率, 當(dāng)為-1的時候,表示關(guān)閉自動刷新

  • 因?yàn)槲募到y(tǒng)緩存有數(shù)據(jù)丟失的風(fēng)險(xiǎn),所以引入了 Translog (事務(wù)日志),所以最終的寫入過程是這樣的

  1. 新文檔被索引之后,先被寫入內(nèi)存中。為了防止數(shù)據(jù)丟失,Elasticsearch會追加一份數(shù)據(jù)到事務(wù)日志中。此時的新數(shù)據(jù)還不能被檢索和查詢。

  2. 當(dāng)達(dá)到默認(rèn)的刷新時間或內(nèi)存中的數(shù)據(jù)達(dá)到一定量后,Elasticsearch會觸發(fā)一次刷新,將內(nèi)存中的數(shù)據(jù)以一個新段形式刷新到文件緩存系統(tǒng)中并清空內(nèi)存。這時新段雖未被提交到磁盤,但已經(jīng)可以對外提供文檔的檢索功能且不被修改。

  3. 隨著新文檔索引不斷被寫入,當(dāng)日志數(shù)據(jù)大小超過某個值(如512MB),或者超過一定時間(如30 min)時,Elasticsearch會觸發(fā)一次Flush,提交到硬盤。

  4. 生成提交點(diǎn)。日志文件被刪除,創(chuàng)建一個空的新日志。

  5. 新文檔先被放入內(nèi)存中,此時數(shù)據(jù)不能被檢索

image.png
  1. 默認(rèn)刷新時間(1秒鐘)到達(dá),或者數(shù)據(jù)到達(dá)一定量的時候,會把內(nèi)存中的數(shù)據(jù)創(chuàng)建一個新的段,此時數(shù)據(jù)可以被檢索,但是此時數(shù)據(jù)還在內(nèi)存。
image.png
  1. translog太大,或者默認(rèn)flush時間(30分鐘),進(jìn)行flush。段數(shù)據(jù)被提交到硬盤當(dāng)中,并且 translog 被清空
image.png

3. 段合并

  • 因?yàn)榉侄蔚奶攸c(diǎn),es在增寫刪所以必然會產(chǎn)生很多的分段,對資源的消耗會劇增。而且這樣的分段在查詢出來數(shù)據(jù)之后,還需要與del,進(jìn)行合并,這樣的話,段越多,搜索越慢。所以就需要進(jìn)行段合并。
  • 段合并機(jī)制在后臺定期進(jìn)行,從而小的段被合并到大的段,然后這些大的段再被合并到更大的段。
  • 段合并過程中,Elasticsearch會將那些舊的已刪除文檔從文件系統(tǒng)中清除。被刪除的文檔不會被拷貝到新的大段中,當(dāng)然,在合并的過程中不會中斷索引和搜索。
  • 合并結(jié)束后,老的段會被刪除,新的段被Flush到磁盤,同時寫入一個包含新段且排除舊的和較小的段的新提交點(diǎn)。打開新的段之后,可以用來搜索。
  • 默認(rèn)情況下會對合并流程進(jìn)行資源限制,防止影響搜索性能。
  • 官方文檔

WAL技術(shù)

Here is yuque doc card, click on the link to view:https://www.yuque.com/go/doc/42404465

主副分片數(shù)據(jù)一致性

  • 這個 不太確定
  • 看有2.3的版本有說,后面的版本沒有找到
  • 同步:主分片處理完畢,然后同步進(jìn)行數(shù)據(jù)同步到所有副本
  • 異步:主分片處理完畢直接返回,副本 異步同步,會造成服務(wù)器壓力過大

自動管理索引生命周期(ILM)

  • 把一個索引的生命周期定義為4個部分
image.png
  • Hot:索引可寫入,也可查詢。

  • Warm:索引不可寫入,但可查詢。

  • Cold:索引不可寫入,但很少被查詢,查詢的慢點(diǎn)也可接受。

  • Delete:索引可被安全的刪除

  • 文檔

  • 策略:

  • rollover:滾動存儲,建立新索引,數(shù)據(jù)新增引入新索引

  • delete: 自動刪除

  • shrink: 縮減分片,讀的時候分片少可以減少內(nèi)存消耗,寫的時候分片多可以提速

  • readonly: 設(shè)置為只讀

  • focemerge : 強(qiáng)行合并分段到一個很小的規(guī)模

  • freeze: 把索引關(guān)閉,不占用內(nèi)存,只占用磁盤,不可以檢索

  • allocate: 分片感知,可以用來冷熱分離

  • 完整的策略配置:完整策略

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">PUT _ilm/policy/full_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "7d", "max_size": "50G" }//當(dāng)數(shù)量到達(dá)500g,或者存儲時間超過7天的時候,就會進(jìn)行滾動存儲 } }, "warm": { "min_age": "30d",//進(jìn)入這個階段的條件 "actions": { "forcemerge": { "max_num_segments": 1 //強(qiáng)行合并分段 }, "shrink": { "number_of_shards": 1 //分片縮減到1個 }, "allocate": { "number_of_replicas": 2 //增加兩個副本 } } }, "cold": { "min_age": "60d",//進(jìn)入冷階段條件 "actions": { "allocate": { "require": {//將索引分配給 冷數(shù)據(jù)節(jié)點(diǎn) "type": "cold" } } } }, "delete": { "min_age": "90d",//進(jìn)行刪除的條件 "actions": { "delete": {}//刪除索引 } } } } }</pre>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容