我有一个网络负载均衡器和一个关联的目标组,它被配置为对EC2实例进行运行状况检查。问题是我看到了很多健康检查请求;每秒多次。
检查之间的default interval应该是30秒,但它们的频率比它们应该高出约100倍。
我的堆栈是在CloudFormation中构建的,我已经尝试覆盖HealthCheckIntervalSeconds
,这没有任何效果。有趣的是,当我尝试在控制台中手动更改间隔时,我发现这些值是灰色的:
以下是模板的相关部分,我尝试更改注释的区间:
NLB:
Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
Properties:
Type: network
Name: api-load-balancer
Scheme: internal
Subnets:
- Fn::ImportValue: PrivateSubnetA
- Fn::ImportValue: PrivateSubnetB
- Fn::ImportValue: PrivateSubnetC
NLBListener:
Type : AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref NLBTargetGroup
LoadBalancerArn: !Ref NLB
Port: 80
Protocol: TCP
NLBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
# HealthCheckIntervalSeconds: 30
HealthCheckPath: /healthcheck
HealthCheckProtocol: HTTP
# HealthyThresholdCount: 2
# UnhealthyThresholdCount: 5
# Matcher:
# HttpCode: 200-399
Name: api-nlb-http-target-group
Port: 80
Protocol: TCP
VpcId: !ImportValue PublicVPC
我的EC2实例位于私有子网中,无法访问外部世界。 NLB是内部的,因此如果不通过API网关,就无法访问它们。 API网关没有配置/healthcheck
端点,因此可以排除来自AWS网络外部的任何活动,例如手动ping端点的人员。
这是我从CloudWatch获取的应用程序日志的示例,而应用程序应该处于空闲状态:
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:33 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:34 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
07:45:35 {"label":"Received request URL","value":"/healthcheck","type":"trace"}
我每秒通常会收到3到6个请求,所以我想知道这是否就像网络负载均衡器的工作方式一样,而AWS仍然没有记录(或者我没有& #39; t发现它,或者我如何解决这个问题。
答案 0 :(得分:15)
更新:已在相关的aws forum post上回答了这一点,这证实了它对网络负载均衡器的正常行为,并引用了它们的分布式性质作为原因。无法配置自定义间隔。此时,文档仍然过时,另有说明。
这可能是NLB目标组中的错误,也可能是错误documentation的正常行为。我得出这个结论是因为:
在这种情况下,我认为可能是正常行为被错误地记录下来,但除非有人来自AWS,否则无法验证,并且几乎不可能获得在aws论坛上回答issue like this。
能够配置设置或者至少更新文档会很有用。
答案 1 :(得分:2)
AWS员工在这里。为了详细说明已接受的答案,您可能会看到大量健康检查请求的原因是NLB使用多个分布式健康检查器来评估目标健康。这些运行状况检查器将按您指定的时间间隔向目标发出请求,但是所有这些检查器都将在该时间间隔向目标发出请求,因此您将看到每个分布式探针发出的一个请求。然后根据成功探测到的探针数量来评估目标健康状况。
您可以在“ A Route 53健康检查”下阅读另一位AWS员工在此处写的非常详细的说明:https://medium.com/@adhorn/patterns-for-resilient-architecture-part-3-16e8601c488e
我对运行状况检查的建议是将运行状况检查代码编写得非常轻。许多人会犯错误,使他们的运行状况检查超负荷运行,同时还会执行诸如检查后端数据库或运行其他检查之类的操作。理想情况下,您的负载均衡器的运行状况检查除了返回“ OK”之类的短字符串外,什么也不做。在这种情况下,您的代码将需要不到一毫秒的时间来运行健康检查请求。如果您遵循这种模式,那么偶尔出现6-8次健康检查请求就不会使您的过程过载。
答案 2 :(得分:0)
在这方面晚了一点。但是对我有用的是让我的(C ++)服务启动一个专用于来自ELB的运行状况检查的线程。线程等待套接字连接,然后等待从套接字读取;或遇到错误。然后,它关闭套接字并返回以等待下一次运行状况检查ping。这比让ELB一直吸引我的流量端口便宜。它不仅使我的代码认为它受到了攻击,而且还浪费了所有物流以及为真正的客户提供服务所需的物流。
答案 3 :(得分:-1)
AWS负载平衡器上的运行状况检查间隔为每个区域 ,因此您必须将间隔除以total number of regions。对于网络负载均衡器,似乎间隔和区域集都无法更改。
您真正可以定义区域集的唯一地方是Route53运行状况检查,您可以在其中将区域集减少到最少三个。使用Terraform就像
resource "aws_route53_health_check" "http-check" {
fqdn = "my.domain.name"
port = 80
type = "HTTP"
resource_path = "/health"
failure_threshold = "5"
request_interval = "30"
regions = ["us-east-1", "eu-west-1", "ap-northeast-1"]
}