跳到主要内容

监控运维

生产环境中,Nacos 的监控和运维至关重要。本章介绍如何构建 Nacos 的监控体系,包括 Prometheus 指标采集、Grafana 可视化、告警配置等内容。

监控概述

监控体系架构

┌─────────────────────────────────────────────────────────────────────────┐
│ Nacos 监控体系架构 │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据采集层 │ │
│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │
│ │ │ Nacos Node1 │ │ Nacos Node2 │ │ Nacos Node3 │ │ │
│ │ │ :8848 │ │ :8848 │ │ :8848 │ │ │
│ │ │ /actuator/ │ │ /actuator/ │ │ /actuator/ │ │ │
│ │ │ prometheus │ │ prometheus │ │ prometheus │ │ │
│ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据存储层 │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Prometheus │ │ │
│ │ │ 时序数据库 + 告警引擎 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 可视化层 │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Grafana │ │ │
│ │ │ 仪表盘 + 告警通知 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 告警通知层 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ 邮件 │ │ 钉钉 │ │ 企业微信 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘

监控指标分类

分类指标类型说明
JVM 指标内存、GC、线程监控 Nacos 进程健康状态
系统指标CPU、负载、磁盘监控服务器资源使用情况
服务指标注册数、订阅数、健康检查监控服务发现功能
配置指标配置数、监听数、推送延迟监控配置管理功能
网络指标连接数、请求数、延迟监控网络通信状态

暴露监控指标

配置 Actuator

Nacos 内置 Spring Boot Actuator,只需配置即可暴露监控指标:

# application.properties

# 暴露所有端点
management.endpoints.web.exposure.include=*

# 或只暴露 Prometheus 端点
management.endpoints.web.exposure.include=prometheus,health,info

# 暴露详细信息
management.endpoint.health.show-details=always

验证指标暴露

启动 Nacos 后,访问以下地址验证:

# Prometheus 格式的指标
curl http://localhost:8848/nacos/actuator/prometheus

# 健康检查
curl http://localhost:8848/nacos/actuator/health

# 基本信息
curl http://localhost:8848/nacos/actuator/info

常用端点

端点说明
/actuator/prometheusPrometheus 格式指标
/actuator/health健康状态
/actuator/info应用信息
/actuator/metrics指标列表
/actuator/env环境变量

Prometheus 部署

安装 Prometheus

Linux/Mac

# 下载
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz

# 解压
tar xvfz prometheus-*.tar.gz
cd prometheus-*

Windows

Prometheus 官网 下载 Windows 版本并解压。

Docker

docker run -d \
--name prometheus \
-p 9090:9090 \
-v ./prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

配置 Prometheus

创建 prometheus.yml 配置文件:

global:
scrape_interval: 15s # 采集间隔
evaluation_interval: 15s # 规则评估间隔

# 告警配置(可选)
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# 告警规则文件(可选)
rule_files:
# - "alert_rules.yml"

# 采集配置
scrape_configs:
# Prometheus 自身监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

# Nacos 集群监控
- job_name: 'nacos-cluster'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets:
- '192.168.1.101:8848'
- '192.168.1.102:8848'
- '192.168.1.103:8848'
labels:
instance: 'nacos-node-1'
- targets:
- '192.168.1.102:8848'
labels:
instance: 'nacos-node-2'
- targets:
- '192.168.1.103:8848'
labels:
instance: 'nacos-node-3'

启动 Prometheus

# Linux/Mac
./prometheus --config.file=prometheus.yml

# Windows
prometheus.exe --config.file=prometheus.yml

验证数据采集

  1. 访问 http://localhost:9090
  2. 在查询框输入 nacos_monitor 验证数据是否正常采集
  3. 访问 http://localhost:9090/targets 查看采集目标状态

Grafana 部署

安装 Grafana

Linux

# CentOS/RHEL
sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.0.0-1.x86_64.rpm
sudo service grafana-server start

# Ubuntu/Debian
sudo apt-get install -y grafana
sudo systemctl start grafana-server

Mac

brew install grafana
brew services start grafana

Docker

docker run -d \
--name grafana \
-p 3000:3000 \
grafana/grafana

配置数据源

  1. 访问 http://localhost:3000(默认账号密码:admin/admin)
  2. 进入 Configuration -> Data Sources
  3. 点击 Add data source
  4. 选择 Prometheus
  5. 配置 Prometheus 地址:http://prometheus:9090
  6. 点击 Save & Test

导入 Nacos 仪表盘

Grafana 提供了 Nacos 官方监控模板:

  1. 进入 Create -> Import
  2. 输入仪表盘 ID:12233(Nacos 官方模板)
  3. 选择 Prometheus 数据源
  4. 点击 Import

也可以导入 JSON 文件创建自定义仪表盘。

核心监控指标详解

JVM 指标

指标名说明告警阈值建议
system_cpu_usageCPU 使用率> 80%
system_load_average_1m系统负载> CPU 核数
jvm_memory_used_bytesJVM 内存使用量> 堆内存 80%
jvm_memory_max_bytesJVM 最大内存-
jvm_gc_pause_seconds_countGC 次数Young GC > 10次/分钟
jvm_gc_pause_seconds_sumGC 总耗时Full GC > 1秒
jvm_threads_daemon守护线程数-

内存监控示例

# 堆内存使用率
jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} * 100

# 非堆内存使用量
jvm_memory_used_bytes{area="nonheap"}

服务发现指标

指标名说明
nacos_monitor{name='ipCount'}注册实例总数
nacos_monitor{name='serviceCount'}服务总数
nacos_monitor{name='subServiceCount'}订阅服务数(客户端)
nacos_monitor{name='pubServiceCount'}发布服务数(客户端)
nacos_monitor{name='leaderStatus'}是否为 Leader(1=是,0=否)

服务监控示例

# 服务实例数趋势
nacos_monitor{name='ipCount'}

# 不健康实例数
sum(nacos_monitor{name='unhealthyCount'})

# 服务增长速率
rate(nacos_monitor{name='serviceCount'}[5m])

配置管理指标

指标名说明
nacos_monitor{name='configCount'}配置总数
nacos_monitor{name='configListenSize'}监听配置数
nacos_monitor{name='longPolling'}长连接数
nacos_timer_seconds_sum配置通知耗时
nacos_timer_seconds_count配置通知次数

配置监控示例

# 配置推送平均耗时
rate(nacos_timer_seconds_sum[5m]) / rate(nacos_timer_seconds_count[5m])

# 配置变更频率
rate(nacos_monitor{name='publish'}[5m])

健康检查指标

指标名说明
nacos_monitor{name='mysqlhealthCheck'}MySQL 健康检查次数
nacos_monitor{name='httpHealthCheck'}HTTP 健康检查次数
nacos_monitor{name='tcpHealthCheck'}TCP 健康检查次数

推送指标

指标名说明
nacos_monitor{name='failedPush'}推送失败次数
nacos_monitor{name='avgPushCost'}平均推送耗时
nacos_monitor{name='maxPushCost'}最大推送耗时

推送监控示例

# 推送成功率
1 - (rate(nacos_monitor{name='failedPush'}[5m]) / rate(nacos_monitor{name='pushCount'}[5m]))

# 推送延迟趋势
nacos_monitor{name='avgPushCost'}

异常指标

指标名说明
nacos_exception_total{name='db'}数据库异常数
nacos_exception_total{name='configNotify'}配置通知异常数
nacos_exception_total{name='unhealth'}健康检查异常数
nacos_exception_total{name='disk'}磁盘写入异常数
nacos_exception_total{name='nacos'}Nacos 内部异常数

告警配置

Prometheus 告警规则

创建 alert_rules.yml 文件:

groups:
- name: nacos-alerts
rules:
# CPU 使用率告警
- alert: NacosHighCPU
expr: system_cpu_usage > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "Nacos CPU 使用率过高"
description: "Nacos 节点 {{ $labels.instance }} CPU 使用率超过 80%,当前值: {{ $value }}"

# 内存使用率告警
- alert: NacosHighMemory
expr: jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "Nacos 内存使用率过高"
description: "Nacos 节点 {{ $labels.instance }} 堆内存使用率超过 85%"

# GC 频繁告警
- alert: NacosFrequentGC
expr: rate(jvm_gc_pause_seconds_count{action="end of major GC"}[5m]) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "Nacos Full GC 过于频繁"
description: "Nacos 节点 {{ $labels.instance }} Full GC 频率过高"

# 服务实例数异常下降
- alert: NacosServiceInstanceDrop
expr: delta(nacos_monitor{name='ipCount'}[5m]) < -10
for: 1m
labels:
severity: critical
annotations:
summary: "Nacos 服务实例大量下线"
description: "5分钟内服务实例数减少超过 10 个,请检查服务状态"

# 推送失败告警
- alert: NacosPushFailed
expr: rate(nacos_monitor{name='failedPush'}[5m]) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "Nacos 服务推送失败"
description: "Nacos 推送失败率过高,请检查网络连接"

# 数据库异常告警
- alert: NacosDatabaseError
expr: rate(nacos_exception_total{name='db'}[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Nacos 数据库异常"
description: "Nacos 数据库连接异常,请检查数据库状态"

# 节点离线告警
- alert: NacosNodeDown
expr: up{job="nacos-cluster"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Nacos 节点离线"
description: "Nacos 节点 {{ $labels.instance }} 已离线"

Grafana 告警配置

Grafana 支持多种通知渠道:

钉钉告警

  1. 创建钉钉机器人,获取 Webhook 地址
  2. Grafana 配置 Alerting -> Contact points -> Add contact point
  3. 选择 DingDing 类型,填入 Webhook URL
  4. 测试通知

邮件告警

修改 Grafana 配置文件 defaults.ini

[smtp]
enabled = true
host = smtp.example.com:25
user = [email protected]
password = your_password
skip_verify = true
from_address = [email protected]
from_name = Grafana Alert

企业微信告警

  1. 创建企业微信机器人
  2. 在 Grafana 中配置 Webhook 类型的 Contact point
  3. 配置消息模板

告警规则最佳实践

分级告警

级别说明通知方式
Critical严重影响服务可用性电话 + 短信 + 即时消息
Warning需要关注,暂不影响服务即时消息 + 邮件
Info信息提示邮件

告警收敛

  • 相同告警 5 分钟内不重复发送
  • 相关联告警合并发送
  • 设置静默时间段

运维管理

日志管理

日志文件位置

日志文件路径说明
启动日志logs/start.out启动过程日志
运行日志logs/nacos.log主要运行日志
访问日志logs/access.logHTTP 访问日志
协议日志logs/protocol-raft.logRaft 协议日志
协议日志logs/protocol-distro.logDistro 协议日志

日志级别配置

# application.properties

# 根日志级别
logging.level.root=info

# Nacos 日志级别
logging.level.com.alibaba.nacos=info

# 特定模块日志级别
logging.level.com.alibaba.nacos.naming=debug
logging.level.com.alibaba.nacos.config=debug

日志查看命令

# 查看启动日志
tail -f logs/start.out

# 查看运行日志
tail -f logs/nacos.log

# 搜索错误日志
grep -i "error" logs/nacos.log

# 查看最近 100 行
tail -n 100 logs/nacos.log

数据备份

MySQL 数据备份

# 全量备份
mysqldump -u nacos -p nacos > nacos_backup_$(date +%Y%m%d).sql

# 恢复备份
mysql -u nacos -p nacos < nacos_backup_20240101.sql

配置文件备份

# 备份配置
cp -r conf conf_backup_$(date +%Y%m%d)

# 备份集群配置
cp conf/cluster.conf conf/cluster.conf.bak

通过 API 导出配置

# 导出命名空间下的所有配置
curl "http://localhost:8848/nacos/v1/cs/configs?export=true&tenant=dev" \
-o nacos_config_export.zip

# 导入配置
curl -X POST "http://localhost:8848/nacos/v1/cs/configs?import=true&tenant=dev" \
-F "file=@nacos_config_export.zip"

服务运维

健康检查

# 检查服务状态
curl http://localhost:8848/nacos/v1/ns/operator/metrics

# 检查集群状态
curl http://localhost:8848/nacos/v1/core/cluster/nodes

# 检查 Raft 状态
curl http://localhost:8848/nacos/v1/core/cluster/raft/leader

滚动升级

升级步骤:
1. 停止一个节点
2. 备份该节点数据
3. 更新该节点的 Nacos 版本
4. 启动该节点
5. 验证该节点正常工作
6. 依次升级其他节点

扩容缩容

扩容

# 1. 部署新节点

# 2. 更新所有节点的 cluster.conf
echo "192.168.1.104:8848" >> conf/cluster.conf

# 3. 重启所有节点(按顺序)

缩容

# 1. 停止要下线的节点

# 2. 从 cluster.conf 中移除该节点

# 3. 重启其他节点

性能调优

JVM 参数调优

修改 startup.sh 中的 JVM 参数:

# 小规模部署(服务数 < 100)
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"

# 中规模部署(服务数 100-500)
JAVA_OPT="${JAVA_OPT} -Xms1g -Xmx1g -Xmn512m"

# 大规模部署(服务数 > 500)
JAVA_OPT="${JAVA_OPT} -Xms2g -Xmx2g -Xmn1g"

# GC 参数优化
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

数据库连接池优化

# 连接池配置
db.pool.config.maximumPoolSize=50
db.pool.config.minimumIdle=10
db.pool.config.connectionTimeout=30000
db.pool.config.idleTimeout=600000
db.pool.config.maxLifetime=1800000

清理配置

# 自动清理空服务
nacos.naming.clean.empty-service.interval=60000
nacos.naming.clean.empty-service.expired-time=60000

# 自动清理过期元数据
nacos.naming.clean.expired-metadata.interval=5000
nacos.naming.clean.expired-metadata.expired-time=60000

常见问题排查

服务注册失败

排查步骤

  1. 检查 Nacos 服务状态
  2. 检查网络连通性
  3. 检查认证信息
  4. 查看客户端日志
  5. 查看服务端日志
# 查看相关日志
grep -i "register" logs/nacos.log

配置推送延迟

可能原因

  • 网络延迟高
  • 客户端连接数过多
  • 服务端负载过高

解决方案

# 检查推送延迟指标
curl http://localhost:8848/nacos/actuator/prometheus | grep avgPushCost

# 检查长连接数
curl http://localhost:8848/nacos/actuator/prometheus | grep longPolling

集群数据不一致

排查步骤

  1. 检查节点间网络连通性
  2. 检查 Raft 日志
  3. 检查数据库同步状态
# 查看 Raft 状态
curl http://localhost:8848/nacos/v1/core/cluster/raft/leader

# 查看 Distro 同步状态
grep "distro" logs/protocol-distro.log

内存溢出

排查步骤

  1. 生成堆转储文件
  2. 分析内存占用
  3. 调整 JVM 参数
# 生成堆转储
jmap -dump:format=b,file=heap.hprof <pid>

# 使用 MAT 或 jvisualvm 分析

监控最佳实践

1. 多层次监控

  • 基础资源监控:CPU、内存、磁盘、网络
  • 应用层监控:JVM、连接数、请求量
  • 业务层监控:服务数、配置数、推送成功率

2. 告警分级

  • 不同级别的告警使用不同的通知方式
  • Critical 级别告警需要即时响应
  • 建立告警值班制度

3. 定期巡检

  • 每日检查关键指标
  • 每周检查系统容量
  • 每月进行灾备演练

4. 日志审计

  • 记录所有配置变更操作
  • 记录敏感操作(如删除服务)
  • 定期审查审计日志

参考资源