(十四)Elasticsearch集群配置

前言

??在我們es系列文章開篇介紹中,已經(jīng)提到,elasticsearch是天生支持集群的,他不需要依賴其他的服務(wù)發(fā)現(xiàn)和注冊的組件,如zookeeper這些,因?yàn)樗麅?nèi)置了一個名字叫ZenDiscovery的模塊,是elasticsearch自己實(shí)現(xiàn)的一套用于節(jié)點(diǎn)發(fā)現(xiàn)和選主等功能的組件,所以elasticsearch做起集群來非常簡單,不需要太多額外的配置和安裝額外的第三方組件。

數(shù)據(jù)分片

??我們在前面的篇章中介紹過elasticsearch的一些重要的基本概念了,但是為了循序漸進(jìn)的學(xué)習(xí)elasticsearch,我們并沒有把所有概念都一次性列出來,而是在學(xué)習(xí)的過程中不斷的補(bǔ)充,那現(xiàn)在我們需要學(xué)習(xí)elasticsearch的集群了,就需要補(bǔ)充一個基本概念,叫做“分片(shard)”,分片在集群中起到了非常關(guān)鍵的作用,那接下來,我們來看看分片是什么。
分片的概念和作用
??分片是一個底層的工作單元 ,它僅保存了全部數(shù)據(jù)中的一部分,一個分片是一個 Lucene 的實(shí)例,它本身就是一個完整的搜索引擎,我們的文檔被存儲和索引到分片內(nèi)。
??每個分片又有一個副本分片,副本分片就是主分片的copy,對于分布式搜索引擎來說, 分片及副本的分配將是高可用及快速搜索響應(yīng)的設(shè)計(jì)核心.主分片與副本都能處理查詢請求,它們的唯一區(qū)別在于只有主分片才能處理更新請求,這就有點(diǎn)像我們常見的“主從”的概念了。
??Elasticsearch 是利用分片將數(shù)據(jù)分發(fā)到集群內(nèi)各處的。分片是數(shù)據(jù)的容器,文檔保存在分片內(nèi),分片又被分配到集群內(nèi)的各個節(jié)點(diǎn)里。當(dāng)你的集群規(guī)模擴(kuò)大或者縮小時, Elasticsearch 會自動的在各節(jié)點(diǎn)中遷移分片,使得數(shù)據(jù)仍然均勻分布在集群里。所以集群和分片關(guān)系非常密切,學(xué)習(xí)集群之前,需要了解分片的概念和作用。

ES集群節(jié)點(diǎn)類型

??通過前面對elasticsearch的基本概念了解到,在一個elasticsearch集群(cluster)中,有多個節(jié)點(diǎn)(node),并且這些節(jié)點(diǎn)有不同的類型:我們部署一個elasticsearch集群常用的節(jié)點(diǎn)類型有:主節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn),候選主節(jié)點(diǎn),客戶端節(jié)點(diǎn)。
這些節(jié)點(diǎn)的類型是通過在elasticsearch主配置文件path/to/config/elasticsearch.yml文件指定的,配置屬性如下:

node.master: true/false #該節(jié)點(diǎn)有機(jī)會成為master節(jié)點(diǎn)
node.data: true/false #該節(jié)點(diǎn)可以存儲數(shù)據(jù)

??通過以上兩行配置的組合,我們可以指定出elasticsearch的節(jié)點(diǎn)類型。
每種節(jié)點(diǎn)的作用如下:

1、主節(jié)點(diǎn):

??主節(jié)點(diǎn)負(fù)責(zé)創(chuàng)建索引、刪除索引、分配分片、追蹤集群中的節(jié)點(diǎn)狀態(tài)等工作。Elasticsearch中的主節(jié)點(diǎn)的工作量相對較輕,用戶的請求可以發(fā)往集群中任何一個節(jié)點(diǎn),由該節(jié)點(diǎn)負(fù)責(zé)分發(fā)和返回結(jié)果,而不需要經(jīng)過主節(jié)點(diǎn)轉(zhuǎn)發(fā)。而主節(jié)點(diǎn)是由候選主節(jié)點(diǎn)通過ZenDiscovery機(jī)制選舉出來的,所以要想成為主節(jié)點(diǎn),首先要先成為候選主節(jié)點(diǎn)。

2、候選主節(jié)點(diǎn)

??在elasticsearch集群初始化或者主節(jié)點(diǎn)宕機(jī)的情況下,由候選主節(jié)點(diǎn)中選舉其中一個作為主節(jié)點(diǎn)。指定候選主節(jié)點(diǎn)的配置為:node.master: true。
??但是在elasticsearch集群中,會有偶爾出現(xiàn)這樣的一種現(xiàn)象,就是當(dāng)主節(jié)點(diǎn)負(fù)載壓力過大,或者集中環(huán)境中的網(wǎng)絡(luò)問題,導(dǎo)致其他節(jié)點(diǎn)與主節(jié)點(diǎn)通訊的時候,主節(jié)點(diǎn)沒來的及響應(yīng),這樣的話,某些節(jié)點(diǎn)就認(rèn)為主節(jié)點(diǎn)宕機(jī),重新選擇新的主節(jié)點(diǎn),這樣的話整個集群的工作就有問題了,比如我們集群中有10個節(jié)點(diǎn),其中7個候選主節(jié)點(diǎn),1個候選主節(jié)點(diǎn)成為了主節(jié)點(diǎn),這種情況是正常的情況。但是如果現(xiàn)在出現(xiàn)了我們上面所說的主節(jié)點(diǎn)響應(yīng)不及時,導(dǎo)致其他某些節(jié)點(diǎn)認(rèn)為主節(jié)點(diǎn)宕機(jī)而重選主節(jié)點(diǎn),那就有問題了,這剩下的6個候選主節(jié)點(diǎn)可能有3個候選主節(jié)點(diǎn)去重選主節(jié)點(diǎn),最后集群中就出現(xiàn)了兩個主節(jié)點(diǎn)的情況,這種情況官方成為“腦裂現(xiàn)象”
如果避免這種問題呢?主要從以下幾個方面來避免:
(1)盡量不要讓候選主節(jié)點(diǎn)同時作為數(shù)據(jù)節(jié)點(diǎn),因?yàn)閿?shù)據(jù)節(jié)點(diǎn)是需要承擔(dān)存儲和搜索的工作的,壓力會很大。所以如果該節(jié)點(diǎn)同時作為候選主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn),那么一旦選上它作為主節(jié)點(diǎn)了,這時主節(jié)點(diǎn)的工作壓力將會非常大,出現(xiàn)腦裂現(xiàn)象的概率就增加了。
(2)配置主節(jié)點(diǎn)的響應(yīng)時間,在默認(rèn)情況下,主節(jié)點(diǎn)3秒沒有響應(yīng),其他節(jié)點(diǎn)就認(rèn)為主節(jié)點(diǎn)宕機(jī)了,那我們可以把該時間設(shè)置的長一點(diǎn),該配置是:discovery.zen.ping_timeout: 3
(3)配置候選主節(jié)點(diǎn)最小數(shù)量,從腦裂現(xiàn)象出現(xiàn)的原因中,我們看到了,如果集群中有部分候選主節(jié)點(diǎn)重新選擇主節(jié)點(diǎn),那集群中的候選主節(jié)點(diǎn)就會被分成兩部分,導(dǎo)致集群的可用節(jié)點(diǎn)個數(shù)和實(shí)際的節(jié)點(diǎn)個數(shù)不一致,那這樣的話,我們就可用通過配置的方式,指定如果候選主節(jié)點(diǎn)個數(shù)達(dá)到某個值時,才能進(jìn)行主節(jié)點(diǎn)選舉,而該配置屬性如下:discovery.zen.minimum_master_nodes,該屬性默認(rèn)值是1,官方的推薦值是(N/2)+1,其中N是候選主節(jié)點(diǎn)的數(shù)量,那這樣的話,比如我們集群有7個候選主節(jié)點(diǎn),那么通過官方推薦值,我們應(yīng)該設(shè)置為4,這樣的話,至少有4個候選主節(jié)點(diǎn)都認(rèn)為需要重選主節(jié)點(diǎn)的情況下才進(jìn)行選舉。

3、數(shù)據(jù)節(jié)點(diǎn)

??數(shù)據(jù)節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的存儲和相關(guān)具體操作,比如CRUD、搜索、聚合。所以,數(shù)據(jù)節(jié)點(diǎn)對機(jī)器配置要求比較高,首先需要有足夠的磁盤空間來存儲數(shù)據(jù),其次數(shù)據(jù)操作對系統(tǒng)CPU、Memory和IO的性能消耗都很大。通常隨著集群的擴(kuò)大,需要增加更多的數(shù)據(jù)節(jié)點(diǎn)來提高可用性。指定數(shù)據(jù)節(jié)點(diǎn)的配置:node.data: true。
elasticsearch是允許一個節(jié)點(diǎn)既做候選主節(jié)點(diǎn)也做數(shù)據(jù)節(jié)點(diǎn)的,但是數(shù)據(jù)節(jié)點(diǎn)的負(fù)載較重,所以需要考慮將二者分離開,設(shè)置專用的候選主節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn),避免因數(shù)據(jù)節(jié)點(diǎn)負(fù)載重導(dǎo)致主節(jié)點(diǎn)不響應(yīng)。

4、客戶端節(jié)點(diǎn)

??按照官方的介紹,客戶端節(jié)點(diǎn)就是既不做候選主節(jié)點(diǎn)也不做數(shù)據(jù)節(jié)點(diǎn)的節(jié)點(diǎn),只負(fù)責(zé)請求的分發(fā)、匯總等等,但是這樣的工作,其實(shí)任何一個節(jié)點(diǎn)都可以完成,因?yàn)樵趀lasticsearch中一個集群內(nèi)的節(jié)點(diǎn)都可以執(zhí)行任何請求,其會負(fù)責(zé)將請求轉(zhuǎn)發(fā)給對應(yīng)的節(jié)點(diǎn)進(jìn)行處理。所以單獨(dú)增加這樣的節(jié)點(diǎn)更多是為了負(fù)載均衡。指定該節(jié)點(diǎn)的配置為:

node.master: false 
node.data: false 
image.png

集群配置

接下來,我們做一個集群測試一下,我這里使用4個節(jié)點(diǎn)做測試,分別為:

es1   192.168.85.133:9300
es2   192,168.85.133:9500
es3   192.168.85.135:9300
es4   192.168.85.135:9500

1、es1 既是候選主節(jié)點(diǎn)也是數(shù)據(jù)節(jié)點(diǎn),elasticsearch.yml配置如下:

cluster.name: elasticsearch #集群的名稱,同一個集群該值必須設(shè)置成相同的
node.name: es1 #該節(jié)點(diǎn)的名字
node.master: true #該節(jié)點(diǎn)有機(jī)會成為master節(jié)點(diǎn)
node.data: true #該節(jié)點(diǎn)可以存儲數(shù)據(jù)
network.bind_host: 0.0.0.0 #設(shè)置綁定的IP地址,可以是IPV4或者IPV6
network.publish_host: 192.168.85.133 #設(shè)置其他節(jié)點(diǎn)與該節(jié)點(diǎn)交互的IP地址
network.host: 192.168.85.133 #該參數(shù)用于同時設(shè)置bind_host和publish_host
transport.tcp.port: 9300 #設(shè)置節(jié)點(diǎn)之間交互的端口號
transport.tcp.compress: true #設(shè)置是否壓縮tcp上交互傳輸?shù)臄?shù)據(jù)
http.port: 9200 #設(shè)置對外服務(wù)的http端口號
http.max_content_length: 100mb #設(shè)置http內(nèi)容的最大大小
http.enabled: true #是否開啟http服務(wù)對外提供服務(wù)
discovery.zen.minimum_master_nodes: 2 #設(shè)置這個參數(shù)來保證集群中的節(jié)點(diǎn)可以知道其它N個有master資格的節(jié)點(diǎn)。官方推薦(N/2)+1
discovery.zen.ping_timeout: 120s #設(shè)置集群中自動發(fā)現(xiàn)其他節(jié)點(diǎn)時ping連接的超時時間
discovery.zen.ping.unicast.hosts: ["192.168.85.133:9300","192.168.85.133:9500","192.168.85.135:9300"] #設(shè)置集群中的Master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動發(fā)現(xiàn)其他新加入集群的節(jié)點(diǎn)
http.cors.enabled: true  #跨域連接相關(guān)設(shè)置
http.cors.allow-origin: "*"  #跨域連接相關(guān)設(shè)置  

2、es2 既是候選主節(jié)點(diǎn)也是數(shù)據(jù)節(jié)點(diǎn),elasticsearch.yml配置如下:

cluster.name: elasticsearch #集群的名稱,同一個集群該值必須設(shè)置成相同的
node.name: es2 #該節(jié)點(diǎn)的名字
node.master: true #該節(jié)點(diǎn)有機(jī)會成為master節(jié)點(diǎn)
node.data: true #該節(jié)點(diǎn)可以存儲數(shù)據(jù)
network.bind_host: 0.0.0.0 #設(shè)置綁定的IP地址,可以是IPV4或者IPV6
network.publish_host: 192.168.85.133 #設(shè)置其他節(jié)點(diǎn)與該節(jié)點(diǎn)交互的IP地址
network.host: 192.168.85.133 #該參數(shù)用于同時設(shè)置bind_host和publish_host
transport.tcp.port: 9500 #設(shè)置節(jié)點(diǎn)之間交互的端口號
transport.tcp.compress: true #設(shè)置是否壓縮tcp上交互傳輸?shù)臄?shù)據(jù)
http.port: 9400 #設(shè)置對外服務(wù)的http端口號
http.max_content_length: 100mb #設(shè)置http內(nèi)容的最大大小
http.enabled: true #是否開啟http服務(wù)對外提供服務(wù)
discovery.zen.minimum_master_nodes: 2 #設(shè)置這個參數(shù)來保證集群中的節(jié)點(diǎn)可以知道其它N個有master資格的節(jié)點(diǎn)。官方推薦(N/2)+1
discovery.zen.ping_timeout: 120s #設(shè)置集群中自動發(fā)現(xiàn)其他節(jié)點(diǎn)時ping連接的超時時間
discovery.zen.ping.unicast.hosts: ["192.168.85.133:9300","192.168.85.133:9500","192.168.85.135:9300"] #設(shè)置集群中的Master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動發(fā)現(xiàn)其他新加入集群的節(jié)點(diǎn)
http.cors.enabled: true  #跨域連接相關(guān)設(shè)置
http.cors.allow-origin: "*"  #跨域連接相關(guān)設(shè)置  

3、es3 是候選主節(jié)點(diǎn),elasticsearch.yml配置如下:

cluster.name: elasticsearch #集群的名稱,同一個集群該值必須設(shè)置成相同的
node.name: es3 #該節(jié)點(diǎn)的名字
node.master: true #該節(jié)點(diǎn)有機(jī)會成為master節(jié)點(diǎn)
node.data: false #該節(jié)點(diǎn)可以存儲數(shù)據(jù)
network.bind_host: 0.0.0.0 #設(shè)置綁定的IP地址,可以是IPV4或者IPV6
network.publish_host: 192.168.85.135 #設(shè)置其他節(jié)點(diǎn)與該節(jié)點(diǎn)交互的IP地址
network.host: 192.168.85.135 #該參數(shù)用于同時設(shè)置bind_host和publish_host
transport.tcp.port: 9300 #設(shè)置節(jié)點(diǎn)之間交互的端口號
transport.tcp.compress: true #設(shè)置是否壓縮tcp上交互傳輸?shù)臄?shù)據(jù)
http.port: 9200 #設(shè)置對外服務(wù)的http端口號
http.max_content_length: 100mb #設(shè)置http內(nèi)容的最大大小
http.enabled: true #是否開啟http服務(wù)對外提供服務(wù)
discovery.zen.minimum_master_nodes: 2 #設(shè)置這個參數(shù)來保證集群中的節(jié)點(diǎn)可以知道其它N個有master資格的節(jié)點(diǎn)。官方推薦(N/2)+1
discovery.zen.ping_timeout: 120s #設(shè)置集群中自動發(fā)現(xiàn)其他節(jié)點(diǎn)時ping連接的超時時間
discovery.zen.ping.unicast.hosts: ["192.168.85.133:9300","192.168.85.133:9500","192.168.85.135:9300"] #設(shè)置集群中的Master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動發(fā)現(xiàn)其他新加入集群的節(jié)點(diǎn)
http.cors.enabled: true  #跨域連接相關(guān)設(shè)置
http.cors.allow-origin: "*"  #跨域連接相關(guān)設(shè)置  

4、es4 是數(shù)據(jù)節(jié)點(diǎn),elasticsearch.yml配置如下:

cluster.name: elasticsearch #集群的名稱,同一個集群該值必須設(shè)置成相同的
node.name: es4 #該節(jié)點(diǎn)的名字
node.master: false #該節(jié)點(diǎn)有機(jī)會成為master節(jié)點(diǎn)
node.data: true #該節(jié)點(diǎn)可以存儲數(shù)據(jù)
network.bind_host: 0.0.0.0 #設(shè)置綁定的IP地址,可以是IPV4或者IPV6
network.publish_host: 192.168.85.135 #設(shè)置其他節(jié)點(diǎn)與該節(jié)點(diǎn)交互的IP地址
network.host: 192.168.85.135 #該參數(shù)用于同時設(shè)置bind_host和publish_host
transport.tcp.port: 9500 #設(shè)置節(jié)點(diǎn)之間交互的端口號
transport.tcp.compress: true #設(shè)置是否壓縮tcp上交互傳輸?shù)臄?shù)據(jù)
http.port: 9400 #設(shè)置對外服務(wù)的http端口號
http.max_content_length: 100mb #設(shè)置http內(nèi)容的最大大小
http.enabled: true #是否開啟http服務(wù)對外提供服務(wù)
discovery.zen.minimum_master_nodes: 2 #設(shè)置這個參數(shù)來保證集群中的節(jié)點(diǎn)可以知道其它N個有master資格的節(jié)點(diǎn)。官方推薦(N/2)+1
discovery.zen.ping_timeout: 120s #設(shè)置集群中自動發(fā)現(xiàn)其他節(jié)點(diǎn)時ping連接的超時時間
discovery.zen.ping.unicast.hosts: ["192.168.85.133:9300","192.168.85.133:9500","192.168.85.135:9300"] #設(shè)置集群中的Master節(jié)點(diǎn)的初始列表,可以通過這些節(jié)點(diǎn)來自動發(fā)現(xiàn)其他新加入集群的節(jié)點(diǎn)
http.cors.enabled: true  #跨域連接相關(guān)設(shè)置
http.cors.allow-origin: "*"  #跨域連接相關(guān)設(shè)置  

??以上配置就是我們集群中4個elasticsearch節(jié)點(diǎn)的配置,我們有兩個既是候選主節(jié)點(diǎn)也是數(shù)據(jù)節(jié)點(diǎn),一個候選主節(jié)點(diǎn),一個數(shù)據(jù)節(jié)點(diǎn),沒有配置客戶端節(jié)點(diǎn),因?yàn)榭蛻舳斯?jié)點(diǎn)僅起到負(fù)載均衡的作用。

驗(yàn)證群狀態(tài)

查看集群狀態(tài)的REST API
我們逐一的把集群中的節(jié)點(diǎn)啟動起來,然后使用REST API查看集群狀態(tài),訪問集群中任意一個節(jié)點(diǎn)即可:
GET ip:port/_cluster/health
響應(yīng)的結(jié)果:

{
  "cluster_name" : "elasticsearch",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 4,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 46,
  "active_shards" : 92,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

我們來看看返回結(jié)果中的幾個關(guān)鍵的屬性:

  • 集群狀態(tài)有3種(status):
    red,表示有主分片沒有分配,某些數(shù)據(jù)不可用。
    yellow,表示主分片都已分配,數(shù)據(jù)都可用,但是有副本分片沒有分配。
    green,表示主分片和副本分片都已分配,一切正常。
    那么通過以上返回的結(jié)果中的status屬性,我們可以知道,當(dāng)前的elasticsearch集群是正常的。
  • number_of_nodes屬性說明我們集群中有4個節(jié)點(diǎn)。
  • number_of_data_nodes說明我們集群中有3個為數(shù)據(jù)節(jié)點(diǎn),所有數(shù)據(jù)分片儲存在這3個數(shù)據(jù)節(jié)點(diǎn)中。
  • active_primary_shards屬性說明主分片有46個(我們有10個索引,其中9個索引有5個主分片,1個索引有1個主分片,合計(jì)46個主分片)
  • active_shards屬性說明所有分片(主分片 + 副本分片)總共是92個

使用head插件管理ES集群
??我們在之前安裝了es-head插件的時候提到,es-head插件可以管理我們elasticsearch集群的,那現(xiàn)在我們就使用之前安裝好的es-head插件,來圖形化界面的方式管理elasticsearch集群。
打開首頁我們可以看到以下界面:

image.png

??連接任意一個節(jié)點(diǎn)看到的結(jié)果都是一樣的,這個就驗(yàn)證了我們上面提到的概念:用戶的請求可以發(fā)往集群中任何一個節(jié)點(diǎn),由該節(jié)點(diǎn)負(fù)責(zé)請求分發(fā)和返回結(jié)果。

  • 在該界面中,是以表格的形式展示數(shù)據(jù)的,縱向的是集群中的索引,橫向的是集群中的節(jié)點(diǎn)。
  • 橫向有4行,分別是4個我們自己命名的節(jié)點(diǎn),其中標(biāo)記了es1是星號,代表它為主節(jié)點(diǎn)。
  • 然后我們可以看到,每個單元格中都有一些綠色的小方塊,小方塊中標(biāo)有數(shù)字,這些綠色小方塊就代表分片,其中邊框加粗的是主分片,沒加粗的是副本分片。
  • 我們在創(chuàng)建索引時,如果沒有指定分片的數(shù)量,那么默認(rèn)是5個,再加上每個分片都有一個副本,所以加起來就有10個綠色小方塊了。
  • 每個綠色小方塊上都有0-4的數(shù)字,分別代表0-4號分片,和對應(yīng)的0-4號分片的副本分片,我們點(diǎn)擊綠色小方塊,會彈出一個窗口,列出該分片的一些信息,其中有條信息是“primary”,如果為true,就代表主分片,為false就代表副本分片。
  • 其中es3節(jié)點(diǎn)是沒有給它分配分片的,那是因?yàn)楫?dāng)時我們給該節(jié)點(diǎn)設(shè)置的是候選主節(jié)點(diǎn),不是數(shù)據(jù)節(jié)點(diǎn),所以他不承擔(dān)數(shù)據(jù)存儲的工作。
  • 這10個分片(包含主分片和副本分片)被elasticsearch分配到各個數(shù)據(jù)節(jié)點(diǎn)中,并且根據(jù)我們上面對分片概念的了解,主分片和副本分片都可以接收數(shù)據(jù)查詢請求,但是只有主分片才能接收數(shù)據(jù)修改請求,副本分片的數(shù)據(jù)是從主分片同步過來的。
    測試數(shù)據(jù)
    ??最后,我們從用戶的角度上來看看,向集群中各個節(jié)點(diǎn)發(fā)送一個查詢請求,測試數(shù)據(jù)的一致性。
    我們先往集群中新增一條數(shù)據(jù),以store索引作為測試,向任意一個節(jié)點(diǎn)發(fā)送一個新增文檔的請求:
PUT /store/employee/3
{
    "name":"王五",
    "age":28,
    "about":"我叫王五,但不是隔壁老王",
    "interests":["code","music"]
}

看到以下返回結(jié)果提示添加成功:


image.png

??但這里有一個問題,就是該文檔會被存儲到哪一個主分片中呢?首先這肯定不會是隨機(jī)的,否則將來要獲取文檔的時候我們就不知道從何處尋找了。實(shí)際上,這個過程是根據(jù)下面這個公式?jīng)Q定的:

shard = hash(routing) % number_of_primary_shards

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

這就順便解釋了為什么我們要在創(chuàng)建索引的時候就確定好主分片的數(shù)量,并且永遠(yuǎn)不會改變這個數(shù)量,因?yàn)槿绻麛?shù)量變化了,那么所有之前路由的值都會無效,文檔也再也找不到了。

那接下來我們看看每個節(jié)點(diǎn)是否可以查詢到該數(shù)據(jù):


image.png
image.png
image.png

image.png

??這4個節(jié)點(diǎn)都是可以查詢到剛剛我們新增的文檔id為3的數(shù)據(jù),集群正常運(yùn)作。在我們整個集群配置的過程中,需要我們配置的東西很少,所以elasticsearch真的可以很輕松的完成一個規(guī)模超大的集群,并且在該集群中存儲海量的數(shù)據(jù)。

?著作權(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)容