Eureka 1.1.4 版本 datacenter 的一个重要 bug

本贴最后更新于 3143 天前,其中的信息可能已经时异事殊

最近项目中在使用eureka作为服务发现框架,但是升级到1.1.4版本后,出现了启动eureka,服务每一分钟就上线下线一次的情况

github上已经向开发团队提交了bug:https://github.com/spring-cloud/spring-cloud-netflix/issues/1321

 

There seems to be a problem with public EIP address association not being correctly updated when a new AWS server starts and has a new Eureka server starting with it. When the server starts up, it correctly registers itself

 

2016-09-06 15:55:29.040 WARN 3399 --- [Thread-10] com.netflix.eureka.aws.EIPManager : The selected EIP 54.67.102.122 is associated with another instance i-0666b391 according to AWS, hence skipping this 2016-09-06 15:55:29.628 INFO 3399 --- [Thread-10] com.netflix.eureka.aws.EIPManager :

Associated i-25f11391 running in zone: us-west-1c to elastic IP: X.X.X.X

But, every minute after that we get the following log entry:

2016-09-06 16:24:55.568 INFO 3399 --- [Eureka-EIPBinder] c.n.e.r.PeerAwareInstanceRegistryImpl : Got 1 instances from neighboring DS node 2016-09-06 16:24:55.568 INFO 3399 --- [Eureka-EIPBinder] c.n.e.r.PeerAwareInstanceRegistryImpl : Renew threshold is: 1 2016-09-06 16:24:55.568 INFO 3399 --- [Eureka-EIPBinder] c.n.e.r.PeerAwareInstanceRegistryImpl : Priming AWS connections for all replicas.. 2016-09-06 16:24:55.568 INFO 3399 --- [Eureka-EIPBinder] c.n.e.r.PeerAwareInstanceRegistryImpl : No peers needed to prime. 2016-09-06 16:24:55.568 INFO 3399 --- [Eureka-EIPBinder] c.n.e.r.PeerAwareInstanceRegistryImpl : Changing status to UP 2016-09-06 16:24:55.713 WARN 3399 --- [Eureka-EIPBinder] com.netflix.eureka.aws.EIPManager : The selected EIP X.X.X.X is associated with another instance i-0666b391 according to AWS, hence skipping this 2016-09-06 16:24:55.804 INFO 3399 --- [Eureka-EIPBinder] com.netflix.eureka.aws.EIPManage

Debugging this, the call to isEIPBound() is always failing, and this is because the following is always null:

String myPublicIP = ((AmazonInfo) myInfo.getDataCenterInfo()).get(MetaDataKey.publicIpv4);

It looks like there is stale datacenterinfo and it never gets refreshed (from what I can tell) and there there are no settings available to have it refreshed automatically.

The odd side affect of this, and we noticed, is that the registry continually gets wiped, and reset causing obvious potential issues down stream for our clients.

有热心网友给出了临时解决方案:

@Configuration @Slf4j @ConditionalOnAwsCloudEnvironment @EnableContextInstanceData @Import(UtilAutoConfiguration.class) @AutoConfigureAfter(UtilAutoConfiguration.class) public class AwsInstanceConfig { <span class="pl-k">@Value</span>(<span class="pl-s"><span class="pl-pds">"</span>${server.port:${SERVER_PORT:${PORT:8080}}}<span class="pl-pds">"</span></span>) <span class="pl-k">int</span> nonSecurePort; <span class="pl-k">@Value</span>(<span class="pl-s"><span class="pl-pds">"</span>${management.port:${MANAGEMENT_PORT:${server.port:${SERVER_PORT:${PORT:8080}}}}}<span class="pl-pds">"</span></span>) <span class="pl-k">int</span> managementPort; <span class="pl-k">@Value</span>(<span class="pl-s"><span class="pl-pds">"</span>${eureka.instance.hostname:${EUREKA_INSTANCE_HOSTNAME:}}<span class="pl-pds">"</span></span>) <span class="pl-smi">String</span> hostname; <span class="pl-k">@Autowired</span> <span class="pl-smi">ConfigurableEnvironment</span> env; <span class="pl-k">@Bean</span> <span class="pl-k">public</span> <span class="pl-smi">EurekaInstanceConfigBean</span> <span class="pl-en">eurekaInstanceConfigBean</span>(<span class="pl-smi">InetUtils</span> <span class="pl-v">utils</span>) { log<span class="pl-k">.</span>info(<span class="pl-s"><span class="pl-pds">"</span>Setting AmazonInfo on EurekaInstanceConfigBean<span class="pl-pds">"</span></span>); <span class="pl-k">final</span> <span class="pl-smi">EurekaInstanceConfigBean</span> instance <span class="pl-k">=</span> <span class="pl-k">new</span> <span class="pl-smi">EurekaInstanceConfigBean</span>(utils) { <span class="pl-k">@Scheduled</span>(<span class="pl-c1">initialDelay</span> <span class="pl-k">=</span> <span class="pl-c1">30000L</span>, <span class="pl-c1">fixedRate</span> <span class="pl-k">=</span> <span class="pl-c1">30000L</span>) <span class="pl-k">public</span> <span class="pl-k">void</span> <span class="pl-en">refreshInfo</span>() { log<span class="pl-k">.</span>debug(<span class="pl-s"><span class="pl-pds">"</span>Checking datacenter info changes<span class="pl-pds">"</span></span>); <span class="pl-smi">AmazonInfo</span> newInfo <span class="pl-k">=</span> <span class="pl-smi">AmazonInfo</span><span class="pl-k">.</span><span class="pl-smi">Builder</span><span class="pl-k">.</span>newBuilder()<span class="pl-k">.</span>autoBuild(<span class="pl-s"><span class="pl-pds">"</span>eureka<span class="pl-pds">"</span></span>); <span class="pl-k">if</span> (<span class="pl-k">!</span><span class="pl-v">this</span><span class="pl-k">.</span>getDataCenterInfo()<span class="pl-k">.</span>equals(newInfo)) { log<span class="pl-k">.</span>info(<span class="pl-s"><span class="pl-pds">"</span>Updating datacenterInfo to {}<span class="pl-pds">"</span></span>, newInfo); ((<span class="pl-smi">AmazonInfo</span>) <span class="pl-v">this</span><span class="pl-k">.</span>getDataCenterInfo())<span class="pl-k">.</span>setMetadata(newInfo<span class="pl-k">.</span>getMetadata()); } } <span class="pl-k">private</span> <span class="pl-smi">AmazonInfo</span> <span class="pl-en">getAmazonInfo</span>() { <span class="pl-k">return</span> (<span class="pl-smi">AmazonInfo</span>) getDataCenterInfo(); } <span class="pl-k">@Override</span> <span class="pl-k">public</span> <span class="pl-smi">String</span> <span class="pl-en">getHostname</span>() { <span class="pl-smi">AmazonInfo</span> info <span class="pl-k">=</span> getAmazonInfo(); <span class="pl-k">final</span> <span class="pl-smi">String</span> publicHostname <span class="pl-k">=</span> info<span class="pl-k">.</span>get(<span class="pl-smi">AmazonInfo</span><span class="pl-k">.</span><span class="pl-smi">MetaDataKey</span><span class="pl-k">.</span>publicHostname); <span class="pl-k">return</span> <span class="pl-v">this</span><span class="pl-k">.</span>isPreferIpAddress() <span class="pl-k">?</span> info<span class="pl-k">.</span>get(<span class="pl-smi">AmazonInfo</span><span class="pl-k">.</span><span class="pl-smi">MetaDataKey</span><span class="pl-k">.</span>localIpv4) <span class="pl-k">:</span> publicHostname <span class="pl-k">==</span> <span class="pl-c1">null</span> <span class="pl-k">?</span> info<span class="pl-k">.</span>get(<span class="pl-smi">AmazonInfo</span><span class="pl-k">.</span><span class="pl-smi">MetaDataKey</span><span class="pl-k">.</span>localHostname) <span class="pl-k">:</span> publicHostname; } <span class="pl-k">@Override</span> <span class="pl-k">public</span> <span class="pl-smi">String</span> <span class="pl-en">getHostName</span>(<span class="pl-k">final</span> <span class="pl-k">boolean</span> <span class="pl-v">refresh</span>) { <span class="pl-k">return</span> getHostname(); } <span class="pl-k">@Override</span> <span class="pl-k">public</span> <span class="pl-smi">String</span> <span class="pl-en">getHomePageUrl</span>() { <span class="pl-k">return</span> <span class="pl-v">super</span><span class="pl-k">.</span>getHomePageUrl(); } <span class="pl-k">@Override</span> <span class="pl-k">public</span> <span class="pl-smi">String</span> <span class="pl-en">getStatusPageUrl</span>() { <span class="pl-smi">String</span> scheme <span class="pl-k">=</span> getSecurePortEnabled() <span class="pl-k">?</span> <span class="pl-s"><span class="pl-pds">"</span>https<span class="pl-pds">"</span></span> <span class="pl-k">:</span> <span class="pl-s"><span class="pl-pds">"</span>http<span class="pl-pds">"</span></span>; <span class="pl-k">return</span> scheme <span class="pl-k">+</span> <span class="pl-s"><span class="pl-pds">"</span>://<span class="pl-pds">"</span></span> <span class="pl-k">+</span> getHostname() <span class="pl-k">+</span> <span class="pl-s"><span class="pl-pds">"</span>:<span class="pl-pds">"</span></span> <span class="pl-k">+</span> managementPort <span class="pl-k">+</span> getStatusPageUrlPath(); } <span class="pl-k">@Override</span> <span class="pl-k">public</span> <span class="pl-smi">String</span> <span class="pl-en">getHealthCheckUrl</span>() { <span class="pl-smi">String</span> scheme <span class="pl-k">=</span> getSecurePortEnabled() <span class="pl-k">?</span> <span class="pl-s"><span class="pl-pds">"</span>https<span class="pl-pds">"</span></span> <span class="pl-k">:</span> <span class="pl-s"><span class="pl-pds">"</span>http<span class="pl-pds">"</span></span>; <span class="pl-k">return</span> scheme <span class="pl-k">+</span> <span class="pl-s"><span class="pl-pds">"</span>://<span class="pl-pds">"</span></span> <span class="pl-k">+</span> getHostname() <span class="pl-k">+</span> <span class="pl-s"><span class="pl-pds">"</span>:<span class="pl-pds">"</span></span> <span class="pl-k">+</span> managementPort <span class="pl-k">+</span> getHealthCheckUrlPath(); } }; <span class="pl-smi">AmazonInfo</span> info <span class="pl-k">=</span> <span class="pl-smi">AmazonInfo</span><span class="pl-k">.</span><span class="pl-smi">Builder</span><span class="pl-k">.</span>newBuilder()<span class="pl-k">.</span>autoBuild(<span class="pl-s"><span class="pl-pds">"</span>eureka<span class="pl-pds">"</span></span>); log<span class="pl-k">.</span>info(<span class="pl-s"><span class="pl-pds">"</span>Info: {}<span class="pl-pds">"</span></span>, info); instance<span class="pl-k">.</span>setDataCenterInfo(info); instance<span class="pl-k">.</span>setNonSecurePort(<span class="pl-v">this</span><span class="pl-k">.</span>nonSecurePort); instance<span class="pl-k">.</span>setInstanceId(getDefaultInstanceId(<span class="pl-v">this</span><span class="pl-k">.</span>env)); <span class="pl-k">if</span> (<span class="pl-v">this</span><span class="pl-k">.</span>managementPort <span class="pl-k">!=</span> <span class="pl-v">this</span><span class="pl-k">.</span>nonSecurePort <span class="pl-k">&amp;&amp;</span> <span class="pl-v">this</span><span class="pl-k">.</span>managementPort <span class="pl-k">!=</span> <span class="pl-c1">0</span>) { <span class="pl-k">if</span> (<span class="pl-smi">StringUtils</span><span class="pl-k">.</span>hasText(<span class="pl-v">this</span><span class="pl-k">.</span>hostname)) { instance<span class="pl-k">.</span>setHostname(<span class="pl-v">this</span><span class="pl-k">.</span>hostname); } } <span class="pl-k">return</span> instance; } ​

}

netfix的贡献者已经在修复这个bug,预计下一个版本能解决:https://github.com/Netflix/eureka/pull/843

  • AWS
    11 引用 • 28 回帖 • 11 关注
  • Eureka
    22 引用 • 3 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 408 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    22 引用 • 214 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 655 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • V2Ray
    1 引用 • 15 回帖 • 3 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 141 回帖
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 667 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 397 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 814 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 507 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    588 引用 • 3538 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 4 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 1 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 642 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 23 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注