Elasticsearch 节点下线流程
in Note with 0 comment
Elasticsearch 节点下线流程
in Note with 0 comment

情况是这样的:一些节点部署较早,跟别的服务混用,如 MongoDB、nfs等等。在服务混用的情况下,当资源不够时,就会出现竞争,竞争造成频繁的用户态和内核态之间切换,造成系统繁忙,IO异常,连累了别的服务,直接造成整个服务器上的服务不可用。

为了避免这种问题,只好将 es 节点迁走到干净的服务器上,让 es 这种 IO 大户自己一个人在服务器上玩。

所以就有了节点下线的需求。除了这种情况需要节点下线,还有别的情况也需要节点下线。更重要的是,为了保障可靠性,节点下线都要走人工控制的方式,所以特别需要写下这个节点下线流程的文章,去规范、约束和方便日后查找。

现状 es 版本为5.6.3,下面所有操作都是基于 5.6.3 版本

那么,es 节点迁走涉及三个问题:

1、 节点怎样迁走才能保证集群正常
2、 节点自身所维护的数据怎么迁走
3、 怎么确保节点是真正迁走了

如何获取集群状态

获取集群状态这步很关键,用于确保整个节点下线过程中集群是否有异常,并且能够及时作出反应。

获取集群状态可以通过下面请求:

curl -s http://172.25.52.191:39202/_cluster/health\?pretty

返回下面信息:

{
  "cluster_name" : "bi-data-es-production",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 12,
  "number_of_data_nodes" : 12,
  "active_primary_shards" : 8804,
  "active_shards" : 17608,
  "relocating_shards" : 2,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

找到 status,里面的值有 greenredyellow,每个值的含义如下:

通过发起请求获取集群状态,就可以根据状态值判断集群的健康状态。

约定节点下线流程

1、确保相关服务不再使用下线节点的 ip
2、执行节点下线请求
3、观察集群是否开始执行下线处理的重新分配
4、等待分片分配完成
5、检查下线机器的磁盘容量,检查是否还有分片还留在机器上
6、检查通过后,停掉下线节点的 es 服务
7、修改 es 配置文件,去掉 discovery_hosts
8、禁止 es 服务开启启动
9、根据需求确定是否需要删除 es 存储数据

执行节点下线请求

操作前请确保相关服务不再使用下线节点的 ip

节点下线的操作,以 172.25.52.12 这个节点 ip 为例,在 kibana 的 console 发起下面请求

PUT _cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.exclude._ip" : "172.25.52.12,172.25.52.13"
  }
}

节点下线只需要上面这条请求即可,如果有多台服务器需要下线,在后面用逗号隔开然后写入节点 IP。

注意事项:如果提交的命令有两个,它会覆盖前一个,被下线的服务器会把数据迁移后才会在集群中消失,如果数据没被迁移完,又执行了命令,这个节点不会被下线。

检查是否请求成功,在 kibana 的 console 发起下面请求

GET _cluster/settings

观察集群是否开始执行下线处理的重新分配

有两种方法:

方法一:

在终端里发起下面请求

curl -s http://172.25.52.191:39202/_cluster/health\?pretty

检查 relocating_shards 的值是否大于 0,如果大于 0 ,说明已经开始重新分配了

方法二:

在 kibana 的 console 发起下面请求

GET _cat/shards

正在 relocating shards, 大概长下面的样子:

twitter 0 p RELOCATING 3014 31.1mb 192.168.56.10 H5dfFeA -> -> 192.168.56.30 bGG90G

这两个方法也能检查分片分配是否完成。

检查下线机器的磁盘容量

ssh 登陆到机器上,执行下面命令,目录为 es 的数据目录:

du -d 1 -h /exports_data/elasticsearch/lib

返回下面信息,发现容量明显比之前的 150G 少了

104M    /exports_data/elasticsearch/lib/nodes
104M    /exports_data/elasticsearch/lib

通过【观察集群是否开始执行下线处理的重新分配】的方法也可以知道集群是否分片分配完成

停掉 es 服务

sudo systemctl stop elasticsearch.service

禁止 es 开机启动

sudo systemctl disable elasticsearch.service

修改配置,去掉 discovery_hosts

cd  /etc/elasticsearch
vim elasticsearch.yml

找到discovery.zen.ping.unicast.hosts ,修改值为[],空数组的值才能保证节点不会出现重新加入到集群的情况。

总结

至此,节点下线流程基本上已完成。整个流程比较繁琐,需要不断去确定是否正确操作。

但是,严苛流程才将出错的几率大大降低。稳住才能赢!

参考资源

Responses