我部署了一个带有官方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解决方案:
- 通过将sts:
kubectl scale data-nodes --replicas=0
缩放到0来停止pod - 创建一个重置集群状态的k8s作业,附带数据量
- 为每个PVC应用作业
- 重新缩放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。