日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Elasticsearch 入门到精通-Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica

發(fā)布時(shí)間:2024/3/7 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch 入门到精通-Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,我們來看下一下如下的這個(gè)圖:

1、Cluster

????????Cluster也就是集群的意思。Elasticsearch集群由一個(gè)或多個(gè)節(jié)點(diǎn)組成,可通過其集群名稱進(jìn)行標(biāo)識(shí)。通常這個(gè)Cluster 的名字是可以在Elasticsearch里的配置文件中設(shè)置的。在默認(rèn)的情況下,如我們的Elasticsearch已經(jīng)開始運(yùn)行,那么它會(huì)自動(dòng)生成一個(gè)叫做“elasticsearch”的集群。我們可以在config/elasticsearch.yml里定制我們的集群的名字

一個(gè)Elasticsearch的集群就像是下面的一個(gè)布局:

帶有NGINX代理及Balancer的架構(gòu)圖是這樣的:

可以通過GET _cluster/state來獲取整個(gè)cluster的狀態(tài)。這個(gè)狀態(tài)只能被master node所改變。

2、node

????????單個(gè)Elasticsearch實(shí)例。 在大多數(shù)環(huán)境中,每個(gè)節(jié)點(diǎn)都在單獨(dú)的盒子或虛擬機(jī)上運(yùn)行。一個(gè)集群由一個(gè)或多個(gè)node組成。在測(cè)試的環(huán)境中,我可以把多個(gè)node運(yùn)行在一個(gè)server上。在實(shí)際的部署中,大多數(shù)情況還是需要一個(gè)server上運(yùn)行一個(gè)node。

根據(jù)node的作用,可以分為如下的幾種:

  • master-eligible:可以作為主node。一旦成為主node,它可以管理整個(gè)cluster的設(shè)置及變化:創(chuàng)建,更新,刪除index;添加或刪除node;為node分配shard
  • data:數(shù)據(jù)node
  • ingest: 數(shù)據(jù)接入(比如 pipepline)
  • machine learning (Gold/Platinum License)

一般來說,一個(gè)node可以具有上面的一種或幾種功能。我們可以在命令行或者Elasticsearch的配置文件(Elasticsearch.yml)來定義:

也可以讓一node做專有的功能及角色。如果上面node配置參數(shù)沒有任何配置,那么我們可以認(rèn)為這個(gè)node是作為一個(gè)Coordinating node。在這種情況下,它可以接受外部的請(qǐng)求,并轉(zhuǎn)發(fā)到相應(yīng)的節(jié)點(diǎn)來處理。

在實(shí)際的使用中,我們可以把請(qǐng)求發(fā)送給data節(jié)點(diǎn),而不能發(fā)送給master節(jié)點(diǎn)。

我們可以通過對(duì)elasticsearch.yml文件中配置來定義一個(gè)node在集群中的角色:

在有些情況中,我們可以通過設(shè)置node.voting_only為true從而使得一個(gè)node在node.master為真的情況下,只作為參加voting的功能,而不當(dāng)選為master node。這種情況為了避免腦裂情況發(fā)生。它通??梢允褂靡粋€(gè)CPU性能較低的node來擔(dān)當(dāng)。

在整個(gè)Elastic的架構(gòu)中,Data Node和Cluster的關(guān)系表述如下:

3、Document

????????Elasticsearch是面向文檔的,這意味著您索引或搜索的最小數(shù)據(jù)單元是文檔。文檔在Elasticsearch中有一些重要的屬性:

  • 它是獨(dú)立的。文檔包含字段(名稱)及其值。
  • 它可以是分層的??梢詫⑵湟暈槲臋n中的文檔。字段的值可以很簡(jiǎn)單,就像位置字段的值可以是字符串一樣。它還可以包含其他字段和值。例如,位置字段可能包含城市和街道地址。
  • 結(jié)構(gòu)靈活。您的文檔不依賴于預(yù)定義的架構(gòu)。例如,并非所有事件都需要描述值,因此可以完全省略該字段。但它可能需要新的字段,例如位置的緯度和經(jīng)度。

文檔通常是數(shù)據(jù)的JSON表示形式。JSON over HTTP是與Elasticsearch進(jìn)行通信的最廣泛使用的方式.
很多人認(rèn)為document相比較于關(guān)系數(shù)據(jù)庫,它相應(yīng)于其中每個(gè)record。

4、type

????????類型是文檔的邏輯容器,類似于表是行的容器。 您將具有不同結(jié)構(gòu)(模式)的文檔放在不同類型中。 例如,您可以使用一種類型來定義聚合組,并在人們聚集時(shí)為事件定義另一種類型。
每種類型的字段定義稱為映射。 例如,name將映射為字符串,但location下的geolocation字段將映射為特殊的geo_point類型。 (我們探討如何使用附錄A中的地理空間數(shù)據(jù)。)每種字段的處理方式都不同。 例如,您在名稱字段中搜索單詞,然后按位置搜索組以查找位于您居住地附近的組。

????????很多人認(rèn)為Elasticsearch是schemaless的。大家都甚至認(rèn)為Elasticsearch中的數(shù)據(jù)庫是不需要mapping的。其實(shí)這是一個(gè)錯(cuò)誤的概念。schemaless在Elasticsearch中正確的理解是,我們不需要事先定義一個(gè)類型關(guān)系數(shù)據(jù)庫中的table才使用數(shù)據(jù)庫。在Elasticsearch中,我們可以不開始定義一個(gè)mapping,而直接寫入到我們指定的index中。這個(gè)index的mapping是動(dòng)態(tài)生成的。其中的數(shù)據(jù)項(xiàng)的每一個(gè)數(shù)據(jù)類型是動(dòng)態(tài)識(shí)別的。比如時(shí)間,字符串等,雖然有些的數(shù)據(jù)類型還是需要我們手動(dòng)調(diào)整,比如geo_point等地理位置數(shù)據(jù)。另外,它還有一個(gè)含義,同一個(gè)type,我們?cè)谝院蟮臄?shù)據(jù)輸入中,可能增加新的數(shù)據(jù)項(xiàng),從而生產(chǎn)新的mapping。這個(gè)也是動(dòng)態(tài)調(diào)整的。

????????由于一些原因,在Elasticsearch 6.0以后,一個(gè)Index只能含有一個(gè)type。這其中的原因是:相同index的不同映射type中具有相同名稱的字段是相同;?在Elasticsearch索引中,不同映射type中具有相同名稱的字段在Lucene中被同一個(gè)字段支持。在默認(rèn)的情況下是_doc。在未來8.0的版本中,type將被徹底刪除。

5、index

在Elasticsearch中,索引是文檔的集合。

每個(gè)Index是有一個(gè)或許多的documents組成,并且這些document可以分布于不同的shard之中。

????????很多人認(rèn)為index類似于關(guān)系數(shù)據(jù)庫中的database。這中說法是有些道理,但是并不完全相同。其中很重要的一個(gè)原因是,在Elasticsearch中的文檔可以有object及nested結(jié)構(gòu)。一個(gè)index是一個(gè)邏輯命名空間,它映射到一個(gè)或多個(gè)主分片,并且可以具有零個(gè)或多個(gè)副本分片。

????????每當(dāng)一個(gè)文檔進(jìn)來后,根據(jù)文檔的id會(huì)自動(dòng)進(jìn)行hash計(jì)算,并存放于計(jì)算出來的shard實(shí)例中,這樣的結(jié)果可以使得所有的shard都比較有均衡的存儲(chǔ),而不至于有的shard很忙。
shard_num = hash(_routing) % num_primary_shards

????????在默認(rèn)的情況下,上面的_routing既是文檔的_id。如果有routing的參與,那么這些文檔可能只存放于一個(gè)特定的shard,這樣的好處是對(duì)于一些情況,我們可以很快地綜合我們所需要的結(jié)果而不需要跨node去得到請(qǐng)求。

????????從上面的公式我們也可以看出來,我們的shard數(shù)目是不可以動(dòng)態(tài)修改的,否則之后也找不到相應(yīng)的shard號(hào)碼了。必須指出的是,replica的數(shù)目是可以動(dòng)態(tài)修改的。

6、shard

????????由于Elasticsearch是一個(gè)分布式搜索引擎,因此索引通常會(huì)拆分為分布在多個(gè)節(jié)點(diǎn)上的稱為分片的元素。 Elasticsearch自動(dòng)管理這些分片的排列。 它還根據(jù)需要重新平衡分片,因此用戶無需擔(dān)心細(xì)節(jié)。

一個(gè)索引可以存儲(chǔ)超出單個(gè)結(jié)點(diǎn)硬件限制的大量數(shù)據(jù)。比如,一個(gè)具有10億文檔的索引占據(jù)1TB的磁盤空間,而任一節(jié)點(diǎn)都沒有這樣大的磁盤空間;或者單個(gè)節(jié)點(diǎn)處理搜索請(qǐng)求,響應(yīng)太慢。

????????為了解決這個(gè)問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片(shard)。當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候,你可以指定你想要的分片(shard)的數(shù)量。每個(gè)分片本身也是一個(gè)功能完善并且獨(dú)立的“索引”,這個(gè)“索引”可以被放置到集群中的任何節(jié)點(diǎn)上。?
分片之所以重要,主要有兩方面的原因:

  • 允許你水平分割/擴(kuò)展你的內(nèi)容容量
  • 允許你在分片(潛在地,位于多個(gè)節(jié)點(diǎn)上)之上進(jìn)行分布式的、并行的操作,進(jìn)而提高性能/吞吐量

有兩種類型的分片:primary shard和replica shard。

  • Primary shard: 每個(gè)文檔都存儲(chǔ)在一個(gè)Primary shard。 索引文檔時(shí),它首先在Primary shard上編制索引,然后在此分片的所有副本上(replica)編制索引。索引可以包含一個(gè)或多個(gè)主分片。 此數(shù)字確定索引相對(duì)于索引數(shù)據(jù)大小的可伸縮性。 創(chuàng)建索引后,無法更改索引中的主分片數(shù)。
  • Replica shard: 每個(gè)主分片可以具有零個(gè)或多個(gè)副本。 副本是主分片的副本,有兩個(gè)目的:
    - 增加故障轉(zhuǎn)移:如果主要故障,可以將副本分片提升為主分片
    - 提高性能:get和search請(qǐng)求可以由主shard或副本shard處理。

默認(rèn)情況下,每個(gè)主分片都有一個(gè)副本,但可以在現(xiàn)有索引上動(dòng)態(tài)更改副本數(shù)。 永遠(yuǎn)不會(huì)在與其主分片相同的節(jié)點(diǎn)上啟動(dòng)副本分片。

下面的圖表示的是一個(gè)index有5個(gè)shard及1個(gè)replica:

可以為每個(gè)index設(shè)置相應(yīng)的shard數(shù)值:

curl -XPUT http://localhost:9200/another_user?pretty -H 'Content-Type: application/json' -d ' {"settings" : {"index.number_of_shards" : 2,"index.number_of_replicas" : 1} }

????????比如在上面的 REST接口中,我們?yōu)閍nother_user這個(gè)index設(shè)置了2個(gè)shards,并且有一個(gè)replica。一旦設(shè)置好shard的數(shù)量,我們就不可以修改了。這是因?yàn)镋lasticsearch會(huì)已經(jīng)這個(gè)數(shù)量,會(huì)依據(jù)每個(gè)document的id及shard的數(shù)量來把相應(yīng)的document分配到相應(yīng)的shard中。如果這個(gè)數(shù)量以后修改的話,那么每次搜索的時(shí)候,可能會(huì)找不到相應(yīng)的shard。

7、replica

????????默認(rèn)情況下,Elasticsearch為每個(gè)索引創(chuàng)建一個(gè)主分片和一個(gè)副本。這意味著每個(gè)索引將包含一個(gè)主分片,每個(gè)分片將具有一個(gè)副本。

????????分配多個(gè)分片和副本是分布式搜索功能設(shè)計(jì)的本質(zhì),提供高可用性和快速訪問索引中的文檔。主副本和副本分片之間的主要區(qū)別在于只有主分片可以接受索引請(qǐng)求。副本和主分片都可以提供查詢請(qǐng)求。

????????在上圖中,我們有一個(gè)Elasticsearch集群,由默認(rèn)分片配置中的兩個(gè)節(jié)點(diǎn)組成。 Elasticsearch自動(dòng)排列分割在兩個(gè)節(jié)點(diǎn)上的五個(gè)主分片。有一個(gè)副本分片對(duì)應(yīng)于每個(gè)主分片,但這些副本分片的排列與主分片的排列完全不同。再次,思考分配。

????????請(qǐng)?jiān)试S我們澄清一下:請(qǐng)記住,number_of_shards值與索引有關(guān),而不是與整個(gè)群集有關(guān)。此值指定每個(gè)索引的分片數(shù)(不是群集中的主分片總數(shù))。

可以通過如下的接口來獲得一個(gè)index的健康情況:

http://localhost:9200/_cat/indices/twitter

上面的接口可以返回如下的信息:

http://localhost:9200/_cat/shards

更進(jìn)一步的查詢,我們可以看出:

????????如果一個(gè)index顯示的是紅色,表面這個(gè)index至少有一個(gè)primary shard沒有被正確分配,并且有的shard及其相應(yīng)的replica已經(jīng)不能正常訪問。
如果是綠色,表明index的每一個(gè)shard都有備份,并且其備份也成功復(fù)制在相應(yīng)的replica shard之中。如果其中的一個(gè)node壞了,相應(yīng)的另外一個(gè)node的replica或其primary shard將起作用,從而不會(huì)造成數(shù)據(jù)的丟失。

shard 健康:

  • 紅色:集群中未分配至少一個(gè)主分片
  • 黃色:已分配所有主副本,但未分配至少一個(gè)副本
  • 綠色:分配所有分片

總結(jié)

以上是生活随笔為你收集整理的Elasticsearch 入门到精通-Elasticsearch中的一些重要概念:cluster, node, index, document, shards及replica的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。