Website logo

Robert Chang

技術部落格

Elasticsearch - 在叢集中加入新的節點

上一篇文章 中,我們理解了 replica shard 的意義,以及在建立 index 時自動附帶那個 UNASSIGN 的 replica shard。

這篇文章將會藉由新增節點的方式來讓叢集的狀態從 YELLOW 變成 GREEN

前情提要

還記得在 這篇文章 中,我們使用了非正規的方式在本地啟動 Elasticsearch ( 以下簡稱 ES ),其中的 discovery.type=single-node 限制了我們現在要新增節點的方式。

所以需要改用不一樣的方式來啟動 ES 的容器,其實很簡單,就換個方式啟動而已,關於 Kibana 的設定還是和之前一樣。

$ docker container run --name robert-es --net elastic -it -m 1GB -e "xpack.security.enabled=false" -e "node.name=node-1" -e "cluster.initial_master_nodes=node-1" -d docker.elastic.co/elasticsearch/elasticsearch:8.9.1

主要的重點在於宣告 initial_master_nodes,接著和之前一樣,你可以透過 Kibana 看到節點的狀態。

screen shot

接著因為是新的節點,照著 上一篇文章 中的方式建立新的 index,並且確認有一個 shard 是 UNASSIGN 的狀態。

新增節點

在啟動另外一個 Docker container 並且加上 discovery.seed_hosts=robert-node 的指令,至於這個 host 的名字,要是 container 的名字,這邊就涉及到 docker 的 DNS 知識,有空可以去了解一下。

$ docker container run --name robert-es-node-2 --net elastic -it -m 1GB -e "xpack.security.enabled=false" -e "node.name=node-2" -e "discovery.seed_hosts=robert-es" -d docker.elastic.co/elasticsearch/elasticsearch:8.9.1

接著透過 Kibana 的 Dev tools 來確認節點:

screen shot

確認 shard 狀態

接著一樣利用 Dev tools 來看看 shard 的狀態:

screen shot

有趣的地方來了,user 的 replica shard 已經被 assign 到另外一個 node 上面,而 上一篇文章 中所提到的 auto_expand_replicas 也確實的實現了,預設的 index 也都新增了 replica shard 到另外一個 node。

再加入一個節點會發生什麼?

如法炮製地繼續新增節點:

$ docker container run --name robert-es-node-3 --net elastic -it -m 1GB -e "xpack.security.enabled=false" -e "node.name=node-3" -e "discovery.seed_hosts=robert-es" -d docker.elastic.co/elasticsearch/elasticsearch:8.9.1

發現到所有的 shard 都被平均分配到 3 個 node 上面:

screen shot

到這裡就會發現 ES 真的很方便,背地裏完成了很多需要做的事情。

任意拔除某一個節點呢?

讓我們試試看 ES 掌握這種機器故障的能力如何,我們試著關掉其中一個子節點。

$ docker container rm -f robert-es-node-3

接著我們馬上去查看一下 master node 的 log 訊息:

$ docker container logs -f robert-es

可以看到下面的訊息,ES 馬上就偵測到有 node 離開叢集,接著將 health 轉為 YELLOW,然後開始進行 shard 的 reroute 作業,接著再把 health 切回 GREEN

screen shot

所以 ES 在針對這種機器故障,轉移資料的能力也是非常優秀,而且不需要我們手動介入,會自動完成作業。

ES 是如何做到自動分配的呢?

可以 參考這篇文章 ( 來自 ES 官方 )

如果啟動的是 Security mode 呢?

在這個模式下其實 ES 是非常完整的,所以只需要進入主要的節點輸入:

$ bin/elasticsearch-create-enrollment-token -scope node
# 產生一堆亂碼

接著再到第二個啟動的 ES node 內填入剛剛的 enrollment-token 就可以把第二個 node 加入到叢集之中:

$ bin/elasticsearch --enrollment-token # 剛剛產生的亂碼

完整模式下的 ES 其實在新增節點上更安全更簡單,主要的節點會發認證出去,拿到認證的節點可以申請加入這個叢集,大概是這樣的概念。

而這個功能在我們把 xpack.security.enabled=false 關掉時,就不復存在,所以才使用 discovery.seed_hosts=xxx 的方式來添加節點。

在 Production 的環境上,務必要打開 Security enable

結語

關於如何 完整的在本地使用 HTTPS 的 ES 在官方有很詳細的文件可以參閱,只要照著做就可以啟動安全的 ES 在本地。

在今天的文章中,可以感受到 ES 的威力以及它對於錯誤處理的能力,以及 UNASSIGN 的 shard 被指派的過程。

上一篇文章Elasticsearch - Replica Shard 複製分片 & Snapshot 快照

下一篇文章Elasticsearch - Index & Document 的 CRUD