上一篇文章 中,我們理解了 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 看到節點的狀態。
接著因為是新的節點,照著 上一篇文章 中的方式建立新的 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 來確認節點:
確認 shard 狀態
接著一樣利用 Dev tools 來看看 shard 的狀態:
有趣的地方來了,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 上面:
到這裡就會發現 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
所以 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 被指派的過程。