×

Elasticsearch集群健康状态为红色

至少一个主分片及其副本未分配给节点。请使用以下步骤来排除此警报的故障。

本文档中的一些命令使用$ES_POD_NAME shell变量引用Elasticsearch pod。如果您想直接从此文档复制和粘贴命令,则必须将此变量设置为对您的Elasticsearch集群有效的数值。

您可以通过运行以下命令列出可用的Elasticsearch pod:

$ oc -n openshift-logging get pods -l component=elasticsearch

选择列出的pod之一,并通过运行以下命令设置$ES_POD_NAME变量:

$ export ES_POD_NAME=<elasticsearch_pod_name>

您现在可以在命令中使用$ES_POD_NAME变量。

步骤
  1. 通过运行以下命令检查Elasticsearch集群健康状况,并验证集群status是否为红色:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- health
  2. 通过运行以下命令列出已加入集群的节点:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cat/nodes?v
  3. 通过运行以下命令列出Elasticsearch pod,并将它们与上一步命令输出中的节点进行比较:

    $ oc -n openshift-logging get pods -l component=elasticsearch
  4. 如果某些Elasticsearch节点未加入集群,请执行以下步骤。

    1. 通过运行以下命令并观察输出,确认Elasticsearch是否已选举出主节点:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=_cat/master?v
    2. 通过运行以下命令并观察输出,查看已选主节点的pod日志中是否存在问题:

      $ oc logs <elasticsearch_master_pod_name> -c elasticsearch -n openshift-logging
    3. 通过运行以下命令并观察输出,查看未加入集群的节点的日志中是否存在问题:

      $ oc logs <elasticsearch_node_name> -c elasticsearch -n openshift-logging
  5. 如果所有节点都已加入集群,请运行以下命令并观察输出,检查集群是否正在恢复过程中:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cat/recovery?active_only=true

    如果没有命令输出,则恢复过程可能因待处理任务而延迟或停滞。

  6. 通过运行以下命令并观察输出,检查是否存在待处理任务:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- health | grep number_of_pending_tasks
  7. 如果存在待处理任务,请监控其状态。如果其状态发生更改并表明集群正在恢复,请继续等待。恢复时间根据集群大小和其他因素而有所不同。否则,如果待处理任务的状态未改变,则表明恢复已停滞。

  8. 如果恢复似乎已停滞,请通过运行以下命令并观察输出,检查cluster.routing.allocation.enable值是否设置为none

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cluster/settings?pretty
  9. 如果cluster.routing.allocation.enable值设置为none,请将其设置为all,方法是运行以下命令:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cluster/settings?pretty \
      -X PUT -d '{"persistent": {"cluster.routing.allocation.enable":"all"}}'
  10. 通过运行以下命令并观察输出,检查是否存在任何索引仍然为红色:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cat/indices?v
  11. 如果任何索引仍然为红色,请尝试清除它们,方法是执行以下步骤。

    1. 通过运行以下命令清除缓存:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name>/_cache/clear?pretty
    2. 通过运行以下命令增加最大分配重试次数:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name>/_settings?pretty \
        -X PUT -d '{"index.allocation.max_retries":10}'
    3. 通过运行以下命令删除所有滚动项:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=_search/scroll/_all -X DELETE
    4. 通过运行以下命令增加超时时间:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name>/_settings?pretty \
        -X PUT -d '{"index.unassigned.node_left.delayed_timeout":"10m"}'
  12. 如果上述步骤无法清除红色索引,请分别删除这些索引。

    1. 通过运行以下命令识别红色索引名称:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=_cat/indices?v
    2. 通过运行以下命令删除红色索引:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_red_index_name> -X DELETE
  13. 如果没有红色索引且集群状态为红色,请检查数据节点上是否存在持续的繁重处理负载。

    1. 通过运行以下命令检查Elasticsearch JVM堆使用率是否很高:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=_nodes/stats?pretty

      在命令输出中,查看node_name.jvm.mem.heap_used_percent字段以确定JVM堆使用率。

    2. 检查CPU利用率是否很高。有关CPU利用率的更多信息,请参阅Red Hat OpenShift Service on AWS的“查看监控仪表板”文档。

Elasticsearch集群健康状态为黄色

至少一个主分片的副本分片未分配给节点。通过调整ClusterLogging自定义资源(CR)中的nodeCount值来增加节点数量。

Elasticsearch节点磁盘已达到低水位线

Elasticsearch不会将分片分配到达到低水位线的节点。

本文档中的一些命令使用$ES_POD_NAME shell变量引用Elasticsearch pod。如果您想直接从此文档复制和粘贴命令,则必须将此变量设置为对您的Elasticsearch集群有效的数值。

您可以通过运行以下命令列出可用的Elasticsearch pod:

$ oc -n openshift-logging get pods -l component=elasticsearch

选择列出的pod之一,并通过运行以下命令设置$ES_POD_NAME变量:

$ export ES_POD_NAME=<elasticsearch_pod_name>

您现在可以在命令中使用$ES_POD_NAME变量。

步骤
  1. 通过运行以下命令识别部署Elasticsearch的节点:

    $ oc -n openshift-logging get po -o wide
  2. 通过运行以下命令检查是否存在未分配的分片:

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cluster/health?pretty | grep unassigned_shards
  3. 如果存在未分配的分片,请通过运行以下命令检查每个节点上的磁盘空间:

    $ for pod in `oc -n openshift-logging get po -l component=elasticsearch -o jsonpath='{.items[*].metadata.name}'`; \
      do echo $pod; oc -n openshift-logging exec -c elasticsearch $pod \
      -- df -h /elasticsearch/persistent; done
  4. 在命令输出中,检查“Use”列以确定该节点上使用的磁盘百分比。

    示例输出
    elasticsearch-cdm-kcrsda6l-1-586cc95d4f-h8zq8
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme1n1     19G  522M   19G   3% /elasticsearch/persistent
    elasticsearch-cdm-kcrsda6l-2-5b548fc7b-cwwk7
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     19G  522M   19G   3% /elasticsearch/persistent
    elasticsearch-cdm-kcrsda6l-3-5dfc884d99-59tjw
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme3n1     19G  528M   19G   3% /elasticsearch/persistent

    如果使用的磁盘百分比高于85%,则节点已超过低水位线,并且无法再将分片分配到此节点。

  5. 要检查当前的redundancyPolicy,请运行以下命令:

    $ oc -n openshift-logging get es elasticsearch \
      -o jsonpath='{.spec.redundancyPolicy}'

    如果在集群上使用ClusterLogging资源,请运行以下命令:

    $ oc -n openshift-logging get cl \
      -o jsonpath='{.items[*].spec.logStore.elasticsearch.redundancyPolicy}'

    如果集群redundancyPolicy值高于SingleRedundancy值,请将其设置为SingleRedundancy值并保存此更改。

  6. 如果上述步骤无法解决问题,请删除旧索引。

    1. 通过运行以下命令检查Elasticsearch上所有索引的状态:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
    2. 识别可以删除的旧索引。

    3. 通过运行以下命令删除索引:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name> -X DELETE

Elasticsearch节点磁盘已达到高水位线

Elasticsearch 尝试将分片从达到高水位线的节点迁移到磁盘使用率低的且未超过任何水位线阈值的节点。

要将分片分配到特定节点,必须释放该节点上的部分空间。如果无法增加磁盘空间,请尝试向集群添加新的数据节点,或降低集群总冗余策略。

本文档中的一些命令使用$ES_POD_NAME shell变量引用Elasticsearch pod。如果您想直接从此文档复制和粘贴命令,则必须将此变量设置为对您的Elasticsearch集群有效的数值。

您可以通过运行以下命令列出可用的Elasticsearch pod:

$ oc -n openshift-logging get pods -l component=elasticsearch

选择列出的pod之一,并通过运行以下命令设置$ES_POD_NAME变量:

$ export ES_POD_NAME=<elasticsearch_pod_name>

您现在可以在命令中使用$ES_POD_NAME变量。

步骤
  1. 通过运行以下命令识别部署Elasticsearch的节点:

    $ oc -n openshift-logging get po -o wide
  2. 检查每个节点的磁盘空间

    $ for pod in `oc -n openshift-logging get po -l component=elasticsearch -o jsonpath='{.items[*].metadata.name}'`; \
      do echo $pod; oc -n openshift-logging exec -c elasticsearch $pod \
      -- df -h /elasticsearch/persistent; done
  3. 检查集群是否正在重新平衡

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_cluster/health?pretty | grep relocating_shards

    如果命令输出显示正在迁移分片,则表示已超过高水位线。高水位线的默认值为 90%。

  4. 增加所有节点的磁盘空间。如果无法增加磁盘空间,请尝试向集群添加新的数据节点,或降低集群总冗余策略。

  5. 要检查当前的redundancyPolicy,请运行以下命令:

    $ oc -n openshift-logging get es elasticsearch \
      -o jsonpath='{.spec.redundancyPolicy}'

    如果在集群上使用ClusterLogging资源,请运行以下命令:

    $ oc -n openshift-logging get cl \
      -o jsonpath='{.items[*].spec.logStore.elasticsearch.redundancyPolicy}'

    如果集群redundancyPolicy值高于SingleRedundancy值,请将其设置为SingleRedundancy值并保存此更改。

  6. 如果上述步骤无法解决问题,请删除旧索引。

    1. 通过运行以下命令检查Elasticsearch上所有索引的状态:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
    2. 识别可以删除的旧索引。

    3. 通过运行以下命令删除索引:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name> -X DELETE

Elasticsearch 节点磁盘洪水水位线已达到

Elasticsearch 对每个同时满足以下两个条件的索引强制执行只读索引块

  • 一个或多个分片已分配到该节点。

  • 一个或多个磁盘超过了洪水阶段

使用以下步骤来排查此警报。

本文档中的一些命令使用$ES_POD_NAME shell变量引用Elasticsearch pod。如果您想直接从此文档复制和粘贴命令,则必须将此变量设置为对您的Elasticsearch集群有效的数值。

您可以通过运行以下命令列出可用的Elasticsearch pod:

$ oc -n openshift-logging get pods -l component=elasticsearch

选择列出的pod之一,并通过运行以下命令设置$ES_POD_NAME变量:

$ export ES_POD_NAME=<elasticsearch_pod_name>

您现在可以在命令中使用$ES_POD_NAME变量。

步骤
  1. 获取 Elasticsearch 节点的磁盘空间

    $ for pod in `oc -n openshift-logging get po -l component=elasticsearch -o jsonpath='{.items[*].metadata.name}'`; \
      do echo $pod; oc -n openshift-logging exec -c elasticsearch $pod \
      -- df -h /elasticsearch/persistent; done
  2. 在命令输出中,检查Avail列以确定该节点上的可用磁盘空间。

    示例输出
    elasticsearch-cdm-kcrsda6l-1-586cc95d4f-h8zq8
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme1n1     19G  522M   19G   3% /elasticsearch/persistent
    elasticsearch-cdm-kcrsda6l-2-5b548fc7b-cwwk7
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     19G  522M   19G   3% /elasticsearch/persistent
    elasticsearch-cdm-kcrsda6l-3-5dfc884d99-59tjw
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme3n1     19G  528M   19G   3% /elasticsearch/persistent
  3. 增加所有节点的磁盘空间。如果无法增加磁盘空间,请尝试向集群添加新的数据节点,或降低集群总冗余策略。

  4. 要检查当前的redundancyPolicy,请运行以下命令:

    $ oc -n openshift-logging get es elasticsearch \
      -o jsonpath='{.spec.redundancyPolicy}'

    如果在集群上使用ClusterLogging资源,请运行以下命令:

    $ oc -n openshift-logging get cl \
      -o jsonpath='{.items[*].spec.logStore.elasticsearch.redundancyPolicy}'

    如果集群redundancyPolicy值高于SingleRedundancy值,请将其设置为SingleRedundancy值并保存此更改。

  5. 如果上述步骤无法解决问题,请删除旧索引。

    1. 通过运行以下命令检查Elasticsearch上所有索引的状态:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
    2. 识别可以删除的旧索引。

    3. 通过运行以下命令删除索引:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name> -X DELETE
  6. 继续释放并监控磁盘空间。在已用磁盘空间降至 90% 以下后,通过运行以下命令来取消阻止对此节点的写入

    $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
      -- es_util --query=_all/_settings?pretty \
      -X PUT -d '{"index.blocks.read_only_allow_delete": null}'

Elasticsearch JVM 堆使用率过高

Elasticsearch 节点 Java 虚拟机 (JVM) 堆内存使用率超过 75%。请考虑增加堆大小

聚合日志系统 CPU 使用率过高

节点上的系统 CPU 使用率过高。检查集群节点的 CPU。考虑为节点分配更多 CPU 资源。

Elasticsearch 进程 CPU 使用率过高

节点上的 Elasticsearch 进程 CPU 使用率过高。检查集群节点的 CPU。考虑为节点分配更多 CPU 资源。

Elasticsearch 磁盘空间不足

根据当前磁盘使用情况,预测 Elasticsearch 将在接下来的 6 小时内耗尽磁盘空间。使用以下步骤来排查此警报。

步骤
  1. 获取 Elasticsearch 节点的磁盘空间

    $ for pod in `oc -n openshift-logging get po -l component=elasticsearch -o jsonpath='{.items[*].metadata.name}'`; \
      do echo $pod; oc -n openshift-logging exec -c elasticsearch $pod \
      -- df -h /elasticsearch/persistent; done
  2. 在命令输出中,检查Avail列以确定该节点上的可用磁盘空间。

    示例输出
    elasticsearch-cdm-kcrsda6l-1-586cc95d4f-h8zq8
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme1n1     19G  522M   19G   3% /elasticsearch/persistent
    elasticsearch-cdm-kcrsda6l-2-5b548fc7b-cwwk7
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme2n1     19G  522M   19G   3% /elasticsearch/persistent
    elasticsearch-cdm-kcrsda6l-3-5dfc884d99-59tjw
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/nvme3n1     19G  528M   19G   3% /elasticsearch/persistent
  3. 增加所有节点的磁盘空间。如果无法增加磁盘空间,请尝试向集群添加新的数据节点,或降低集群总冗余策略。

  4. 要检查当前的redundancyPolicy,请运行以下命令:

    $ oc -n openshift-logging get es elasticsearch -o jsonpath='{.spec.redundancyPolicy}'

    如果在集群上使用ClusterLogging资源,请运行以下命令:

    $ oc -n openshift-logging get cl \
      -o jsonpath='{.items[*].spec.logStore.elasticsearch.redundancyPolicy}'

    如果集群redundancyPolicy值高于SingleRedundancy值,请将其设置为SingleRedundancy值并保存此更改。

  5. 如果上述步骤无法解决问题,请删除旧索引。

    1. 通过运行以下命令检查Elasticsearch上所有索引的状态:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
    2. 识别可以删除的旧索引。

    3. 通过运行以下命令删除索引:

      $ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \
        -- es_util --query=<elasticsearch_index_name> -X DELETE

Elasticsearch 文件描述符使用率过高

根据当前使用趋势,节点上预测的文件描述符数量不足。检查每个节点的max_file_descriptors值,如 Elasticsearch 文件描述符文档中所述。