如何正確的關閉Elasticsearch集群
背景
接觸Elasticsearch(5.x)也快半年時間了,一直也沒弄明白如何的關閉ES集群。經常在測試和生產環境遇到這樣的問題“重啟ES后數據怎么沒了?”,“啟動ES后,怎么一直有大量的數據在遷移?”
問題原因
其本質原因有兩點:
- ES中的數據不是實時寫入磁盤的。數據進入ES后先進入data buffer和log buffer,然后進入操作系統文件系統緩存的數據段,最后再特定時機下才刷入磁盤。即在內存中有很多數據是沒寫入磁盤的。
- ES的分片自動分配遷移機制。當集群發現經過一分鍾后(index.unassigned.node_left.delayed_timeout參數設置)還連接不上某個節點,就會把集群內的數據重新進行分布,即使后來節點重新連接上,原來的數據因為重新分布也無效了。

如何正確的關閉ES集群
- 第一步,禁止分片自動分布
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
- 第二步,執行同步刷新
POST _flush/synced
- 第三步,各節點逐個關閉
# 通過服務關閉
# sudo systemctl stop elasticsearch.service
# 發送TERM信號關閉進程
kill $(cat pid.txt)
如何啟動ES集群
- 第一步,執行完操作后逐個啟動節點,先master節點再其他節點
cd $ES_HOME/bin
./elasticsearch -d -p $ES_HOME/pid.txt
- 第二步,等待所有節點加入集群
查看集群狀態是否為"yellow"或者"green"
GET _cat/health
GET _cat/nodes
- 第三步,啟用分片自動分布("yellow"或者"green"后)
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
- 第四步,等待集群可用
通過集群的狀態和恢復進程監控集群是否可用
GET _cat/health
GET _cat/recovery
