被拒绝的请求
编辑被拒绝的请求
编辑当 Elasticsearch 拒绝请求时,它会停止操作并返回带有 429
响应代码的错误。被拒绝的请求通常由以下原因引起:
- 一个 耗尽的线程池。耗尽的
search
或write
线程池会返回一个TOO_MANY_REQUESTS
错误消息。 - 一个 断路器错误。
- 高于 索引压力的
indexing_pressure.memory.limit
。
检查被拒绝的任务
编辑要检查每个线程池被拒绝的任务数量,请使用 cat 线程池 API。特别是 search
和 write
线程池中,rejected
任务与 completed
任务的高比例意味着 Elasticsearch 经常拒绝请求。
resp = client.cat.thread_pool( v=True, h="id,name,queue,active,rejected,completed", ) print(resp)
const response = await client.cat.threadPool({ v: "true", h: "id,name,queue,active,rejected,completed", }); console.log(response);
GET /_cat/thread_pool?v=true&h=id,name,queue,active,rejected,completed
write
线程池拒绝通常在出错的 API 和相关日志中显示为 EsRejectedExecutionException
,并带有 QueueResizingEsThreadPoolExecutor
或 queue capacity
。
这些错误通常与 积压的任务有关。
检查断路器
编辑resp = client.nodes.stats( metric="breaker", ) print(resp)
const response = await client.nodes.stats({ metric: "breaker", }); console.log(response);
GET /_nodes/stats/breaker
这些统计数据是从节点启动开始累积的。有关更多信息,请参阅 断路器错误。
检查索引压力
编辑resp = client.nodes.stats( human=True, filter_path="nodes.*.indexing_pressure", ) print(resp)
const response = await client.nodes.stats({ human: "true", filter_path: "nodes.*.indexing_pressure", }); console.log(response);
GET _nodes/stats?human&filter_path=nodes.*.indexing_pressure
这些统计数据是从节点启动开始累积的。
索引压力拒绝显示为 EsRejectedExecutionException
,并表示它们因 coordinating_and_primary_bytes
、coordinating
、primary
或 replica
而被拒绝。
这些错误通常与 积压的任务、批量索引大小或摄取目标的 refresh_interval
设置有关。
防止被拒绝的请求
编辑修复高 CPU 和内存使用率
如果 Elasticsearch 经常拒绝请求和其他任务,则您的集群可能具有高 CPU 使用率或高 JVM 内存压力。有关提示,请参阅 CPU 使用率高 和 JVM 内存压力高。