我想解决在查询我的 Amazon OpenSearch Service 域时,遇到的 HTTP 503 服务不可用错误。
简述
Amazon OpenSearch Service 域使用负载均衡器将传入流量分配到数据节点。资源耗尽可能导致数据节点无响应。示例包括 CPU 使用率高、Java 虚拟机 (JVM) 内存压力大、查询负载过大或索引压力大。当节点无响应时,负载均衡器无法将请求路由到该节点。然后,负载均衡器会返回 HTTP 503 服务不可用状态代码。
注意: 蓝绿部署活动(例如配置更改、软件更新或扩展操作)也可能导致出现 503 状态码。要解决此问题,请等待部署完成以及集群返回到 Active(活动)状态。
解决方法
诊断根本原因
检查集群运行状况
运行以下命令:
GET _cluster/health
如果集群状态为红色,则表示该集群有未分配的主分片,并且数据不可用。如果状态为黄色,则表示该集群有未分配的副本分片。
检查节点级指标
运行以下命令:
GET _cat/nodes?v&h=name,cpu,heap.percent,load_1m,node.role
检查 CPU 使用率大于 80% 或 heap.percent 大于 75% 的节点的输出。
检查 CloudWatch 指标
要确定问题来源,请使用 Amazon CloudWatch 监控以下指标:
- 5xx: 检查该域返回的 5xx HTTP 状态码的总数。
- CPUUtilization: 持续值大于 80% 表示集群处于重负载下。
- JVMMemoryPressure: 值大于 75% 时会启动频繁的垃圾回收。值大于 92% 时会启动写入阻塞。
- ThreadpoolSearchRejected: 只要增加便表示集群丢弃了搜索请求。
- ThreadpoolWriteRejected: 只要增加便表示集群丢弃了写入请求。
- IndexingRate: 写入流量的突然激增可能导致 JVM 和 CPU 资源的高度争用。
- SearchRate: 搜索流量的突然激增可能导致 JVM 和 CPU 资源的高度争用。
检查域状态
完成以下步骤:
- 打开 OpenSearch Service 控制台。
- 在导航窗格中,选择 Domains(域)。
- 选择您的域。
- 在 Domain processing status(域处理状态)中,检查域的当前状态。
注意: 如果蓝绿部署处于活动状态,则等待其完成。
检查并发快照操作
OpenSearch 不支持在同一个存储库中执行并发快照操作。一次只能为每个存储库运行一个快照操作,例如创建或删除。如果您尝试运行重叠的快照,则会收到一条带有 503 状态码的“ConcurrentSnapshotExecutionException”错误消息。
错误示例:
{
"error": {
"root_cause": [
{
"type": "concurrent_snapshot_execution_exception",
"reason": "[repository-name:xxxxxxxxxx/xxxxxx] cannot restore a snapshot while a snapshot deletion(s) is in-progress [repository-name:xxxxxxxxxx/xxxxxx]"
}
],
"type": "concurrent_snapshot_execution_exception",
"status": 503
}
}
要解决此问题,请等待当前快照完成。如果自动快照长时间卡在 IN_PROGRESS 状态,请联系 AWS Support 手动删除卡住的快照。
预调配更多计算资源
要解决资源耗尽问题,请执行以下操作:
重要信息: 在集群中至少运行 3 个节点,以便在节点故障期间仍保持可用。单节点或双节点集群没有冗余。如果一个节点出现故障,则其余节点必须处理所有流量,这会导致 503 错误。三个节点可确保集群形成法定人数。这可让集群选择专用的主控节点,而不会出现脑裂的风险。
降低 JVM 内存压力
高于 75% 的 JVM 内存压力会导致垃圾回收长时间暂停,从而消耗 CPU 周期,并可能使节点失去响应。要降低 JVM 内存压力,请执行以下操作:
减少查询资源的使用
要减少查询资源的使用,请执行以下操作:
注意: 数据节点的虚拟 CPU 数量决定 OpenSearch Service 中的线程池容量。您不能直接修改线程池容量。
降低索引压力
如果过度索引导致 503 错误,则执行以下操作:
- 减少批量索引请求的大小。使用较小的批量,避免节点资源过多。
- 增加刷新间隔。在大量索引期间将 index.refresh_interval 设置为 60 秒或更长,以减少 I/O 和 CPU 开销。
- 在批量摄取期间临时将副本设置为零。要降低索引负载,请在批量操作完成后恢复副本。
注意: 如果将副本设置为零,则会降低该时段内的数据耐久性。如果副本设置为零时节点出现故障,则会发生数据丢失。仅对可以从源重新摄取的数据使用此方法。
- 监控索引背压。查看 ThreadpoolWriteQueue 和 ThreadpoolWriteRejected 指标,以确定集群何时面临索引压力。
相关信息
Operational best practices for Amazon OpenSearch Service(Amazon OpenSearch Service 的操作最佳实践)
Troubleshooting Amazon OpenSearch Service(对 Amazon OpenSearch Service 进行故障排除)
Best practices for configuring your Amazon OpenSearch Service domain(配置 Amazon OpenSearch Service 域的最佳实践)