date: 2020-05-28title: es全集群重启和滚动重启 #标题
tags: 重启es集群 #标签
categories: elastic stack # 分类

在某些情况下,可能需要执行全集群重新启动或滚动重新启动。在完全集群重新启动的情况下,是关闭并重新启动集群中的所有节点,而在滚动重新启动的情况下,一次只关闭一个节点,因此服务保持不中断。

这里就来记录下全集群启动和滚动重启。

全集群重启

禁用shard分配

当关闭一个节点时,集群开始将该节点上的shard(分片)复制到集群中的其他节点上,这会涉及大量1/O操作。但因为节点很快就要重新启动,所以这个I/0是不必要的。我们可以通过在关闭节点之前禁用副本分配:

接下来的put、post等操作均是在kibana的开发者工具里的控制台进行的,如下:

es全集群重启和滚动重启 - 图1

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.enable": "primaries"
  5. }
  6. }

上述操作也可以在命令行中这样执行:

  1. curl -XGET "http://es1:9200/_cat/nodes"

停止索引并执行同步刷新

执行同步刷新可以加速碎片恢复。

  1. POST _flush

注:在7.x以下的版本,请执行POST _flush/synced进行刷新同步。

请确保刷新成功,返回结果如下:

es全集群重启和滚动重启 - 图2

如果没有成功,请继续刷新操作。

停止机器学习

机器学习功能需要付费,要白金用户的许可。所以如果你是普通的es集群,那么可以略过这步了。

  1. POST _ml/set_upgrade_mode?enabled=true

停止集群中所有节点

至此,你就可以执行下面的操作停止集群中的所有节点了(不同的安装方式或操作系统上可能不太一样,我这里是centos 7使用tar.gz包安装的集群)

  1. $ ps -ef | grep elasticsearch | grep -v grep | awk '{print $2}' | xargs kill -9

执行你要进行的操作

至此,es集群就全部停止了,你现在可以执行所要进行的操作了,执行完成后,再看下面的操作,将es集群启动起来。

重启es集群

如果你有专有的master节点,请先启动master节点,等待它形成集群,然后再继续启动其他数据节点。可以通过查看日志来检查进度。

  1. # 先启动master节点
  2. $ su -s /bin/bash -c "/usr/local/es/bin/elasticsearch -p /data/es/es.pid -d" es

当查看master节点的日志,发现输出cluster的uuid,则表示集群已形成,具体输出如下:

es全集群重启和滚动重启 - 图3

等待所有节点加入集群并报告状态为黄色

查询集群健康状态或者节点状态

  1. GET _cat/health
  2. GET _cat/nodes

注:集群状态为yellow是正常的。因为我们还没有启用shard分配。

重新启用shard分配

当所有节点都加入集群并恢复它们的主分片时,通过恢复cluster.routing.allocation来重新启用分配。执行指令如下:

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.enable": null
  5. }
  6. }

返回如下:

  1. {
  2. "acknowledged" : true,
  3. "persistent" : { },
  4. "transient" : { }
  5. }

再次查看集群及节点状态

  1. GET _cat/health

返回如下:

  1. 1590574353 10:12:33 my-es green 3 2 14 7 0 0 0 0 - 100.0%

重启机器学习

如果你需要开启机器学习,那么还需要重启它。如下:

  1. POST _ml/set_upgrade_mode?enabled=false

滚动重启

禁用分片

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.enable": "primaries"
  5. }
  6. }

执行同步刷新

  1. POST _flush/synced

注:在7.x版本以上的版本,建议使用POST _flush/即可。

停止机器学习(可选)

  1. POST _ml/set_upgrade_mode?enabled=true

如果执行滚动重新启动,可以在关闭机器学习节点时让机器学习作业继续运行,该节点的作业将自动移动到另一个节点并恢复模型状态。,但会增加集群的负载。

关闭单个节点

此时,就可在终端上关闭单个节点了。

  1. $ ps -ef | grep elasticsearch | grep -v grep | awk '{print $2}' | xargs kill -9

修改配置并重启节点

配置修改后,即可启动节点了,并执行下面的指令来检查节点状态。

  1. GET _cat/nodes

再次开启分片分配

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster.routing.allocation.enable": null
  5. }
  6. }

重新启动机器学习(可选)

如果你之前停止了机器学习,那么此时可以启动它了。

  1. POST _ml/set_upgrade_mode?enabled=false

在重新启动滚动时重复上述操

当节点恢复并且集群稳定时,为需要更改的每个节点重复上面这些步骤。