Elasticsearch 平滑下线节点实践指南

在 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——如何高效的添加、删除节点?

----------  END  ----------

往期推荐

三年时间,公众号原创好文汇总

推荐 | 颜值与功能双在线的 Elasticsearch 可视化工具:Cerebro

分享一下我对 ambari 二次开发的一些理解~

Elasticsearch 查询数据的工作原理是什么?

[译]如何防止elasticsearch的脑裂问题

Elasticsearch 创建索引前必须要了解的知识,提前避坑!

Elasticsearch BulkProcessor 的具体实现

Elasticsearch 6.x 配置详解

最后说一句(求关注,别白嫖我)

扫一扫,我们的故事就开始了。

81d15ba6d06a267e283baf23dc0ae166.png

文章有用,点赞、转发、在看都是一种支持,求三连

另外公众号改变了推送规则,大家看文章不要忘记点击最下方的在看,点赞按钮,这样微信自动识别为常看公众号,否则很可能推送的文章可能淹没在别的文章找不到,谢谢大家。

464c04992d6019f0814ba85cb038ccf4.png

                   动动小手,让更多需要的人看到~

3bde077c4e418d7f242ca42ec463c384.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值