1
集群信息
节点数:3
主机数:3
主机规格:8C8G,200G数据盘
运行方式:k8s,3个节点以statefulset的方式运行在三台主机上
故障发现
6月24日,登录kibana页面,用户名密码是正确的,但是无法登录,最初怀疑是kibana的问题,没有往ES集群方面想,第二天ES集群的磁盘告警了,三个节点的使用率都超过了90%,这时候才想起来kibana无法登录是不是跟这个有关,查看集群的健康状况,果然变成了红色。
初次处理
既然磁盘空间不足,于是每台主机扩容了300G,一共是500G数据盘,在线扩容完之后,磁盘空间是充足了,但是ES集群还是没能起来。可能是扩容的时候没有停掉集群导致数据丢失,也可能是集群的恢复时间过长导致启动失败,反正现在的状态好像更严重了,连端口都访问不通。
故障排查
三个pod都在running,但是都没有处于Ready状态,并没有对外暴露端口,所以只能进容器内访问集群,进入容器内之后,可以访问9200端口了,通过api查看健康状态
1 | curl -u user:passwd -XGET localhost:9200/_cluster/health?pretty |
发现有三百多个未分配的分片,查看未分配的原因
1 | curl -u user:passwd -XGET localhost:9200/_cluster/allocation/explain?pretty |
大概意思是说之前有副本分片的,现在没有了,原文cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster
,现在看起来是数据丢失没错了
解决方法
在网上搜了很多方法,都没用,最终通过retoute接口解决了问题,reroute接口可以手动完成对分片的配置,它有以下指令:allocate_replica
, allocate_stale_primary
, allocate_empty_primary
,move
和 cancel
。常用的一般是allocate
和 move
。
move
是移动分片的,如果有服务器下线,更换磁盘等原因,需要将分片从一个节点上移动到另一个节点上,这时候可以用move,很明显这次不属于这种情况。
allocate_replica
是分配副本分片的,我使用这个指令会报错,说主分片都未分配,副本分片分配不了,原文:[allocate_replica] trying to allocate a replica shard [cqbwqt_2233__2024.05.17][2], while corresponding primary shard is still unassigned"},"status":400
,放弃.
allocate_stale_primary
是分配旧的主分片的,我使用这个指令也会报错,说找不到数据(数据丢了当然找不到),原文是"type":"illegal_argument_exception","reason":"No data for shard [0] of index [filebeat-7.17.10-2024.06.07-000002] found on any node
,放弃
allocate_empty_primary
的作用是将空的主分片分配给节点,将创建一个空的主分片,并将其分配给一个节点,执行这个,没有报错,那就它了
脚本
三百多个分片,总不能一个一个手动去分配,于是写了一个脚本,放到每个容器里面去执行
1 |
|
大致的思路是,先查找出所有未分配的分片所属的索引,然后找出这个索引的所有未分配的分片,给他重新分配一个空的主分片,要修改的地方就是用户名密码,和node节点的名称。
三个节点都执行完毕之后,查看集群状态,绿色。