修复kubernetes中弹性搜索损坏的集群



我部署了一个带有官方Helm图表的弹性搜索集群(https://github.com/elastic/helm-charts/tree/master/elasticsearch)。

有3个Helm版本:

  • master(3个节点(
  • 客户端(1个节点(
  • 数据(2个节点(

集群运行良好,我通过删除主版本进行了崩溃测试,并重新创建了它。

之后,主节点正常,但数据节点抱怨:

Caused by: org.elasticsearch.cluster.coordination.CoordinationStateRejectedException: join validation on cluster state with a different cluster uuid xeQ6IVkDQ2es1CO2yZ_7rw than local cluster uuid 9P9ZGqSuQmy7iRDGcit5fg, rejecting

这是正常的,因为主节点是新的。

如何在不删除数据文件夹的情况下修复数据节点群集状态

编辑:

我知道崩溃的原因,我知道一个基本的解决方案是删除数据文件夹并重新启动节点(正如我在弹性论坛上看到的,很多类似的问题都没有答案(。但我正在寻找一个具有生产意识的解决方案,也许有https://www.elastic.co/guide/en/elasticsearch/reference/current/node-tool.html工具?

使用elasticsearch-node实用程序,可以重置集群状态,然后新节点可以加入另一个集群。

棘手的是将这个实用程序bin与Docker一起使用,因为elasticsearch server必须停止!

kubernetes解决方案:

  1. 通过将sts:kubectl scale data-nodes --replicas=0缩放到0来停止pod
  2. 创建一个重置集群状态的k8s作业,附带数据量
  3. 为每个PVC应用作业
  4. 重新缩放sts并享受

job.yaml:

apiVersion: batch/v1
kind: Job
metadata:
name: test-fix-cluster-m[0-3]
spec:
template:
spec:
containers:
- args:
- -c
- yes | elasticsearch-node detach-cluster; yes | elasticsearch-node remove-customs '*'
# uncomment for at least 1 PVC
#- yes | elasticsearch-node unsafe-bootstrap -v
command:
- /bin/sh
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
name: elasticsearch
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: es-data
restartPolicy: Never
volumes:
- name: es-data
persistentVolumeClaim:
claimName: es-test-master-es-test-master-[0-3]

如果您感兴趣,这里是unsafe-bootstrap背后的代码:https://github.com/elastic/elasticsearch/blob/master/server/src/main/java/org/elasticsearch/cluster/coordination/UnsafeBootstrapMasterCommand.java#L83

我在上写了一个小故事https://medium.com/@thomasdecaux/fix-broken-elasticsearch-cluster-405ad67ee17c。

最新更新