Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Nacos 故障排查

下面是一份 真正生产可用的 Nacos 故障排查指南(最全版)。

覆盖:注册中心问题、配置中心问题、集群问题、MySQL 问题、gRPC 通信、端口、客户端问题、性能瓶颈、日志定位。

这是 运维、后端、架构师都能直接拿来用的实战手册。

0. 故障排查总思路(速查)

Nacos 故障 -> 80% 按下面 5 步就能定位:

  1. 看端口(8848、9848、7848 是否正常)
  2. 看 MySQL(连接、慢 SQL、连接池,是否 down)
  3. 看节点状态 /nacos/v1/ns/operator/servers
  4. 看日志(naming、config、core,几乎全部能看到)
  5. 看客户端错误(gRPC 连不通、心跳失败、没有推送)

这些就是 80% 的根因。

1. 服务注册异常(Naming)排查

❌ 1.1 服务反复上下线(最常见)

🔍 常见原因

  1. 心跳失败 -> 临时实例被自动下线
  2. Pod 健康检查太严格
  3. 网络抖动
  4. 客户端时间和 Nacos 差太大
  5. gRPC(9848)不通

✅ 解决方案

① 放宽心跳参数(客户端)

spring.cloud.nacos.discovery.heart-beat-interval=5000
spring.cloud.nacos.discovery.heart-beat-timeout=20000
spring.cloud.nacos.discovery.ip-delete-timeout=30000

② Kubernetes 健康检查调整

livenessProbe:
  periodSeconds: 30
readinessProbe:
  periodSeconds: 30

③ 检查客户端 -> Nacos gRPC 通道

telnet nacos-ip 9848

❌ 1.2 客户端无法注册服务

🔍 常见原因

  • 使用 Nginx 代理导致 gRPC 断开
  • 跨机房延迟过高
  • Nacos 节点时间不一致
  • Nacos cluster 节点不可达

✅ 检查 gRPC(必须要通)

telnet ${nacos-ip} 9848

✅ 检查节点状态

访问任意节点:

/nacos/v1/ns/operator/servers

如果有节点 DOWN -> 说明集群通信 7848 失败。

❌ 1.3 服务列表不一致(节点 A 有,节点 B 没有)

这是 3 节点集群里最“坑”的问题。

🔍 常见原因

  • 管理员让客户端连接“单节点”而不是 LB
  • Nacos 本身 gRPC 集群同步延迟(2.x 经常出现)
  • MySQL 慢 SQL 导致数据更新不一致

✅ 必须让客户端连 LB(重要)

正确:

http://nacos-lb:8848

错误:

http://nacos-node1:8848

✅ 检查 gRPC 同步(Naming log)

logs/naming-server.log

2. 配置中心异常(Config)排查

❌ 2.1 配置修改后客户端未刷新

🔍 原因

  1. 客户端通过 LB,但来自不同节点
  2. 客户端防火墙阻断 9848
  3. 配置格式问题(YAML 缩进)
  4. Spring @RefreshScope 没生效
  5. DataID 不一致

✅ 排查步骤(按顺序)

1)客户端日志检查:

Refresh config error
Listener receive error

2)测试长轮询(Config 2.x 用 gRPC)

telnet nacos-ip 9848

3)检查 DataId 是否正确

web 控制台查看实际 DataId / Group。

4)检查 @RefreshScope 是否加在对应类上。

❌ 2.2 配置推送延迟

原因

  • 集群节点卡住(CPU / GC)
  • MySQL 压力大
  • 客户端长轮询阻塞

解决

  • 增加 JVM:Xms4g - Xmx4g
  • 优化 MySQL:连接池 / redo log
  • 扩容 Nacos 节点

3. 集群故障排查

❌ 3.1 某节点 DOWN,但进程正常

原因

  • 7848 集群通信端口不通
  • docker/k8s 容器 NAT 问题
  • 集群 IP 配错(cluster.conf)

解决

telnet 192.168.X.X 7848

检查 cluster.conf:

192.168.10.11:8848

必须使用内网 IP,不要写 127.0.0.1。

❌ 3.2 集群脑裂(两个节点互认为 master)

原因

  • 不要部署 2 节点
  • MySQL 写入失败
  • 网络分区(机房隔离)

解决

  • 必须 3 节点以上
  • 节点间使用专线或同内网
  • MySQL 监控 IOPS

❌ 3.3 集群启动顺序错导致初始化失败

原因

  • 第一个节点没连上 MySQL
  • 另一个节点从空数据库启动 -> 数据错乱

解决

  • 确保 MySQL 先启动
  • 首次启动按顺序:Node1 -> Node2 -> Node3

4. MySQL 故障排查(关键)

Nacos 80% 故障都是 MySQL 连接问题。

❌ 4.1 MySQL 连接失败

查看 logs/nacos.log:

java.sql.SQLNonTransientConnectionException
Communications link failure

排查

mysql -h192.168.x.x -unacos -p

❌ 4.2 慢 SQL 导致 Nacos 卡死

Nacos 常见慢 SQL:

SELECT * FROM config_info WHERE data_id = ? AND group_id = ?

排查:

SHOW PROCESSLIST;

解决:

  • 给 config_info 加索引
  • MySQL 调大 innodb_buffer_pool_size

❌ 4.3 MySQL 连接池耗尽

日志:

HikariPool-1 - Connection is not available

解决:

db.pool.config.connectionTimeout=3000
db.pool.config.maximumPoolSize=50

5. 性能与资源问题

❌ 5.1 JVM 内存不足导致频繁 GC

表现:

Full GC (Allocation Failure)

解决:

-Xms4g -Xmx4g -XX:+UseG1GC

❌ 5.2 Nacos CPU 飙高

原因:

  • 配置推送过多
  • 客户端实例数量过大(>10k)
  • MySQL 慢

解决:

  • 分环境拆 namespace
  • 分服务 Group
  • 扩容节点(>5)

6. 客户端故障排查

❌ 6.1 客户端启动慢 / 注册慢

日志:

grpc connect timeout

原因:

  • gRPC 端口 9848 未开
  • 客户端连的是单节点 IP

解决:

spring.cloud.nacos.server-addr=http://nacos-lb:8848

❌ 6.2 客户端不刷新配置

排查:

Listener receive error

根因:

  • gRPC 通道断开 -> 9848

7. 日志定位指南(最重要)

日志文件 用途
naming-server.log 服务注册、心跳、健康检查
config-server.log 配置推送、监听、diff
core-auth.log 鉴权、登录失败
start.out 启动过程问题
nacos.log 统一日志(部分异常)

8. 故障速查表(最常见 TOP 10)

问题 根因 解决方法
服务上下线频繁 心跳丢失 / gRPC 不通 调心跳,开 9848
配置不刷新 YAML 错 / gRPC 错 修 YAML;开 9848
节点 DOWN 7848 不通 打通节点通信端口
服务列表不一致 客户端连单节点 一律走 LB
集群节点不互通 cluster.conf 配错 改成内网 IP
MySQL 连接失败 用户密码/防火墙 修权限
MySQL 慢导致卡顿 无索引 加索引优化
高 CPU 推送量大/GC 扩容/调 JVM
脑裂 双节点/网络隔离 3 节点以上
gRPC 超时 防火墙拦截 telnet 9848