开发者社区 > 云原生 > 正文

有遇到nacos滚动重启时候,服务实例大量下线的吗?

有遇到nacos滚动重启时候,服务实例大量下线的吗?

展开
收起
cuicuicuic 2024-01-10 11:47:43 60 0
3 条回答
写回答
取消 提交回答
  • 在Nacos进行滚动重启时,服务实例大量下线的情况确实是可能发生的一个问题。这种情况可能源于以下几个方面:

    1. 心跳机制:Nacos服务端通过心跳检测来判断客户端(服务实例)是否存活。在滚动重启期间,如果服务实例重启的速度超过了心跳保持有效的时间间隔,服务端可能会因为收不到心跳而认为这些实例已经下线并从服务列表中移除。

    2. 客户端重启逻辑:服务实例在重启过程中,如果未实现优雅退出逻辑,即在关闭前未向Nacos服务端发送下线通知,会导致服务端依然保留原有的实例信息,而在实例重启过程中,新启动的实例还未完成注册,这就形成了短暂的服务实例空窗期,表现为服务不可用。

    3. 网络波动:在重启过程中,网络状况不佳也可能导致心跳包丢失,进而使得服务实例被误判为下线。

    4. Kubernetes滚动更新:在k8s环境下,如果使用滚动更新策略升级服务,旧的Pod实例在停止前如果没有主动通知Nacos取消注册,新的Pod实例又尚未注册完成,就会出现服务实例数量锐减的现象。

    为了减少这种情况的发生,通常需要在服务实例的启动和关闭脚本中加入合理的Nacos注册和注销逻辑,确保在实例重启或升级过程中能够做到平滑过渡,即在实例准备关闭前先向Nacos发出下线请求,然后等待新实例完全启动并注册至Nacos之后,再关闭旧实例。此外,还可以适当调整Nacos的心跳间隔和超时时间,使之与服务实例的重启周期相匹配,以减少误判的可能性。

    2024-01-25 16:05:04
    赞同 1 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在Nacos进行滚动重启时,确实存在服务实例大量下线的情况。这主要是由于以下两种原因:首先,如果心跳过期,服务端可能会认为实例已经下线并删除之;其次,某些框架具有自动注销功能,当程序退出时会先尝试注销服务。

    为了解决这个问题,你可以尝试以下几种方法:

    1. 停止Nacos,然后删除data目录下的protocol文件夹,最后重新启动需要注册的服务。
    2. 在Pod关闭前设置一个preStop钩子,在这个钩子的脚本中主动从Nacos下线本机实例,然后延迟25秒再执行Pod的销毁,从而实现优雅的停机。
    3. 针对有问题的定时业务逻辑进行编码优化和实现。
    4. 扩大分配给程序的启动内存。

    以上这些方法都有助于解决Nacos滚动重启导致服务实例大量下线的问题。

    2024-01-13 17:18:14
    赞同 展开评论 打赏
  • 在Nacos滚动重启的过程中,由于其通过心跳检测机制将旧的pod实例下线,确实可能会造成服务实例大量下线的情况。这个下线过程并非瞬间完成,而存在一定的时间差。在这个时间差期间,服务消费方如果尝试调用接口,可能会遇到报错的情况,从而对业务操作产生影响。

    此外,如果服务所在的网络出现故障,例如网络断开、网络延迟等,也有可能会导致服务与Nacos服务的连接断开,进一步影响服务的正常运行。

    因此,尽管Nacos的data目录中的数据会在Nacos启动时被加载到内存中,以便在Nacos重启后能够恢复之前的状态,但在网络或硬件出现问题的情况下,仍需要密切关注服务的运行状况,并及时进行故障排查和修复。

    2024-01-13 10:40:32
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Nacos架构&原理 立即下载
workshop专场-微服务专场-开发者动手实践营-微服务-使用Nacos进行服务的动态发现和流量调度 立即下载
Nacos 启航,发布第一个版本, 云原生时代助力用户微服务平台建设 立即下载