Nacos 生产落地的 20 条军规


从"能跑"到"不出事",中间隔着 20 个检查项

这篇文章把这份清单拆成四个阶段:部署前 → 上线前 → 运行中 → 事故时。不用记住全部 20 条,只需要在每个阶段打开对应的部分。

⚠️ 本文适用于基于 Nacos 2.3.x cluster 模式的生产部署。单机模式部署的检查项为 1-4 和 18-20,中间 5-17 不适用。如果你的 Nacos 运行在 K8s 上,部分"操作系统层面"检查项由 K8s 的 liveness/readiness probe 替代。


一、部署前(5 项)

这些是上机器之前就要确认好的。前四个不需要 Nacos 跑起来就能检查。第五条要把 MySQL 跑起来才能验证。

1. 服务器规格确认

CPU   ≥ 4 core
内存  ≥ 8 GB(生产建议 16 GB)
磁盘  ≥ 50 GB(日志保留 7 天,建议 SSD)
OS    CentOS 7.x / Ubuntu 20.04+ / K8s
JDK   OpenJDK 11 或 17(Nacos 2.3.x 需要 JDK 8+)

踩坑记录:有人用 2 核 4G 的云服务器跑 Nacos cluster 模式。平时没问题,一次配置批量发布时堆内存打满,Full GC 耗时 45 秒。那 45 秒内这个节点的 gRPC 连接全断,下游客户端开始重连风暴。

2 核 4G 只够跑 standalone 模式做开发和测试。生产 cluster 模式:3 节点 × 4 核 8G 起步。

2. 操作系统参数

# 最大文件句柄数
ulimit -n 65535

# 最大用户进程数
ulimit -u 4096

# 持久化到 /etc/security/limits.conf
echo "nacos soft nofile 65535" >> /etc/security/limits.conf
echo "nacos hard nofile 65535" >> /etc/security/limits.conf
echo "nacos soft nproc 4096" >> /etc/security/limits.conf
echo "nacos hard nproc 4096" >> /etc/security/limits.conf

# 关闭 swap(JVM 进程进 swap 会有严重性能抖动)
swapoff -a
sed -i '/swap/d' /etc/fstab

3. 网络端口

# 确认以下端口在防火墙/NAT 中开放
# 8848 (HTTP)    → 控制台 + 配置管理 API
# 9848 (gRPC)    → 服务发现 + 配置推送
# 9849 (gRPC)    → 集群 Raft 通信
# 7848 (TCP)     → Jraft 选举通信

# 一键检查
for port in 8848 9848 9849 7848; do
  nc -zv <另一节点IP> $port && echo "Port $port: OK" || echo "Port $port: FAIL"
done

4. 时钟同步

Nacos 集群依赖 Raft 选举。Raft 依赖时间戳。时间戳不同步 → 选举超时 → 节点之间反复选主。

# 所有节点必须配置 NTP
yum install -y ntp
systemctl enable ntpd
systemctl start ntpd

# 验证
ntpq -p
# 所有节点时间差 < 1 秒

5. MySQL 初始化

-- 创建数据库
CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4;

-- 执行官方初始化脚本
-- 下载地址:https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
SOURCE /path/to/mysql-schema.sql;

-- 验证表结构
USE nacos_config;
SHOW TABLES;
-- 期望输出:至少包含 config_info, users, roles, permissions 等表

二、上线前(8 项)

这八项是 Nacos 启动之后、切生产流量之前必须通过的检查。

6. 认证与安全

# 确认以下 3 项已经配置
nacos.core.auth.enabled=true
nacos.core.auth.plugin.nacos.token.secret.key=<自己生成的 Base64 密钥>
nacos.core.auth.enable.userAgentAuthWhite=false

验证:

# 未认证的请求必须返回 403
curl -s -o /dev/null -w "%{http_code}" "http://nacos:8848/nacos/v1/cs/configs?dataId=test"
# 期望输出:403

🔗 完整安全配置流程见:安全认证 3 步锁死

7. 集群状态

# 所有节点必须显示 UP
curl -s "http://nacos:8848/nacos/v1/core/cluster/nodes" | jq '.data[].state'
# 期望输出:每行都是 "UP"

# 确认 Leader 已选出
curl -s "http://nacos:8848/nacos/v1/ns/raft/leader" | jq '.leader'
# 期望输出:非空的 leader 地址

8. MySQL 连接

# 确认每个节点都能连上 MySQL
curl -s "http://nacos:8848/nacos/actuator/health" | jq '.components.db.status'
# 期望输出:"UP"

# 检查连接池情况
curl -s "http://nacos:8848/nacos/actuator/prometheus" | grep hikaricp_connections_active

9. 日志与监控

# 确认 Prometheus 端点可用
curl -s "http://nacos:8848/nacos/actuator/prometheus" | head -20

# 确认日志目录有写入权限
touch /home/nacos/logs/test_write && rm /home/nacos/logs/test_write
echo "Log directory writable: OK"

# 确认日志文件正常轮转
ls -la /home/nacos/logs/nacos.log*

10. 健康检查配置

# 检查默认健康检查方式
curl -s "http://nacos:8848/nacos/v1/ns/operator/metrics" | jq '.serviceCount'

# 如果使用 HTTP 健康检查,确认 /health 端点
# 在任意一台实例上测试:
curl -s -o /dev/null -w "%{http_code}" "http://instance-ip:port/actuator/health"

11. Namespace 与权限

确认清单:
[ ] 至少创建了 dev / test / prod 三个 namespace
[ ] prod namespace 已配置只读角色和读写角色
[ ] 默认 public namespace 已设置只读权限
[ ] 所有用户已改为非默认密码

12. JVM 参数

# 确认启动脚本中的 JVM 参数
grep "JAVA_OPT" /home/nacos/bin/startup.sh

# 最小配置:
# -server -Xms2g -Xmx2g -Xmn1g
# -XX:+UseG1GC -XX:MaxGCPauseMillis=200
# -XX:+HeapDumpOnOutOfMemoryError
# -XX:HeapDumpPath=/var/log/nacos/

# 运行时验证
jcmd <nacos_pid> VM.flags | grep -E "Xms|Xmx|UseG1GC"

13. 备份策略

# 确认 MySQL 备份
# 至少保留最近 7 天的每日全量备份
mysqldump -h mysql_host -u nacos -p nacos_config > nacos_backup_$(date +%Y%m%d).sql

# 确认 Nacos 配置目录备份
tar -czf nacos_conf_backup_$(date +%Y%m%d).tar.gz /home/nacos/conf/

三、运行中(4 项)

这些不需要上线前做完,但需要在日常运维中持续关注。

14. 控制台操作风控

原则:
- 修改操作走 API,不走控制台
- 批量操作分批执行(每批 20%,间隔 3 分钟)
- 生产环境控制台账号只给运维和架构组

🔗 控制台操作红线详见:生产运维的 5 个反直觉操作

15. 告警配置

告警项 阈值 处理时间
Nacos 进程掉线 任何节点 DOWN 5 分钟
gRPC 连接数突降 5 分钟内下降 > 50% 5 分钟
配置推送延迟 p99 > 1000ms 15 分钟
MySQL 连接池使用率 > 80% 15 分钟
Full GC 频率 > 1次/小时 30 分钟
磁盘使用率 > 80% 1 小时

16. 容量水位

# 每周检查一次
# 服务数
curl -s "http://nacos:8848/nacos/v1/ns/operator/metrics" | jq '.serviceCount'

# 实例数
curl -s "http://nacos:8848/nacos/v1/ns/operator/metrics" | jq '.instanceCount'

# 配置数
curl -s "http://nacos:8848/nacos/v1/cs/ops/metrics" | jq '.configCount'

# MySQL 表大小
mysql> SELECT table_name, round(data_length/1024/1024) as size_mb 
FROM information_schema.tables WHERE table_schema='nacos_config';
指标 警戒水位
单命名空间服务数 > 2000
单服务实例数 > 500
单命名空间配置数 > 5000
config_info 表大小 > 500MB
配置内容单条大小 > 100KB

17. 版本升级计划

Nacos 版本迭代较快。制定一个版本跟踪计划比出了问题再升要好:

每季度检查一次 GitHub Release:https://github.com/alibaba/nacos/releases
重大安全修复 → 一个月内升级
小版本功能更新 → 在预发跑一周后升级生产
大版本(1.x→2.x)→ 灰度切流,至少预发两周

四、事故时(3 项)

事故时你最不需要的就是翻开一堆文档找命令。这三条写在最顺手的地方。

18. 一键判断集群状态

# 单条命令,输出当前集群是否正常
curl -s "http://nacos:8848/nacos/v1/core/cluster/nodes" | \
  jq '[.data[] | {ip:.address, state:.state}] | group_by(.state) | map({state: .[0].state, count: length})'
# 期望输出:所有节点 state="UP"

19. 一键摘除故障节点

# 如果某个节点假死(端口通但无响应),从集群摘除并重启
# Step 1: 在 Nacos 控制台 → 集群管理 → 下线该节点
# Step 2: 在该节点机器上重启 Nacos
cd /home/nacos/bin && sh shutdown.sh && sleep 5 && sh startup.sh -m cluster

# Step 3: 确认节点重新加入集群且状态 UP
curl -s "http://nacos:8848/nacos/v1/core/cluster/nodes" | jq '.data[] | select(.address=="故障节点IP") | .state'

20. 一键恢复:MySQL 配置找回

# 如果 Nacos 数据库被误操作,从最近的备份恢复
# Step 1: 停止所有 Nacos 节点
# Step 2: 恢复 MySQL
mysql -u nacos -p nacos_config < nacos_backup_20260610.sql

# Step 3: 逐台启动 Nacos
cd /home/nacos/bin && sh startup.sh -m cluster

# Step 4: 验证配置是否恢复
curl -s "http://nacos:8848/nacos/v1/cs/configs?dataId=<关键配置>&group=DEFAULT_GROUP&namespaceId=prod"

一张图带走:20 条按阶段执行的完整路径

部署前
5 项

1. 服务器规格
4C8G 起步

2. 系统参数
nofile 65535 / swap off

3. 网络端口
8848+9848+9849+7848

4. 时钟同步
NTP 时间差 < 1s

5. MySQL 初始化
执行 mysql-schema.sql

上线前
8 项

6. 认证安全
enabled=true + 自定义密钥

7. 集群状态
所有节点 UP + Leader 确定

8. MySQL 连接
health 端点 OK

9. 日志监控
Prometheus 端点可访问

10. 健康检查
确认检查方式正确

11. 权限隔离
prod/dev namespace + 角色

12. JVM 参数
G1GC + 堆 2G 起步

13. 备份策略
MySQL + conf 每日备份

运行中
4 项

14. 控制台风控
修改走 API 分批执行

15. 告警配置
6 项核心告警阈值

16. 容量水位
服务数/实例数/配置数

17. 版本升级
每季度检查 GitHub Release

事故时
3 项

18. 一键判活
cluster/nodes 看全集群状态

19. 一键摘除
控制台下线 → 重启 → 确认

20. 一键恢复
MySQL 备份快照回滚

打印出来贴在工位上。部署前 5 项、上线前 8 项、运行中 4 项、事故时 3 项——总共 20 条,每条有命令、有阈值、有期望输出。


这条清单不适用的情况

单机模式。 如果你用的是 standalone 模式(不管 1 节点还是 2 节点),5-17 项中大量集群相关的检查不适用。standalone 没有 Raft 选举、没有集群间端口检查、没有节点摘除的概念。standalone 只需要检查 1-4 和 18-20。

K8s 部署。 如果你的 Nacos 跑在 K8s 上,操作系统配置(nofile、swap、ntp)由 K8s node 统一管理,不需要在 Pod 里单独配置。端口检查由 Service 和 Ingress 接管。健康检查由 K8s 的 readiness/liveness probe 接管——但 Nacos 内部的健康检查配置(第 10 项)仍需关注。


评论区留数字:你们的生产 Nacos 走完了这份清单的几条?1=走完 15 条以上 2=走完 10-14 条 3=走完 5-9 条 4=少于 5 条,先收藏再说。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐