系统监控工具指南 / 第12章:监控最佳实践
第12章:监控最佳实践
12.1 监控策略概述
12.1.1 监控的目标
| 目标 | 说明 |
|---|---|
| 可用性 | 确保服务正常运行 |
| 性能 | 保证响应时间和吞吐量 |
| 容量 | 合理规划资源使用 |
| 成本 | 优化资源成本 |
12.1.2 监控的层次
┌─────────────────────────────────────────────────────────────┐
│ 业务层监控 (Business) │
│ 订单量、用户数、转化率、收入 │
├─────────────────────────────────────────────────────────────┤
│ 应用层监控 (Application) │
│ 响应时间、错误率、QPS、并发数 │
├─────────────────────────────────────────────────────────────┤
│ 系统层监控 (System) │
│ CPU、内存、磁盘、网络 │
├─────────────────────────────────────────────────────────────┤
│ 基础设施层监控 (Infrastructure) │
│ 服务器、网络设备、存储设备 │
└─────────────────────────────────────────────────────────────┘
12.1.3 监控方法论
Google SRE四个黄金信号:
| 信号 | 说明 | 示例 |
|---|---|---|
| Latency | 延迟 | 请求响应时间 |
| Traffic | 流量 | 每秒请求数 |
| Errors | 错误 | 错误率 |
| Saturation | 饱和度 | 资源使用率 |
USE方法(Brendan Gregg):
| 资源 | Utilization | Saturation | Errors |
|---|---|---|---|
| CPU | CPU使用率 | 运行队列长度 | 中断错误 |
| 内存 | 内存使用率 | Swap使用 | 内存错误 |
| 磁盘 | 磁盘使用率 | IO队列长度 | IO错误 |
| 网络 | 带宽使用率 | 网络队列 | 网络错误 |
RED方法(Tom Wilkie):
| 指标 | 说明 | 适用场景 |
|---|---|---|
| Rate | 请求速率 | 微服务 |
| Errors | 错误率 | 微服务 |
| Duration | 请求延迟 | 微服务 |
12.2 监控指标体系
12.2.1 系统层指标
CPU指标:
| 指标 | 计算方式 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| CPU使用率 | 1 - idle | >70% | >90% |
| 用户空间CPU | us | >60% | >80% |
| 系统空间CPU | sy | >30% | >50% |
| IO等待 | wa | >20% | >50% |
| 运行队列长度 | load average | >CPU核心数 | >2*CPU核心数 |
内存指标:
| 指标 | 计算方式 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| 内存使用率 | used/total | >70% | >90% |
| Swap使用率 | used/total | >20% | >50% |
| 页面换入 | si | >0 | >100/s |
| 页面换出 | so | >0 | >100/s |
磁盘指标:
| 指标 | 计算方式 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| 磁盘使用率 | used/total | >70% | >90% |
| IO使用率 | %util | >70% | >90% |
| IO等待时间 | await | >10ms | >50ms |
| IO队列长度 | avgqu-sz | >1 | >5 |
网络指标:
| 指标 | 计算方式 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| 带宽使用率 | traffic/bandwidth | >70% | >90% |
| 网络错误 | errors | >0 | >10/s |
| 丢包率 | dropped/total | >0.1% | >1% |
| TCP连接数 | established | >5000 | >10000 |
12.2.2 应用层指标
Web服务指标:
| 指标 | 说明 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| QPS | 每秒请求数 | 根据基线 | 根据基线 |
| 响应时间P99 | 99分位延迟 | >500ms | >2s |
| 错误率 | 5xx比例 | >1% | >5% |
| 并发数 | 活跃连接 | >500 | >1000 |
数据库指标:
| 指标 | 说明 | 警告阈值 | 严重阈值 |
|---|---|---|---|
| 查询延迟 | 平均查询时间 | >100ms | >500ms |
| 慢查询数 | 每秒慢查询 | >10 | >50 |
| 连接数 | 活跃连接 | >80%最大 | >95%最大 |
| 缓存命中率 | 缓存效率 | <80% | <50% |
12.2.3 业务层指标
| 指标 | 说明 | 监控方式 |
|---|---|---|
| 订单量 | 每分钟/小时订单数 | 业务系统 |
| 用户活跃度 | DAU/MAU | 业务系统 |
| 转化率 | 转化漏斗 | 业务系统 |
| 收入 | 交易金额 | 业务系统 |
12.3 告警设计
12.3.1 告警原则
好的告警:
- 可操作:收到告警后能立即采取行动
- 及时:在问题影响用户前发现
- 准确:减少误报和漏报
- 分级:根据严重程度分级
避免的告警:
- 无法操作的告警
- 频繁的误报
- 过于敏感的告警
- 缺少上下文的告警
12.3.2 告警分级
| 级别 | 含义 | 响应时间 | 通知方式 |
|---|---|---|---|
| P0 - Critical | 服务不可用 | 5分钟 | 电话 + 短信 + 邮件 |
| P1 - High | 服务降级 | 15分钟 | 短信 + 邮件 |
| P2 - Medium | 潜在问题 | 1小时 | 邮件 + 即时通讯 |
| P3 - Low | 需要关注 | 下个工作日 | 邮件 |
12.3.3 告警规则示例
系统告警:
# Prometheus告警规则
groups:
- name: system_alerts
rules:
# CPU告警
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU使用率过高"
description: "实例 {{ $labels.instance }} CPU使用率超过80%,当前值 {{ $value }}%"
# 内存告警
- alert: HighMemoryUsage
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "内存使用率过高"
description: "实例 {{ $labels.instance }} 内存使用率超过85%,当前值 {{ $value }}%"
# 磁盘告警
- alert: HighDiskUsage
expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "磁盘使用率过高"
description: "实例 {{ $labels.instance }} 磁盘使用率超过85%,当前值 {{ $value }}%"
# 负载告警
- alert: HighLoadAverage
expr: node_load1 > count by(instance) (node_cpu_seconds_total{mode="idle"}) * 2
for: 5m
labels:
severity: warning
annotations:
summary: "系统负载过高"
description: "实例 {{ $labels.instance }} 负载超过CPU核心数的2倍"
应用告警:
groups:
- name: application_alerts
rules:
# 响应时间告警
- alert: HighResponseTime
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "响应时间过长"
description: "P99响应时间超过1秒"
# 错误率告警
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "错误率过高"
description: "5xx错误率超过5%"
12.3.4 告警抑制和静默
告警抑制:
# Alertmanager配置
inhibit_rules:
# 如果有Critical告警,抑制同实例的Warning告警
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['instance']
告警静默:
# 维护期间静默告警
# 通过Alertmanager Web UI设置静默
# 或通过API
curl -X POST http://alertmanager:9093/api/v2/silences -d '{
"matchers": [{"name": "instance", "value": "server1"}],
"startsAt": "2026-05-10T22:00:00Z",
"endsAt": "2026-05-11T06:00:00Z",
"createdBy": "admin",
"comment": "计划维护"
}'
12.4 监控系统架构
12.4.1 小型团队方案
架构:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Server │───>│ Glances │───>│ Web UI │
│ Agent │ │ Server │ │ Browser │
└─────────────┘ └─────────────┘ └─────────────┘
工具选择:
- 系统监控:Glances
- 网络监控:iftop + vnstat
- 日志管理:journalctl + logrotate
部署示例:
# 安装Glances
pip install 'glances[web]'
# 启动Web模式
glances -w --bind 0.0.0.0 -p 61208
# 访问
# http://server_ip:61208
12.4.2 中型团队方案
架构:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Server 1 │───>│ │ │ │
├─────────────┤ │ Prometheus │───>│ Grafana │
│ Server 2 │───>│ │ │ │
├─────────────┤ └─────────────┘ └─────────────┘
│ Server 3 │───> │
└─────────────┘ ┌───────┴───────┐
│ Alertmanager │
└───────────────┘
工具选择:
- 指标收集:Prometheus + Node Exporter
- 可视化:Grafana
- 告警:Alertmanager
- 日志:Loki
部署示例:
# docker-compose-monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
alertmanager:
image: prom/alertmanager:latest
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
volumes:
prometheus_data:
grafana_data:
12.4.3 大型团队方案
架构:
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
├─────────────┬─────────────┬─────────────┬──────────────────┤
│ App Pod 1 │ App Pod 2 │ App Pod 3 │ ... │
└──────┬──────┴──────┬──────┴──────┬──────┴──────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Prometheus + Thanos/Cortex │
│ (Long-term storage & Global view) │
└─────────────────────────────────────────────────────────────┘
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐
│ Grafana │ │Alertmanager │ │ Loki (Logs) │
│ (Dashboard) │ │ (Alerts) │ │ (Log aggregation) │
└─────────────┘ └─────────────┘ └─────────────────────┘
工具选择:
- 指标收集:Prometheus + Thanos/Cortex
- 可视化:Grafana
- 告警:Alertmanager + PagerDuty
- 日志:Loki + Promtail
- 追踪:Jaeger/Zipkin
12.5 监控脚本库
12.5.1 系统健康检查脚本
#!/bin/bash
# health_check.sh - 系统健康检查脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo "=== 系统健康检查 ==="
echo "时间: $(date)"
echo "主机: $(hostname)"
echo ""
# CPU检查
echo "--- CPU ---"
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
CPU_INT=${CPU_USAGE%.*}
if [ $CPU_INT -gt 90 ]; then
echo -e "${RED}CPU使用率: ${CPU_USAGE}% (严重)${NC}"
elif [ $CPU_INT -gt 70 ]; then
echo -e "${YELLOW}CPU使用率: ${CPU_USAGE}% (警告)${NC}"
else
echo -e "${GREEN}CPU使用率: ${CPU_USAGE}% (正常)${NC}"
fi
# 内存检查
echo "--- 内存 ---"
MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')
MEM_USED=$(free -m | awk 'NR==2{print $3}')
MEM_PERCENT=$((MEM_USED * 100 / MEM_TOTAL))
if [ $MEM_PERCENT -gt 90 ]; then
echo -e "${RED}内存使用率: ${MEM_PERCENT}% (严重)${NC}"
elif [ $MEM_PERCENT -gt 70 ]; then
echo -e "${YELLOW}内存使用率: ${MEM_PERCENT}% (警告)${NC}"
else
echo -e "${GREEN}内存使用率: ${MEM_PERCENT}% (正常)${NC}"
fi
# 磁盘检查
echo "--- 磁盘 ---"
df -h | awk 'NR>1 {
gsub(/%/, "", $5)
if ($5 > 90) printf "\033[0;31m%s: %s%% (严重)\033[0m\n", $6, $5
else if ($5 > 70) printf "\033[1;33m%s: %s%% (警告)\033[0m\n", $6, $5
else printf "\033[0;32m%s: %s%% (正常)\033[0m\n", $6, $5
}'
# 负载检查
echo "--- 负载 ---"
LOAD=$(cat /proc/loadavg | awk '{print $1}')
CORES=$(nproc)
LOAD_INT=${LOAD%.*}
if [ $LOAD_INT -gt $((CORES * 2)) ]; then
echo -e "${RED}负载: ${LOAD} (严重,CPU核心数: ${CORES})${NC}"
elif [ $LOAD_INT -gt $CORES ]; then
echo -e "${YELLOW}负载: ${LOAD} (警告,CPU核心数: ${CORES})${NC}"
else
echo -e "${GREEN}负载: ${LOAD} (正常,CPU核心数: ${CORES})${NC}"
fi
# Swap检查
echo "--- Swap ---"
SWAP_TOTAL=$(free -m | awk 'NR==3{print $2}')
SWAP_USED=$(free -m | awk 'NR==3{print $3}')
if [ $SWAP_TOTAL -gt 0 ]; then
SWAP_PERCENT=$((SWAP_USED * 100 / SWAP_TOTAL))
if [ $SWAP_PERCENT -gt 50 ]; then
echo -e "${RED}Swap使用率: ${SWAP_PERCENT}% (严重)${NC}"
elif [ $SWAP_PERCENT -gt 20 ]; then
echo -e "${YELLOW}Swap使用率: ${SWAP_PERCENT}% (警告)${NC}"
else
echo -e "${GREEN}Swap使用率: ${SWAP_PERCENT}% (正常)${NC}"
fi
else
echo -e "${GREEN}Swap: 未启用${NC}"
fi
echo ""
echo "=== 检查完成 ==="
12.5.2 性能数据采集脚本
#!/bin/bash
# perf_collect.sh - 性能数据采集脚本
LOG_DIR="/var/log/performance"
mkdir -p $LOG_DIR
INTERVAL=${1:-60} # 默认60秒
DURATION=${2:-3600} # 默认1小时
LOG_FILE="$LOG_DIR/perf_$(date +%Y%m%d_%H%M%S).csv"
echo "开始性能数据采集..."
echo "间隔: ${INTERVAL}秒"
echo "持续: ${DURATION}秒"
echo "输出: $LOG_FILE"
# CSV头
echo "timestamp,cpu_user,cpu_system,cpu_idle,mem_used,mem_free,swap_used,disk_read,disk_write,net_rx,net_tx" > $LOG_FILE
END_TIME=$(($(date +%s) + DURATION))
while [ $(date +%s) -lt $END_TIME ]; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# CPU
CPU=$(mpstat 1 1 | tail -1)
CPU_USER=$(echo $CPU | awk '{print $3}')
CPU_SYSTEM=$(echo $CPU | awk '{print $5}')
CPU_IDLE=$(echo $CPU | awk '{print $12}')
# 内存
MEM=$(free -m | awk 'NR==2{print $3,$4}')
MEM_USED=$(echo $MEM | awk '{print $1}')
MEM_FREE=$(echo $MEM | awk '{print $2}')
# Swap
SWAP_USED=$(free -m | awk 'NR==3{print $3}')
# 磁盘
DISK=$(iostat -d sda 1 1 | tail -1)
DISK_READ=$(echo $DISK | awk '{print $3}')
DISK_WRITE=$(echo $DISK | awk '{print $4}')
# 网络
NET=$(sar -n DEV 1 1 | grep "eth0" | tail -1)
NET_RX=$(echo $NET | awk '{print $5}')
NET_TX=$(echo $NET | awk '{print $6}')
echo "$TIMESTAMP,$CPU_USER,$CPU_SYSTEM,$CPU_IDLE,$MEM_USED,$MEM_FREE,$SWAP_USED,$DISK_READ,$DISK_WRITE,$NET_RX,$NET_TX" >> $LOG_FILE
sleep $INTERVAL
done
echo "采集完成: $LOG_FILE"
12.5.3 告警通知脚本
#!/bin/bash
# alert_notify.sh - 告警通知脚本
# 配置
WEBHOOK_URL="https://hooks.slack.com/services/xxx/yyy/zzz"
EMAIL="[email protected]"
ALERT_LOG="/var/log/alerts.log"
# 参数
LEVEL=$1 # critical, warning, info
SUBJECT=$2 # 告警主题
MESSAGE=$3 # 告警内容
# 记录日志
echo "$(date '+%Y-%m-%d %H:%M:%S') [$LEVEL] $SUBJECT: $MESSAGE" >> $ALERT_LOG
# 发送Slack通知
send_slack() {
local color
case $LEVEL in
critical) color="#FF0000" ;;
warning) color="#FFA500" ;;
*) color="#36A64F" ;;
esac
curl -X POST -H 'Content-type: application/json' \
--data "{
\"attachments\": [{
\"color\": \"$color\",
\"title\": \"[$LEVEL] $SUBJECT\",
\"text\": \"$MESSAGE\",
\"footer\": \"$(hostname)\",
\"ts\": $(date +%s)
}]
}" \
$WEBHOOK_URL
}
# 发送邮件通知
send_email() {
echo "$MESSAGE" | mail -s "[$LEVEL] $SUBJECT" $EMAIL
}
# 根据级别发送通知
case $LEVEL in
critical)
send_slack
send_email
;;
warning)
send_slack
;;
*)
send_slack
;;
esac
12.6 运维SOP
12.6.1 日常巡检SOP
每日巡检清单:
| 检查项 | 命令 | 正常标准 |
|---|---|---|
| 系统负载 | uptime | load < CPU核心数 |
| CPU使用率 | top -bn1 | <70% |
| 内存使用 | free -h | 使用率<80% |
| 磁盘使用 | df -h | 使用率<80% |
| 磁盘IO | iostat -x 1 | %util<70% |
| 网络连接 | ss -s | 无异常增长 |
| 服务状态 | systemctl status xxx | active (running) |
| 日志检查 | journalctl -p err --since today | 无严重错误 |
巡检脚本:
#!/bin/bash
# daily_check.sh - 每日巡检脚本
REPORT_FILE="/var/log/daily_check_$(date +%Y%m%d).txt"
{
echo "=== 每日巡检报告 ==="
echo "时间: $(date)"
echo "主机: $(hostname)"
echo ""
echo "1. 系统负载"
uptime
echo ""
echo "2. CPU使用率"
top -bn1 | head -5
echo ""
echo "3. 内存使用"
free -h
echo ""
echo "4. 磁盘使用"
df -h
echo ""
echo "5. 磁盘IO"
iostat -x 1 1
echo ""
echo "6. 网络连接"
ss -s
echo ""
echo "7. 服务状态"
systemctl list-units --state=failed
echo ""
echo "8. 最近错误日志"
journalctl -p err --since today --no-pager | tail -20
echo ""
echo "=== 巡检完成 ==="
} > $REPORT_FILE
echo "巡检报告: $REPORT_FILE"
12.6.2 故障处理SOP
故障响应流程:
1. 确认问题
├── 检查监控告警
├── 确认影响范围
└── 评估严重级别
2. 快速恢复
├── 重启服务
├── 切换备用
└── 回滚变更
3. 问题定位
├── 查看日志
├── 分析监控数据
└── 复现问题
4. 根因分析
├── 代码问题
├── 配置问题
└── 资源问题
5. 修复验证
├── 实施修复
├── 验证效果
└── 监控观察
6. 总结复盘
├── 记录故障
├── 分析原因
└── 改进措施
故障排查命令速查:
# CPU问题
top -o %CPU # 找CPU大户
pidstat -u 1 5 # 进程CPU统计
perf top # CPU性能分析
# 内存问题
top -o %MEM # 找内存大户
pmap -x <PID> # 进程内存映射
vmstat 1 5 # 内存统计
# 磁盘问题
iostat -x 1 5 # 磁盘IO统计
iotop -o # 找IO大户
lsof +D /path # 打开的文件
# 网络问题
iftop -i eth0 # 网络流量
ss -tuln # 监听端口
netstat -an | awk '{print $5}' | sort | uniq -c | sort -rn # 连接统计
12.6.3 容量规划SOP
容量规划步骤:
# 1. 收集历史数据
# 使用SAR收集30天数据
sar -u -f /var/log/sysstat/sa$(date +%d) > /tmp/cpu_history.txt
sar -r -f /var/log/sysstat/sa$(date +%d) > /tmp/mem_history.txt
sar -d -f /var/log/sysstat/sa$(date +%d) > /tmp/disk_history.txt
# 2. 分析趋势
# 使用Python分析
python3 << EOF
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('/tmp/cpu_history.txt', sep='\s+')
# 分析趋势
print(df.describe())
# 绘图
df.plot()
plt.savefig('/tmp/cpu_trend.png')
EOF
# 3. 预测未来需求
# 基于历史增长率预测
# CPU需求 = 当前使用 * (1 + 增长率)^月数
容量规划表格:
| 资源 | 当前使用 | 峰值使用 | 增长率 | 3个月后 | 6个月后 | 建议 |
|---|---|---|---|---|---|---|
| CPU | 40% | 70% | 5%/月 | 55% | 70% | 观察 |
| 内存 | 60% | 85% | 3%/月 | 69% | 78% | 观察 |
| 磁盘 | 50% | 60% | 10%/月 | 80% | 100% | 扩容 |
12.6.4 变更管理SOP
变更前检查:
# 1. 备份当前配置
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d)
# 2. 记录当前状态
systemctl status nginx > /tmp/nginx_before.txt
# 3. 测试新配置
nginx -t
# 4. 准备回滚方案
echo "回滚命令: cp /etc/nginx/nginx.conf.bak.$(date +%Y%m%d) /etc/nginx/nginx.conf && systemctl restart nginx"
变更后验证:
# 1. 检查服务状态
systemctl status nginx
# 2. 检查日志
journalctl -u nginx --since "5 minutes ago"
# 3. 测试功能
curl -I http://localhost
# 4. 监控指标
# 观察CPU、内存、响应时间是否有异常
12.7 监控数据管理
12.7.1 数据保留策略
| 数据类型 | 保留时间 | 存储方式 |
|---|---|---|
| 实时数据 | 24小时 | 内存/本地 |
| 分钟级数据 | 7天 | 本地磁盘 |
| 小时级数据 | 30天 | 本地磁盘 |
| 天级数据 | 1年 | 归档存储 |
| 月级数据 | 3年 | 归档存储 |
Prometheus数据保留:
# prometheus.yml
global:
scrape_interval: 15s
# 命令行参数
--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=50GB
SAR数据保留:
# /etc/sysstat/sysstat
HISTORY=28 # 保留28天
COMPRESSAFTER=10 # 10天后压缩
12.7.2 数据备份
#!/bin/bash
# backup_monitoring.sh - 监控数据备份脚本
BACKUP_DIR="/backup/monitoring"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# 备份Prometheus数据
tar czf $BACKUP_DIR/prometheus_$DATE.tar.gz /var/lib/prometheus/
# 备份Grafana数据
tar czf $BACKUP_DIR/grafana_$DATE.tar.gz /var/lib/grafana/
# 备份SAR数据
tar czf $BACKUP_DIR/sar_$DATE.tar.gz /var/log/sysstat/
# 备份配置文件
tar czf $BACKUP_DIR/config_$DATE.tar.gz /etc/prometheus/ /etc/grafana/
# 清理30天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
echo "备份完成: $BACKUP_DIR"
12.7.3 数据清理
#!/bin/bash
# cleanup_monitoring.sh - 监控数据清理脚本
# 清理旧的SAR数据
find /var/log/sysstat/ -name "sa*" -mtime +30 -delete
find /var/log/sysstat/ -name "sar*" -mtime +30 -delete
# 清理旧的nmon数据
find /var/log/nmon/ -name "*.nmon" -mtime +30 -delete
# 清理旧的性能日志
find /var/log/performance/ -name "*.csv" -mtime +30 -delete
# 清理旧的监控日志
find /var/log/ -name "monitoring_*.log" -mtime +30 -delete
echo "清理完成"
12.8 安全考虑
12.8.1 监控系统安全
访问控制:
# 限制Prometheus访问
# 使用反向代理 + 认证
server {
listen 80;
server_name prometheus.example.com;
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://localhost:9090;
}
}
网络安全:
# 防火墙规则
iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 9090 -j DROP
数据加密:
# TLS配置
tls_server_config:
cert_file: /etc/prometheus/tls/cert.pem
key_file: /etc/prometheus/tls/key.pem
12.8.2 敏感信息处理
避免监控敏感数据:
# 不要监控包含密码的环境变量
# 不要监控包含密钥的配置文件
# 不要监控包含个人信息的日志
数据脱敏:
# 日志脱敏示例
import re
def mask_sensitive(text):
# 手机号
text = re.sub(r'1[3-9]\d{9}', '1**********', text)
# 身份证号
text = re.sub(r'\d{17}[\dXx]', '*******************', text)
# 邮箱
text = re.sub(r'[\w.]+@[\w.]+', '***@***.***', text)
return text
12.9 监控文化建设
12.9.1 监控意识
团队培训:
- 监控工具使用培训
- 告警响应流程培训
- 故障排查方法培训
文档建设:
- 监控系统架构文档
- 告警处理手册
- 故障排查手册
12.9.2 持续改进
定期回顾:
- 每周回顾告警情况
- 每月分析监控数据
- 每季度优化监控策略
指标优化:
# 分析告警统计
cat /var/log/alerts.log | awk '{print $3}' | sort | uniq -c | sort -rn
# 分析误报率
# 误报率 = 无需处理的告警 / 总告警数
12.10 扩展阅读
推荐书籍
- 《Site Reliability Engineering》- Google SRE团队
- 《The Site Reliability Workbook》- Google SRE团队
- 《Monitoring with Prometheus》- James Turnbull
- 《Systems Performance》- Brendan Gregg
在线资源
工具文档
12.11 本章小结
本章详细介绍了监控最佳实践:
监控策略:
- 四个黄金信号
- USE方法
- RED方法
指标体系:
- 系统层指标
- 应用层指标
- 业务层指标
告警设计:
- 告警原则
- 告警分级
- 告警规则
监控架构:
- 小型团队方案
- 中型团队方案
- 大型团队方案
运维SOP:
- 日常巡检
- 故障处理
- 容量规划
- 变更管理
数据管理:
- 数据保留策略
- 数据备份
- 数据清理
安全考虑:
- 访问控制
- 数据加密
- 敏感信息处理
监控是一个持续改进的过程,需要根据业务需求不断优化和完善。
上一章: 第11章:Docker容器监控 返回目录: 系统监控工具指南