Nacos生产落地20条军规:从能跑到不出事
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 项、上线前 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 条,先收藏再说。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)