NACOS 服务实例信息未正常清理
2024-2-20
| 2024-2-21
字数 877阅读时长 3 分钟
type
status
date
slug
summary
tags
category
icon
password
AI summary
Last edited time
Feb 21, 2024 01:25 AM
运维同事反馈, 线上某个 spring boot 应用服务挂了, 让我看看.
notion image
但是, 这个 188 节点机器上的我们之前就已经下线了, 怎么会告警?
排查链路, 我们的 prometheus 监控数据来源是从 nacos 自动获取的, 搜索一下 nacos 的服务注册信息, 确实还有这个节点的注册信息
notion image
尝试手动清理实例信息
结果发现服务实例还在, openapi 虽然返回 {"code":0,"message":"success","data":"ok"}, 但是实例注册信息还在
用 arthas 看看调用情况吧
查看调用链路
notion image
查看源码 com.alibaba.nacos.naming.core.InstanceOperatorClientImpl#removeInstance
可以判断命中了 if (!clientManager.contains(clientId)) 分支, 并没有执行下面的真实删除逻辑
查看一下这个 clientManager
ClientManager 负责管理所有接入客户端(包含服务端提供端/客户订阅端)的连接信息维护工作
notion image
查看源码com.alibaba.nacos.naming.core.v2.client.manager.ClientManagerDelegate
感觉通过 openapi 的方式注销实例的情况, 可能走不通了, 看一下com.alibaba.nacos.naming.core.v2.client.Client#removeServiceInstance方法还有哪些地方使用吧
notion image
notion image
com.alibaba.nacos.naming.healthcheck.heartbeat.ExpiredInstanceChecker 源码
ExpiredInstanceCheckerInstanceBeatCheckTaskClientBeatCheckTaskV2ClientBeatCheckTaskV2

问题的解决

最后, 发现根本原因是, 运维的流水线构建时, 没有考虑到 docker 镜像制作的工作空间问题, 并发了, 导致了两个原本应该使用不同 jar 包的 docker 镜像, 实际上制作出来的是同一个服务镜像, 恰好这个错误的镜像在 188 机器上运行

📎 参考文章

  • Arthas
  • Nacos
  • 阿里云 DTS java 客户端配置openwrt 上设置 zerotier 并打通局域网
    Loading...