­

Elasticsearch 平滑下線節點實踐指南

  • 2020 年 3 月 11 日
  • 筆記

在 Elasticsearch 日常運維中,有時候要對集群的某一個節點進行下線、上線操作,比如增加磁碟,擴展記憶體,版本升級,或節點回收等。本文就根據近期的一次生產實踐,梳理如何實現 Elasticsearch 節點平滑下線。

所謂平滑下線,是指服務不中斷,不影響正常的數據寫入和業務查詢。首先我們不能直接 kill 服務進程,這樣可能會造成數據丟失,影響正常業務。下面整理了正確的操作步驟。

一、檢查集群配置,避免腦裂問題

在做節點下線操作之前,建議先檢查 master-eligible 節點的數量與 minimum_master_nodes 配置,確認下線節點不會影響集群可用性與穩定性,特別是針對小集群。涉及到的參數如下:

discovery.zen.minimum_master_nodes: 3  node.master: true

其中配置了 node.master 為 true 的節點即為 master-eligible 節點,這些節點有資格參與集群 master 節點選舉,而且該參數默認值為 true,小集群經常會忽略配置該參數。master 節點主要職責是創建/刪除索引,分配分片,發現與協調其他節點等。

minimum_master_nodes 屬性是為了避免數據丟失和腦裂問題,表示集群中最少要包含多少個 master-eligible 節點。例如集群中只有 2 個 master-eligible 節點,而 minimum_master_nodes 配置為 3,Elasticsearch 就選舉不出 master 節點,也就形成不了一個集群,Elasticsearch 服務會處於不可用狀態。因此,minimum_master_nodes 這個參數的配置非常重要,官方建議設為(master_eligible_nodes / 2) + 1,需要我們根據集群 master-eligible 節點數量進行設置。

因此,下線節點前要檢查是否需要修改 minimum_master_nodes。如果需要,建議先通過命令動態修改,並修改配置文件待下一次重啟生效。動態修改 minimum_master_nodes 的命令:

# 設置 minimum_master_nodes 為 2  curl -XPUT 'http://hostname:9200/_cluster/settings' -H 'Content-Type: application/json' -d '{    "persistent" : {      "discovery.zen.minimum_master_nodes" : 2    }  }'

這就是下線節點之前要做的必要檢查,確保沒有問題之後,接下來的操作也不複雜。

二、將節點從集群路由策略中排除

通過以下方式將下線節點從集群路由策略中排除:

curl -XPUT http://hostname:9200/_cluster/settings?pretty -H 'Content-Type: application/json' -d '{    "transient": {      "cluster.routing.allocation.exclude._name": "{node.name}"    }  }'

上面其實會觸發分片的 Allocation 機制,涉及的參數為 cluster.routing.allocation.exclude.{attribute},其中 {attribute} 表示節點的匹配方式,支援三種:

  • _name:匹配 node 名稱,多個 node 名稱用逗號隔開;
  • _ip:匹配 node ip 地址,多個地址用逗號隔開;
  • _host:匹配 node 主機名,多個主機名用逗號隔開;

執行後將導致 {node.name} 節點上的分片慢慢遷移到其他節點,可能會花幾分鐘甚至更多的時間,期間不會影響正常業務。

三、等待所有分區與數據遷移完成

上一步執行後,不能馬上停服務,必須要等待所有分片遷移到其他節點,若安裝了 ES head 插件,建議通過介面查看分區遷移情況集群健康狀態。也可以通過以下命令查看:

curl -s "http://hostname:9200/_cat/shards" | grep RELOCATING  curl http://hostname:9200/_cluster/health?pretty

所有分片遷移完成後,可再通過以下命令查看節點數據是否已遷移,都是 0 表示數據也已經遷移,如:

curl http://hostname:9200/_nodes/{node.name}/stats/indices?pretty    ...    "indices" : {          "docs" : {            "count" : 0,            "deleted" : 0          },          "store" : {            "size_in_bytes" : 0          },    ...

接下來就可以直接停服務進程了。

四、停掉節點服務進程

節點分片遷移完成後,停掉 ES 下線節點的服務進程:

# 若配置了服務,可 stop 服務  systemctl stop elasticsearch.service  # 或者 kill 服務進程  kill {pid}

五、恢復集群路由策略

此時節點已經完全從集群中刪除了,可恢復集群路由策略:

curl -XPUT http://hostname:9200/_cluster/settings?pretty -H 'Content-Type: application/json' -d '{    "transient": {      "cluster.routing.allocation.exclude._name": null    }  }'

至此節點下線操作完成。這裡的目標是將節點從集群中下線剔除,並沒有上線操作,如果要再次上線該節點,只需要啟動服務即可,節點會自動加入集群並分配分片。

六、總結

本文主要利用集群路由策略實現分片的自動遷移,從而實現了 Elasticsearch 集群節點的平滑下線,其實也能夠實現節點的循環重啟。

參考:Elasticsearch集群管理之1——如何高效的添加、刪除節點?