3.3. 日志记录警报故障排除
您可以使用以下步骤排除集群中的日志记录警报。
3.3.1. 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
变量。
流程
运行以下命令,检查 Elasticsearch 集群健康状况并验证集群
状态
是否为红色:$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- health
运行以下命令,列出已加入集群的节点:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cat/nodes?v
运行以下命令,列出 Elasticsearch Pod,并将它们与上一步中的命令输出中的节点进行比较:
$ oc -n openshift-logging get pods -l component=elasticsearch
如果某些 Elasticsearch 节点没有加入集群,请执行以下步骤。
运行以下命令并查看输出,确认 Elasticsearch 已选定 master 节点:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cat/master?v
运行以下命令,并查看所选 master 节点的 pod 日志问题:
$ oc logs <elasticsearch_master_pod_name> -c elasticsearch -n openshift-logging
运行以下命令并查看没有加入集群的节点日志:
$ oc logs <elasticsearch_node_name> -c elasticsearch -n openshift-logging
如果所有节点都已加入集群,请运行以下命令检查集群是否处于恢复过程中,并观察输出:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cat/recovery?active_only=true
如果没有命令输出,恢复过程可能会因为待处理的任务而延迟或停止。
运行以下命令并查看输出,检查是否有待处理的任务:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- health | grep number_of_pending_tasks
- 如果有待处理的任务,请监控其状态。如果它们的状态发生变化,并且表示集群正在恢复,请继续等待。恢复时间因集群大小和其它因素而异。否则,如果待处理任务的状态没有改变,这表示恢复已停止。
如果恢复似乎已停止,请运行以下命令检查
cluster.routing.allocation.enable
值设置为none
,然后观察输出:$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cluster/settings?pretty
如果
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"}}'
运行以下命令并查看输出,检查任何索引仍然是红色的:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cat/indices?v
如果有任何索引仍然是红色的,请尝试通过执行以下步骤清除它们。
运行以下命令来清除缓存:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=<elasticsearch_index_name>/_cache/clear?pretty
运行以下命令来增加最大分配重试次数:
$ 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}'
运行以下命令来删除所有滚动项:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_search/scroll/_all -X DELETE
运行以下命令来增加超时:
$ 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"}'
如果前面的步骤没有清除红色索引,请单独删除索引。
运行以下命令来识别红色索引名称:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cat/indices?v
运行以下命令来删除红色索引:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=<elasticsearch_red_index_name> -X DELETE
如果没有红色索引且集群状态为红色,请在数据节点上检查是否有连续重量处理负载。
运行以下命令,检查 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 Heap 使用量。- 检查高 CPU 使用率。有关 CPU utilitzation 的更多信息,请参阅 OpenShift Dedicated "查看监控仪表板" 文档。
其他资源
3.3.2. Elasticsearch 集群健康状态黄色
至少一个主分片的副本分片没有分配给节点。通过调整 ClusterLogging
自定义资源 (CR) 中的 nodeCount
值来增加节点数。
其他资源
3.3.3. 已达到 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
变量。
流程
运行以下命令,识别在其上部署 Elasticsearch 的节点:
$ oc -n openshift-logging get po -o wide
运行以下命令,检查是否有未分配的分片:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cluster/health?pretty | grep unassigned_shards
如果存在未分配的分片,请运行以下命令检查每个节点上的磁盘空间:
$ 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
在命令输出中,检查
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%,则节点已超过低水位线,并且分片无法再分配给此节点。
要检查当前的
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
值并保存这个更改。如果前面的步骤没有解决这个问题,请删除旧的索引。
运行以下命令,检查 Elasticsearch 上所有索引的状态:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
- 确定可以删除的旧索引。
运行以下命令来删除索引:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=<elasticsearch_index_name> -X DELETE
3.3.4. 已达到 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
变量。
流程
运行以下命令,识别在其上部署 Elasticsearch 的节点:
$ oc -n openshift-logging get po -o wide
检查每个节点上的磁盘空间:
$ 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
检查集群是否重新平衡:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=_cluster/health?pretty | grep relocating_shards
如果命令输出显示重新定位分片,则代表超过了高水位线。高水位线的默认值为 90%。
- 增加所有节点上的磁盘空间。如果无法增加磁盘空间,请尝试向集群添加新数据节点,或者减少集群冗余策略总数。
要检查当前的
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
值并保存这个更改。如果前面的步骤没有解决这个问题,请删除旧的索引。
运行以下命令,检查 Elasticsearch 上所有索引的状态:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
- 确定可以删除的旧索引。
运行以下命令来删除索引:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=<elasticsearch_index_name> -X DELETE
3.3.5. 已达到 Elasticsearch 节点磁盘水位线
Elasticsearch 在每个具有这两个条件的索引中强制使用只读索引块:
- 为节点分配一个或多个分片。
- 一个个或多个磁盘超过 flood stage。
使用以下步骤对此警报进行故障排除。
本文档中的一些命令会使用 $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
变量。
流程
获取 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
在命令输出中,检查
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
- 增加所有节点上的磁盘空间。如果无法增加磁盘空间,请尝试向集群添加新数据节点,或者减少集群冗余策略总数。
要检查当前的
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
值并保存这个更改。如果前面的步骤没有解决这个问题,请删除旧的索引。
运行以下命令,检查 Elasticsearch 上所有索引的状态:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
- 确定可以删除的旧索引。
运行以下命令来删除索引:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=<elasticsearch_index_name> -X DELETE
继续释放和监控磁盘空间。在使用的磁盘空间低于 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}'
3.3.6. Elasticsearch JVM 堆使用率很高
使用的 Elasticsearch 节点 Java 虚拟机(JVM)堆内存超过 75%。考虑增大堆大小。
3.3.7. 聚合日志记录系统 CPU 为高
节点上的系统 CPU 使用率高。检查集群节点的 CPU。考虑向节点分配更多 CPU 资源。
3.3.8. Elasticsearch 进程 CPU 为高
节点上的 Elasticsearch 进程 CPU 使用率很高。检查集群节点的 CPU。考虑向节点分配更多 CPU 资源。
3.3.9. Elasticsearch 磁盘空间运行较低
根据当前的磁盘用量,Elasticsearch 被预测在下一个 6 小时内耗尽磁盘空间。使用以下步骤对此警报进行故障排除。
流程
获取 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
在命令输出中,检查
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
- 增加所有节点上的磁盘空间。如果无法增加磁盘空间,请尝试向集群添加新数据节点,或者减少集群冗余策略总数。
要检查当前的
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
值并保存这个更改。如果前面的步骤没有解决这个问题,请删除旧的索引。
运行以下命令,检查 Elasticsearch 上所有索引的状态:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME -- indices
- 确定可以删除的旧索引。
运行以下命令来删除索引:
$ oc exec -n openshift-logging -c elasticsearch $ES_POD_NAME \ -- es_util --query=<elasticsearch_index_name> -X DELETE
其他资源
3.3.10. Elasticsearch FileDescriptor 使用是高
根据当前的使用趋势,预计节点上的文件描述符数量不足。检查每个节点的 max_file_descriptors
值,如 Elasticsearch File Descriptors 文档中所述。