如何正确的关闭Elasticsearch集群

如何正确的关闭Elasticsearch集群

背景

接触Elasticsearch(5.x)也快半年时间了,一直也没弄明白如何的关闭ES集群。经常在测试和生产环境遇到这样的问题“重启ES后数据怎么没了?”,“启动ES后,怎么一直有大量的数据在迁移?”

问题原因

其本质原因有两点:

  • ES中的数据不是实时写入磁盘的。数据进入ES后先进入data buffer和log buffer,然后进入操作系统文件系统缓存的数据段,最后再特定时机下才刷入磁盘。即在内存中有很多数据是没写入磁盘的。
  • ES的分片自动分配迁移机制。当集群发现经过一分钟后(index.unassigned.node_left.delayed_timeout参数设置)还连接不上某个节点,就会把集群内的数据重新进行分布,即使后来节点重新连接上,原来的数据因为重新分布也无效了。

ES内存数据模型

如何正确的关闭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
posted @ 2018-11-14 17:41  wangzhen3798  阅读(4971)  评论(0编辑  收藏