监控运维
生产环境中,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/prometheus | Prometheus 格式指标 |
/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
验证数据采集
- 访问
http://localhost:9090 - 在查询框输入
nacos_monitor验证数据是否正常采集 - 访问
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
配置数据源
- 访问
http://localhost:3000(默认账号密码:admin/admin) - 进入
Configuration->Data Sources - 点击
Add data source - 选择
Prometheus - 配置 Prometheus 地址:
http://prometheus:9090 - 点击
Save & Test
导入 Nacos 仪表盘
Grafana 提供了 Nacos 官方监控模板:
- 进入
Create->Import - 输入仪表盘 ID:
12233(Nacos 官方模板) - 选择 Prometheus 数据源
- 点击
Import
也可以导入 JSON 文件创建自定义仪表盘。
核心监控指标详解
JVM 指标
| 指标名 | 说明 | 告警阈值建议 |
|---|---|---|
system_cpu_usage | CPU 使用率 | > 80% |
system_load_average_1m | 系统负载 | > CPU 核数 |
jvm_memory_used_bytes | JVM 内存使用量 | > 堆内存 80% |
jvm_memory_max_bytes | JVM 最大内存 | - |
jvm_gc_pause_seconds_count | GC 次数 | Young GC > 10次/分钟 |
jvm_gc_pause_seconds_sum | GC 总耗时 | 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 支持多种通知渠道:
钉钉告警
- 创建钉钉机器人,获取 Webhook 地址
- Grafana 配置
Alerting->Contact points->Add contact point - 选择
DingDing类型,填入 Webhook URL - 测试通知
邮件告警
修改 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
企业微信告警
- 创建企业微信机器人
- 在 Grafana 中配置 Webhook 类型的 Contact point
- 配置消息模板
告警规则最佳实践
分级告警:
| 级别 | 说明 | 通知方式 |
|---|---|---|
| Critical | 严重影响服务可用性 | 电话 + 短信 + 即时消息 |
| Warning | 需要关注,暂不影响服务 | 即时消息 + 邮件 |
| Info | 信息提示 | 邮件 |
告警收敛:
- 相同告警 5 分钟内不重复发送
- 相关联告警合并发送
- 设置静默时间段
运维管理
日志管理
日志文件位置
| 日志文件 | 路径 | 说明 |
|---|---|---|
| 启动日志 | logs/start.out | 启动过程日志 |
| 运行日志 | logs/nacos.log | 主要运行日志 |
| 访问日志 | logs/access.log | HTTP 访问日志 |
| 协议日志 | logs/protocol-raft.log | Raft 协议日志 |
| 协议日志 | logs/protocol-distro.log | Distro 协议日志 |
日志级别配置
# 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
常见问题排查
服务注册失败
排查步骤:
- 检查 Nacos 服务状态
- 检查网络连通性
- 检查认证信息
- 查看客户端日志
- 查看服务端日志
# 查看相关日志
grep -i "register" logs/nacos.log
配置推送延迟
可能原因:
- 网络延迟高
- 客户端连接数过多
- 服务端负载过高
解决方案:
# 检查推送延迟指标
curl http://localhost:8848/nacos/actuator/prometheus | grep avgPushCost
# 检查长连接数
curl http://localhost:8848/nacos/actuator/prometheus | grep longPolling
集群数据不一致
排查步骤:
- 检查节点间网络连通性
- 检查 Raft 日志
- 检查数据库同步状态
# 查看 Raft 状态
curl http://localhost:8848/nacos/v1/core/cluster/raft/leader
# 查看 Distro 同步状态
grep "distro" logs/protocol-distro.log
内存溢出
排查步骤:
- 生成堆转储文件
- 分析内存占用
- 调整 JVM 参数
# 生成堆转储
jmap -dump:format=b,file=heap.hprof <pid>
# 使用 MAT 或 jvisualvm 分析
监控最佳实践
1. 多层次监控
- 基础资源监控:CPU、内存、磁盘、网络
- 应用层监控:JVM、连接数、请求量
- 业务层监控:服务数、配置数、推送成功率
2. 告警分级
- 不同级别的告警使用不同的通知方式
- Critical 级别告警需要即时响应
- 建立告警值班制度
3. 定期巡检
- 每日检查关键指标
- 每周检查系统容量
- 每月进行灾备演练
4. 日志审计
- 记录所有配置变更操作
- 记录敏感操作(如删除服务)
- 定期审查审计日志