Eureka Server 内存,更新阈值为 0,自我保存问题 - AWS

Posted

技术标签:

【中文标题】Eureka Server 内存,更新阈值为 0,自我保存问题 - AWS【英文标题】:Eureka Server memory, renew threshold is 0, self preservation issue - AWS 【发布时间】:2021-05-17 19:49:00 【问题描述】:

我部署了 2 个 Eureka 服务器实例和总共 12 个实例微服务。 .

Renews (last min) 符合预期 24。但 Renew Threshold 始终为 0。这是开启自我保护时应该是这样吗? 也看到此错误 - THE SELF PRESERVATION MODE已关闭。如果出现网络/其他问题,这可能无法保护实例过期。 在这种情况下的预期行为是什么?如果出现问题如何解决?

如上所述,我部署了 2 个 Eureka Server 实例,但在运行了大约 19-20 小时后,一个 Eureka Server 实例总是出现故障。为什么会发生这种情况?我检查了使用 top 命令运行的进程,发现 Eureka Server 占用了大量内存。 需要在 Eureka Server 上进行哪些配置才能不占用大量内存?

下面是Eureka Server的application.properties文件中的配置:

spring.application.name=eureka-server
eureka.instance.appname=eureka-server
eureka.instance.instance-id=$spring.application.name:$spring.application.instance_id:$random.int[1,999999]
eureka.server.enable-self-preservation=false
eureka.datacenter=AWS
eureka.environment=STAGE

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

下面是我用来启动 Eureka Server 实例的命令。

#!/bin/bash
java -Xms128m -Xmx256m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -Dspring.profiles.active=stage -Dserver.port=9011 -Deureka.instance.prefer-ip-address=true -Deureka.instance.hostname=example.co.za -Deureka.client.serviceUrl.defaultZone=http://example.co.za:9012/eureka/ -jar eureka-server-1.0.jar &
java -Xms128m -Xmx256m -Xss256k -XX:+HeapDumpOnOutOfMemoryError -Dspring.profiles.active=stage -Dserver.port=9012 -Deureka.instance.prefer-ip-address=true -Deureka.instance.hostname=example.co.za -Deureka.client.serviceUrl.defaultZone=http://example.co.za:9011/eureka/ -jar eureka-server-1.0.jar &

这种创建多个 Eureka Server 实例的方法是否正确?

部署在 AWS 上。 Eureka Server on AWS 是否需要任何特定配置?

Spring Boot 版本:2.3.4.RELEASE

我对所有这些都是新手,任何帮助或指导都会有很大帮助。

【问题讨论】:

【参考方案1】:

让我试着一一回答你的问题。

Renews (last min) 符合预期 24。但 Renew Threshold 始终为 0。这是开启自我保护时应有的样子吗? 在这种情况下,预期的行为是什么?如果这是一个问题,如何解决?

我可以在您的配置中看到eureka.server.enable-self-preservation=false,如果您想在无法续订租约时立即删除已注册的应用程序,则确实需要这样做。

自我保护功能是为了防止上述情况,因为如果有一些网络打嗝可能会发生。假设您有两个服务 A 和 B,它们都注册到了 eureka,但由于临时网络故障,B 突然无法更新其租约。如果自我保护不存在,则 B 将从注册表中删除,尽管 B 可用,但 A 将无法访问 B。 所以我们可以说self-preservation是eureka的一个弹性特性。

Renews threshold是每分钟的预期renews,如果最后一分钟的实际心跳数(Renews)小于预期的每分钟renews数(Renew),Eureka服务器进入自我保存模式阈值)和 当然,您可以控制 Renews 阈值。可以配置renewal-percent-threshold(默认为0.85)

所以在你的情况下,

应用程序实例总数 = 12

你没有eureka.instance.leaseRenewalIntervalInSeconds所以默认值30seureka.client.registerWithEureka=false

所以续订(最后一分钟)将是 24

你没有配置renewal-percent-threshold,所以默认值是0.85 每个应用程序实例每分钟的续订次数 = 2(每个 30 秒)

所以在启用自我保护的情况下,更新阈值将计算为 2 * 12 * 0.85 = 21(四舍五入)

在您的情况下,自我保护已关闭,因此 Eureka 不会计算 Renews Threshold

Eureka Server 的一个实例总是宕机。为什么会发生这种情况?

我暂时无法回答这个问题,这可能是由于多种原因。 您可以主要从日志中找到原因,或者如果您可以在此处发布日志,那就太好了。

需要在 Eureka Server 上进行哪些配置才能不占用大量内存?

根据您提供的信息,我无法说出您的内存问题,除此之外您已经指定了 -Xmx256m 并且到目前为止我没有遇到任何与 eureka 服务器有关的内存问题。

但我可以说 top 不是检查 java 进程消耗的内存的正确工具。当 JVM 启动时,它会从操作系统中占用一些内存。 这是您在 ps 和 top 等工具中看到的内存量。所以最好使用 jstat 或 jvmtop

这种创建多个 Eureka Server 实例的方法是否正确?

看来您的两个实例具有相同的主机名(eureka.instance.hostname)。如果您使用相同的主机名,复制将不起作用。 并确保您在两个实例中具有相同的应用程序名称。

部署在 AWS 上。 AWS 上的 Eureka Server 是否需要任何特定配置?

据我所知,除了确保实例可以相互通信之外,没有什么专门针对 AWS 的。

【讨论】:

非常感谢您的精彩解释。它帮助很大。 @NiteshApte 很高兴听到这个消息。这是一个可以接受的答案吗? 当然。只有一个问题。如果我关闭了 2 个实例中的一个实例,那么请求仍然转到关闭的那个。可能是什么原因?我该如何解决? @NiteshApte 我认为您的客户端仅使用一个服务器 URL 对吗?,在这种情况下,您应该使用 eureka.client.serviceUrl.defaultZone 指定所有 eureka 服务器 URL 嗨。 2 个 Eureka 服务器正在运行,并且在所有微服务中,我已将 eureka.client.serviceUrl.defaultZone 指向两个服务器。

以上是关于Eureka Server 内存,更新阈值为 0,自我保存问题 - AWS的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Eureka Server自我保存和续订门槛

Eureka 中的“续订”和“续订阈值”是啥意思

Eureka 注册中心

Spring Cloud配置Eureka 服务器

尤里卡的自我保护模式永远不会恢复

如何限制Linux内存的使用