📊 第28课:监控与告警

阶段五:自动化第4/6课

一、监控体系

应用 → 采集Agent → 监控服务器 → 告警 → 通知
  │                        │
  └── 指标存储 ←──────────┘
       │
       └── 可视化(Grafana)

二、Prometheus + Grafana

# 安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xzf prometheus-*.tar.gz
cd prometheus-*/

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

# 启动
./prometheus --config.file=prometheus.yml

# 安装Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
# 解压后运行 ./node_exporter

# 安装Grafana
sudo apt install grafana
sudo systemctl enable --now grafana-server
# 访问 http://localhost:3000 (admin/admin)

三、告警配置

# alert_rules.yml
groups:
  - name: system
    rules:
      - alert: HighCPU
        expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU使用率超过80%"

      - alert: DiskFull
        expr: node_filesystem_avail_bytes / node_filesystem_size_bytes * 100 < 10
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "磁盘剩余不足10%"

      - alert: MemoryLow
        expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
        for: 5m
        labels:
          severity: warning

四、自定义监控脚本

#!/bin/bash
# custom-metrics.sh - 推送自定义指标到Pushgateway

PUSHGATEWAY="http://localhost:9091"
JOB="custom_check"

# 检查Web服务
if curl -s -o /dev/null -w '%{http_code}' http://localhost:80 | grep -q 200; then
    echo "web_status 1" | curl -s --data-binary @- "$PUSHGATEWAY/metrics/job/$JOB/instance/$(hostname)"
else
    echo "web_status 0" | curl -s --data-binary @- "$PUSHGATEWAY/metrics/job/$JOB/instance/$(hostname)"
fi

五、练习

📝 监控部署

# 1. 检查已安装的监控工具
which prometheus grafana-server node_exporter 2>/dev/null

# 2. 检查系统指标
cat /proc/loadavg
free -h
df -h
🏆

成就解锁:监控工程师

✅ 理解监控体系

✅ 掌握Prometheus+Grafana

✅ 学会告警配置

✅ 了解自定义监控

附录:监控与告警学习资源

推荐书籍

书名作者重点
Linux命令行与Shell脚本编程大全BlumShell脚本全面覆盖
UNIX/Linux系统管理技术手册Nemeth系统管理圣经
Ansible: Up and RunningLintnerAnsible实战
鸟哥的Linux私房菜鸟哥中文经典入门

在线资源

认证路径

认证机构级别
LFCSLinux Foundation基础系统管理
LFCELinux Foundation高级系统工程师
RHCSARed HatRed Hat管理员
RHCERed HatRed Hat工程师
CKA/CKADCNCFKubernetes管理员/开发者

实践环境

常用速查表

# 文本处理速查
grep -E 'pattern' file     # 扩展正则搜索
sed -i 's/old/new/g' file  # 替换
awk '{print $1}' file     # 提取列
sort | uniq -c | sort -rn   # 频次统计
cut -d: -f1 file            # 切列
tr 'A-Z' 'a-z'             # 转小写

# 系统管理速查
systemctl status/start/stop/restart service
journalctl -u service -f    # 跟踪日志
df -h / du -sh *            # 磁盘使用
ps aux --sort=-%mem         # 内存排序
ss -tlnp                    # 监听端口
iptables -L -n              # 防火墙规则
crontab -e                  # 编辑定时任务
useradd -m -s /bin/bash user # 创建用户

# 网络诊断速查
ip addr / ip route          # 网络配置
ping / traceroute           # 连通测试
dig / nslookup              # DNS查询
curl -I url                 # HTTP头检查
nc -zv host port            # 端口测试
tcpdump -i eth0 port 80     # 抓包

六、实机验证记录

$ cat /proc/loadavg
0.46 0.63 0.61 1/419 617851
$ free -h | grep Mem
Mem:           7.5Gi       2.3Gi       1.2Gi        49Mi       4.4Gi       5.2Gi
$ df -h / | tail -1
/dev/vda2        79G   29G   47G  39% /

八、告警集成

# Slack告警
alert_slack() {
    local msg="$1"
    curl -s -X POST "$WEBHOOK" \
        -H 'Content-type: application/json' \
        -d "{"text":"[$(hostname)] $msg"}"
}

# 告警规则设计原则:
# 1. 可操作 - 收到告警后知道该做什么
# 2. 分级 - P0/P1/P2/P3
# 3. 避免疲劳 - 合理阈值+持续时间
# 4. 升级 - 超时自动升级
# 5. 静默 - 维护期间静默非关键告警

# 常用监控指标
# CPU > 80% 持续5分钟 → P1
# 磁盘 > 90% → P1
# 内存可用 < 10% → P1
# 服务down → P0
# 响应时间 > 2s → P2

专题:可观测性体系建设

在实际生产环境中,可观测性体系建设是系统管理员必须深入掌握的核心能力。本节将探讨常见场景、最佳实践和避坑指南。

常见问题与解决方案

问题1:脚本在生产环境运行异常

开发环境和生产环境的差异是脚本出错的常见原因。建议:

问题2:性能不达预期

优化策略:

问题3:可维护性差

改善方法:

最佳实践总结

#!/bin/bash
# 可观测性体系建设最佳实践模板
set -euo pipefail

# 1. 参数校验
[[ $# -lt 1 ]] && echo "Usage: $0 <arg>" >&2 && exit 1

# 2. 环境检查
require_cmd() {
    command -v "$1" >/dev/null || { echo "需要: $1" >&2; exit 1; }
}

# 3. 清理机制
TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

# 4. 日志记录
log() { echo "[$(date +%T)] $*"; }
err() { log "ERROR: $*" >&2; exit 1; }

# 5. 主逻辑
main() {
    log "开始处理: $1"
    # 业务逻辑
    log "处理完成"
}

main "$@"

进阶方向

延伸阅读:实用命令速查

# 文件操作
ls -la                    # 详细列表
find / -name "*.conf" 2>/dev/null  # 查找文件
ln -s target link         # 符号链接
du -sh * | sort -rh       # 目录大小排序

# 文本处理
grep -rn "pattern" dir/   # 递归搜索
sed -i.bak 's/old/new/g' f  # 备份替换
awk -F: '{print $1}' file  # 提取列
sort file | uniq -c        # 去重计数

# 系统管理
systemctl status/start/stop/restart service
journalctl -u service -f  # 实时日志
ps aux --sort=-%mem        # 内存排序
ss -tlnp                   # 监听端口
crontab -e                 # 定时任务

# 网络诊断
ip addr/route/show         # 网络配置
ping/traceroute            # 连通测试
dig/nslookup               # DNS查询
curl -I url                # HTTP检查
nc -zv host port           # 端口测试

# 磁盘管理
df -h                      # 磁盘使用
fdisk -l                   # 分区信息
mkfs.ext4 /dev/sdb1        # 格式化
mount /dev/sdb1 /mnt       # 挂载
blkid                      # UUID查看

总结

本章内容是Linux系统管理课程的重要组成部分。掌握这些知识需要大量的实践操作,建议在虚拟机或云服务器上反复练习。记住:纸上得来终觉浅,绝知此事要躬行。

在实际工作中,遇到问题时:

  1. 先看日志(journalctl/dmesg/var/log)
  2. 再查文档(man/info/--help)
  3. 然后搜索(Google/Stack Overflow)
  4. 最后实验(在测试环境验证)

常见问题FAQ

Q: 如何快速上手?

A: 从简单的Ad-hoc命令开始,逐步编写Playbook,最后组织为Role。在实践中学习最有效。

Q: 生产环境部署要注意什么?

A: 1)先在staging验证 2)使用--check预演 3)确保有回滚方案 4)监控部署后状态

Q: 如何处理部署失败?

A: 1)查看ansible日志定位失败任务 2)手动修复或回滚 3)修复Playbook 4)重新执行

Q: 如何保证幂等性?

A: 使用声明式模块(apt/yum/service/file)而非命令式(command/shell)。

Q: 如何管理敏感信息?

A: 使用Ansible Vault加密变量文件,密钥与代码分离存储。

关键概念速记

# 核心概念对照表
声明式 vs 命令式:
  声明式: 描述"要什么" → apt: name=nginx state=present
  命令式: 描述"做什么" → command: apt install nginx

幂等性: 同一操作执行多次,结果一致
  apt: name=nginx state=present  # 已安装则不操作
  command: apt install nginx     # 可能重复安装

收敛: 使系统达到期望状态的过程
  检测当前状态 → 计算差异 → 执行变更 → 验证结果

不可变基础设施:
  不修改运行中的系统,而是重建
  容器/AMI/镜像方式部署