elasticsearch - 在 kubernetes 中修复 elasticsearch 损坏的集群

标签 elasticsearch kubernetes-helm

我使用官方 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 的解决方案:

  1. 通过将 sts 缩放到 0 来停止 pod:kubectl scale data-nodes --replicas=0
  2. 创建一个重置集群状态的 k8s 作业,附加数据卷
  3. 为每个 PVC 应用作业
  4. 调整 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/

相关文章:

elasticsearch - 如何获取ElasticSearch输出?

elasticsearch - Elasticsearch inner_hits查询结果导致ArrayOutOfBoundsException

elasticsearch - Elasticsearch 多个字段

fluentd - helm 安装孵化器/Fluentd-cloudwatch 失败,错误为 : failed to download

redis - 升级图表时 Helm 相关性更新

docker - 由于权限问题,Fluentd 无法访问/var/lib/docker/containers 下的日志

kubernetes-helm - 如何在 Helm 安装中通过 `prometheus.io/scrape`参数传递 `--set`值

json - Elasticsearch简单索引并使用Java API搜索JSON

elasticsearch - 关于 Elasticsearch 内存使用

yaml - 如何使用索引引用 helm 数组参数