控制台点了 3 下,100 台机器同时重启了:Nacos生产运维的 5 个反直觉操作

发布时间:2026/7/7 8:38:45
控制台点了 3 下,100 台机器同时重启了:Nacos生产运维的 5 个反直觉操作 控制台点了 3 下100 台机器同时重启了生产运维的 5 个反直觉操作那个按钮你不点永远不知道会有多大动静在 Nacos 控制台上把某个服务的健康检查方式从 TCP 改成了 HTTP。就是改个参数——跟改个端口号差不多。点了保存。10 秒之后100 多台该服务的实例状态从健康变成了不健康。服务发现列表里这个服务瞬间只剩下 3 台机器。流量涌向这 3 台负载均衡来不及反应——超时告警、熔断告警、调用链全红。控制台那个按钮没有二次确认弹窗。没有此操作将影响 X 台实例的提示。没有预览变更范围的能力。控制台是给开发者和运维用的工具但它不是运维工具。它不会在你操作前告诉你影响面有多大。这篇文章总结了 5 个生产运维中容易踩的坑——每个都有人踩过、每个都有解法、每个解法都比下次小心点可靠。⚠️ 本文基于 Nacos 2.3.x 控制台行为描述。如果你使用的是 1.4.x 版本控制台功能差异较大——1.x 没有 gRPC 端口 9848、没有服务列表的实时订阅数显示。文中提到的当前订阅者数功能仅在 2.x 控制台可用。全景控制台能做 vs 不该用控制台做的不该用控制台做的事批量修改配置修改健康检查方式批量删除实例修改保护阈值控制台适合做的事查看服务列表查看配置内容查看订阅关系调整单个实例权重⚠️ 确认影响面后控制台适合看不适合改。能 API 批量操作的尽量不要在控制台上点。反直觉一改一个参数所有实例重新注册回到开头的故事。为什么改健康检查方式会导致 100 台实例掉线Nacos 的健康检查切换不是即时生效的。当你把 TCP 改成 HTTP 时Nacos 服务端会做两件事停止对已有实例的 TCP 健康检查等待实例下一次心跳上报根据心跳中携带的新健康检查方式重新初始化问题出在等待下一次心跳。默认心跳间隔是 5 秒。在这 5 秒内所有旧健康检查已停掉、新的还没建立。于是 5 秒后到达的健康状态判定窗口这 100 台实例全部被标记为不健康。正确的操作方式# 不要点控制台。用 API逐批修改。# 先改 20% 的实例观察 5 分钟再改下一批。# 更新实例元数据来控制健康检查方式curl-XPUThttp://nacos:8848/nacos/v1/ns/instance\-dserviceNameorder-service\-dip10.0.1.10\-dport8080\-dclusterNameDEFAULT\-dmetadatahealthCheckTypehttp\-dhealthytrue\-dnamespaceIdprod\-dgroupNameDEFAULT_GROUP如果你一定想在控制台改先在预发环境做一次观察实例状态变化记录恢复时间。然后带着这个时间估计去生产环境操作——并提前通知相关方接下来 30 秒内该服务可能有一波抖动。⚠️ 回滚方案如果改完后大量实例掉线立即改回原来的健康检查方式。不要删除实例、不要重启服务。等心跳恢复最多 15 秒实例状态自动回到健康。反直觉二批量修改配置控制台是最后一个选择Nacos 控制台有批量导出/导入功能。用它改生产配置的风险是——没有 diff、没有审批、没有回滚预览。控制台批量修改的三个黑洞问题后果导入时覆盖已有配置无差异对比不知道改了哪些行、没改哪些行无审批流程一个人点一下几百条配置全变回滚只能逐条历史Nacos 的配置历史是单条维度不支持批量回滚推荐方案# 1. 先导出当前配置备份curl-XGEThttp://nacos:8848/nacos/v1/cs/configs?dataIdgrouppageNo1pageSize500namespaceIdprod\config_backup_$(date%Y%m%d_%H%M%S).json# 2. 通过 API 逐条更新脚本批量执行保留 diff 记录# publishConfig.sh#!/bin/bashNACOS_URLhttp://nacos:8848NAMESPACEprodGROUPDEFAULT_GROUPpublish(){localdataId$1localcontent$2localbackup_filebackup_${dataId}_$(date%s)# 拉取旧配置curl-s${NACOS_URL}/nacos/v1/cs/configs?dataId${dataId}group${GROUP}namespaceId${NAMESPACE}\${backup_file}# 发布新配置curl-XPOST${NACOS_URL}/nacos/v1/cs/configs\-ddataId${dataId}\-dgroup${GROUP}\-dnamespaceId${NAMESPACE}\-dcontent${content}echoPublished${dataId}, backup saved to${backup_file}}生产批量修改的最小安全流程导出当前配置为 JSON 备份在预发环境跑一遍完整的批量修改脚本在生产的 dev/test namespace 再跑一遍在 prod namespace 分批执行每批 20%每批间隔 3 分钟观察保留每批修改前后的 diff 文件反直觉三单机模式的 Nacos 比集群模式更容易挂不掉单机模式standalone启动快、运维简单。但有一个反直觉的问题单机模式下没有 Raft 选举。Raft 选举虽然增加了集群复杂度但它有一个副作用——当集群出现网络分区时少数派节点拒绝写入操作避免了脑裂。单机模式没有这个保护。如果 Nacos 进程的 GC 时间过长Full GC 超过 10 秒客户端心跳超时服务端进程却在 GC 结束后恢复正常——它不会拒绝任何操作。只是那 10 秒内的心跳丢了那 10 秒内的注册请求超时了。GC 结束后一切正常但缓存里已经留下了一堆过期数据。解法# standalone 模式的 JVM 参数至少配这些JAVA_OPT${JAVA_OPT}-server -Xms2g -Xmx2g -Xmn1gJAVA_OPT${JAVA_OPT}-XX:UseG1GC -XX:MaxGCPauseMillis200JAVA_OPT${JAVA_OPT}-XX:-OmitStackTraceInFastThrow# 加上 GC 日志JAVA_OPT${JAVA_OPT}-Xlog:gc*:file/var/log/nacos/gc-%t.log:time,level,tags:filesize100m,filecount5单机模式只适合开发和测试。任何有挂了不能接受的场景至少 2 节点集群。反直觉四控制台看不到的才是真正危险的东西Nacos 控制台的服务列表里有很多信息——实例数、健康状态、权重。但有四个信息控制台看不到而它们恰恰是你排查问题时最需要的数据看不到的信息为什么重要怎么看服务端的客户端连接数gRPC 连接泄漏时服务列表看不出8848 端口的prometheus端点/nacos/actuator/prometheus某个命名空间的写入 QPS频繁注册/注销时看不出是哪个 namespacePrometheus Grafana 面板当前有多少个 Config LongPolling 挂起1.x 客户端未迁移时内存泄漏/nacos/v1/ns/operator/metrics排查单个配置被多少实例 watch改了某个配置不知道影响面控制台监听查询页面2.3.0# 查看服务端 gRPC 连接数 # Prometheus 指标nacos_monitor{namepushCheck} curl -s http://localhost:8848/nacos/actuator/prometheus | grep nacos_monitor 搭过 Prometheus Grafana 监控面板Nacos 日志与监控体系搭建——问题没来监控先行反直觉五Nacos 的日志不是给人读的是给脚本读的nacos/logs/nacos.log这个文件一天能涨到 500MB。你不可能靠 grep 排查生产问题。Nacos 的日志里最有价值的几条线# 1. 服务注册/注销事件不是看日志是订阅事件# 正确方式在客户端实现 EventListener打印到独立的业务日志# 2. 配置变更日志# nacos/config.log 里记录了每次配置变更tail-f/home/nacos/logs/nacos/config.log|grepdataIddb.password# 3. 推送延迟# nacos/gRPC.log 里记录了推送的 traceId# 结合 Skywalking/Sleuth 可追踪推送到消费的全链路耗时# 4. 鉴权失败日志安全审计grepaccess denied/home/nacos/logs/nacos/auth.log日志策略日志文件保留天数归档方式nacos.log7 天每天一个文件7 天外自动删除access.log30 天归档到日志中心auth.log90 天归档到日志中心安全审计要求一张图带走控制台操作红线查看修改单实例 / 单配置影响 5 个实例批量 / 全服务影响 ≥5 个实例修改健康检查方式修改保护阈值你想做的操作是查看还是修改?控制台服务列表 / 配置内容 / 订阅关系影响范围?控制台先确认影响面不要用控制台用 API 逐批操作每批 20%间隔 3 分钟观察高危操作必须走 API先在预发执行并记录恢复时间一张图判断什么操作能在控制台点、什么必须在 API 里分批发。红线影响 ≥5 个实例 → 走 API。你们在 Nacos 控制台上手滑过吗评论区留数字1没手滑过但听说过别人的事故 2手滑过幸好是测试环境 3手滑过生产靠限流扛住了 4手滑过生产造成了事故。