ElasticSearch集群
集群節(jié)點
???????ELasticsearch的集群是由多個節(jié)點組成的,通過cluster.name設(shè)置集群名稱,并且用于區(qū)分其它的集群,每個節(jié)點通過node.name指定節(jié)點的名稱。
在Elasticsearch中,節(jié)點的類型主要有4種:
-
master節(jié)點
- 配置文件中node.master屬性為true(默認為true),就有資格被選為master節(jié)點。master節(jié)點用于控制整個集群的操作。比如創(chuàng)建或刪除索引,管理其它非master節(jié)點等。
-
data節(jié)點
- 配置文件中node.data屬性為true(默認為true),就有資格被設(shè)置成data節(jié)點。data節(jié)點主要用于執(zhí)行數(shù)據(jù)相關(guān)的操作。比如文檔的CRUD(創(chuàng)建(Create),讀取(Retrieve),更新(Update) 、刪除(Delete))。
-
客戶端節(jié)點
- 配置文件中node.master屬性和node.data屬性均為false。
- 該節(jié)點不能作為master節(jié)點,也不能作為data節(jié)點。
- 可以作為客戶端節(jié)點,用于響應(yīng)用戶的請求,把請求轉(zhuǎn)發(fā)到其他節(jié)點
-
部落節(jié)點
- 當一個節(jié)點配置tribe.*的時候,它是一個特殊的客戶端,它可以連接多個集群,在所有連接的集群上執(zhí)行搜索和其他操作。
搭建集群
準備3個服務(wù)器:192.168.40.137、192.168.4.138、192.168.40.150
所有以下配置需要在配置文件中保持唯一,如果有重復(fù)的,則會報錯
#啟動3個虛擬機,分別在3臺虛擬機上部署安裝Elasticsearch
mkdir -p /opt/elk
#將之前單機安裝的elasearch分發(fā)到其它機器
scp -r elsearch/ root@192.168.40.137:/opt/elk/
scp -r elsearch/ root@192.168.40.138:/opt/elk/
#node01的配置==>192.168.40.150
cluster.name: es-cluster
node.name: node01
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.40.137","192.168.40.138","192.168.40.150"]
cluster.initial_master_nodes: ["node01", "node02", "node03"]
# 最小節(jié)點數(shù)
node.roles: [master,data]
# 跨域?qū)S?/span>
http.cors.enabled: true
http.cors.allow-origin: "*"
#node02的配置:
cluster.name: es-cluster
node.name: node02
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.40.137","192.168.40.138","192.168.40.150"]
cluster.initial_master_nodes: ["node01", "node02", "node03"]
# 最小節(jié)點數(shù)
node.roles: [master,data]
#node03的配置:
cluster.name: es-cluster
node.name: node03
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.40.137","192.168.40.138","192.168.40.150"]
cluster.initial_master_nodes: ["node01", "node02", "node03"]
# 最小節(jié)點數(shù)
node.roles: [master,data]
#分別啟動3個節(jié)點
./elasticsearch
查看集群
創(chuàng)建一個索引,其中加粗的為主分片,其余為副本分片
查詢集群狀態(tài):/_cluster/health
響應(yīng)如下:
集群中有三種顏色
分片和副本
???????為了將數(shù)據(jù)添加到Elasticsearch,我們需要索引(index)——一個存儲關(guān)聯(lián)數(shù)據(jù)的地方。實際上,索引只是一個用來指向一個或多個分片(shards)的“邏輯命名空間(logical namespace)”.
-
一個分片(shard)是一個最小級別“工作單元(worker unit)”,它只是保存了索引中所有數(shù)據(jù)的一部分。
-
分片可以是主分片(primary shard)或者是復(fù)制分片(replica shard)。
-
索引中的每個文檔屬于一個單獨的主分片,所以主分片的數(shù)量決定了索引最多能存儲多少數(shù)據(jù)。
-
復(fù)制分片只是主分片的一個副本,它可以防止硬件故障導(dǎo)致的數(shù)據(jù)丟失,同時可以提供讀請求,比如搜索或者從別的shard取回文檔。
-
當索引創(chuàng)建完成的時候,主分片的數(shù)量就固定了,但是復(fù)制分片的數(shù)量可以隨時調(diào)整。
故障轉(zhuǎn)移
將data節(jié)點停止
這里選擇將node01停止:
???????當前集群狀態(tài)為黃色,表示主節(jié)點可用,副本節(jié)點不完全可用,過一段時間觀察,發(fā)現(xiàn)節(jié)點列表中看不到node01,副本節(jié)點分配到了node02和node03,集群狀態(tài)恢復(fù)到綠色。
將node01恢復(fù):./bin/elasticsearch
可以看到,node01恢復(fù)后,重新加入了集群,并且重新分配了節(jié)點信息。
將master節(jié)點停止
將node02停止,也就是將主節(jié)點停止。
???????從結(jié)果中可以看出,集群對master進行了重新選舉,選擇node03為master。并且集群狀態(tài)會變成黃色,
等待一段時間后,集群狀態(tài)從黃色變?yōu)榱司G色:
恢復(fù)node02節(jié)點:
./bin/elasticsearch
重啟之后,發(fā)現(xiàn)node02可以正常加入到集群中,集群狀態(tài)依然為綠色:
特別說明:
如果在配置文件中node.roles: [master,data]設(shè)置的不是N/2+1時,會出現(xiàn)腦裂問題,之前宕機的主節(jié)點恢復(fù)后不會加入到集群。
分布式文檔
路由
首先,來看個問題:
???????如圖所示:當我們想一個集群保存文檔時,文檔該存儲到哪個節(jié)點呢? 是隨機嗎? 是輪詢嗎?實際上,在ELasticsearch中,會采用計算的方式來確定存儲到哪個節(jié)點,計算公式如下:
shard = hash(routing) % number_of_primary_shards
其中:
- routing值是一個任意字符串,它默認是_id但也可以自定義。
- 這個routing字符串通過哈希函數(shù)生成一個數(shù)字,然后除以主切片的數(shù)量得到一個余數(shù)(remainder),余數(shù)的范圍永遠是0到number_of_primary_shards - 1,這個數(shù)字就是特定文檔所在的分片
這就是為什么創(chuàng)建了主分片后,不能修改的原因。
文檔的寫操作
???????新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能復(fù)制分片上
下面我們羅列在主分片和復(fù)制分片上成功新建、索引或刪除一個文檔必要的順序步驟:
- 客戶端給Node 1 發(fā)送新建、索引或刪除請求。
- 節(jié)點使用文檔的_id 確定文檔屬于分片0 。它轉(zhuǎn)發(fā)請求到Node 3 ,分片0 位于這個節(jié)點上。
- Node 3 在主分片上執(zhí)行請求,如果成功,它轉(zhuǎn)發(fā)請求到相應(yīng)的位于Node 1 和Node 2 的復(fù)制節(jié)點上。當所有的復(fù)制節(jié)點報告成功, Node 3 報告成功到請求的節(jié)點,請求的節(jié)點再報告給客戶端。
???????客戶端接收到成功響應(yīng)的時候,文檔的修改已經(jīng)被應(yīng)用于主分片和所有的復(fù)制分片。你的修改生效了。
搜索文檔
文檔能夠從主分片或任意一個復(fù)制分片被檢索。
下面羅列在主分片或復(fù)制分片上檢索一個文檔必要的順序步驟:
- 客戶端給Node 1 發(fā)送get請求。
- 節(jié)點使用文檔的_id 確定文檔屬于分片0 。分片0 對應(yīng)的復(fù)制分片在三個節(jié)點上都有。此時,它轉(zhuǎn)發(fā)請求到Node 2 。
- Node 2 返回文檔(document)給Node 1 然后返回給客戶端。
對于讀請求,為了平衡負載,請求節(jié)點會為每個請求選擇不同的分片,它會循環(huán)所有分片副本。
???????可能的情況是,一個被索引的文檔已經(jīng)存在于主分片上卻還沒來得及同步到復(fù)制分片上。這時復(fù)制分片會報告文檔未找到,主分片會成功返回文檔。一旦索引請求成功返回給用戶,文檔則在主分片和復(fù)制分片都是可用的。
全文搜索
???????對于全文搜索而言,文檔可能分散在各個節(jié)點上,那么在分布式的情況下,如何搜索文檔呢?
搜索,分為2個階段,
搜索(query)
取回(fetch)
搜索(query)
查詢階段包含以下三步:
- 客戶端發(fā)送一個search(搜索) 請求給Node 3 , Node 3 創(chuàng)建了一個長度為from+size 的空優(yōu)先級隊
- Node 3 轉(zhuǎn)發(fā)這個搜索請求到索引中每個分片的原本或副本。每個分片在本地執(zhí)行這個查詢并且結(jié)果將f返回到一個大小為from+size 的有序本地優(yōu)先隊列里去。
- 每個分片返回document的ID和它優(yōu)先隊列里的所有document的排序值給協(xié)調(diào)節(jié)點Node 3 。Node 3 把這些值合并到自己的優(yōu)先隊列里產(chǎn)生全局排序結(jié)果。
取回 fetch
文章來源:http://www.zghlxwxcb.cn/news/detail-514010.html
分發(fā)階段由以下步驟構(gòu)成:文章來源地址http://www.zghlxwxcb.cn/news/detail-514010.html
- 協(xié)調(diào)節(jié)點辨別出哪個document需要取回,并且向相關(guān)分片發(fā)出GET 請求。
- 每個分片加載document并且根據(jù)需要豐富(enrich)它們,然后再將document返回協(xié)調(diào)節(jié)點。
- 一旦所有的document都被取回,協(xié)調(diào)節(jié)點會將結(jié)果返回給客戶端。
到了這里,關(guān)于ElasticSearch集群8.0版本搭建、故障轉(zhuǎn)移的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!