我使用官方 Helm 图表 ( https://github.com/elastic/helm-charts/tree/master/elasticsearch ) 部署了一个 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 服务器
必须停止!
使用 kubernetes 的解决方案:
- 通过将 sts 缩放到 0 来停止 pod:
kubectl scale data-nodes --replicas=0
- 创建一个重置集群状态的 k8s 作业,附加数据卷
- 为每个 PVC 应用作业
- 调整 sts 并享受!
工作文件:
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写了一个小故事.
关于elasticsearch - 在 kubernetes 中修复 elasticsearch 损坏的集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65519235/