Files
nxxmdata/docs/operations/监控运维文档.md
2025-09-19 23:46:15 +08:00

14 KiB
Raw Blame History

宁夏智慧养殖监管平台监控运维文档

版本历史

版本 日期 修改内容 修改人
v1.0 2025-01-19 初始版本 运维团队

1. 监控概述

1.1 监控目标

  • 确保系统7x24小时稳定运行
  • 及时发现和处理系统异常
  • 提供性能数据支持系统优化
  • 保障用户体验和业务连续性

1.2 监控范围

  • 基础设施监控: 服务器、网络、存储
  • 应用监控: 后端服务、前端应用、数据库
  • 业务监控: 关键业务指标、用户行为
  • 安全监控: 安全事件、异常访问

2. 监控架构

2.1 监控组件

graph TB
    A[应用服务] --> B[日志收集]
    A --> C[指标收集]
    B --> D[日志分析]
    C --> E[监控平台]
    D --> F[告警系统]
    E --> F
    F --> G[运维人员]

2.2 技术栈

  • 监控平台: Prometheus + Grafana
  • 日志收集: ELK Stack (Elasticsearch + Logstash + Kibana)
  • 告警系统: AlertManager + 钉钉/邮件
  • APM: Node.js 应用性能监控
  • 健康检查: 自定义健康检查接口

3. 基础设施监控

3.1 服务器监控

3.1.1 监控指标

  • CPU使用率: 平均负载、使用率分布
  • 内存使用: 内存使用率、可用内存
  • 磁盘空间: 磁盘使用率、I/O性能
  • 网络流量: 入站/出站流量、连接数

3.1.2 告警阈值

指标 警告阈值 严重阈值 处理方式
CPU使用率 70% 85% 自动扩容/人工介入
内存使用率 75% 90% 重启服务/扩容
磁盘使用率 80% 95% 清理日志/扩容
网络延迟 100ms 500ms 检查网络/切换节点

3.2 数据库监控

3.2.1 MySQL监控指标

  • 连接数: 当前连接数、最大连接数
  • 查询性能: 慢查询、QPS、TPS
  • 锁状态: 死锁、锁等待时间
  • 复制状态: 主从延迟、复制错误

3.2.2 监控配置

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

-- 监控连接数
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';

-- 监控查询性能
SHOW STATUS LIKE 'Questions';
SHOW STATUS LIKE 'Uptime';

4. 应用监控

4.1 后端服务监控

4.1.1 Node.js应用监控

// 健康检查接口
app.get('/health', (req, res) => {
  const healthCheck = {
    uptime: process.uptime(),
    message: 'OK',
    timestamp: Date.now(),
    memory: process.memoryUsage(),
    cpu: process.cpuUsage()
  };
  
  res.status(200).json(healthCheck);
});

// 性能监控中间件
const performanceMonitor = (req, res, next) => {
  const start = Date.now();
  
  res.on('finish', () => {
    const duration = Date.now() - start;
    console.log(`${req.method} ${req.path} - ${res.statusCode} - ${duration}ms`);
  });
  
  next();
};

4.1.2 关键指标

  • 响应时间: API接口响应时间分布
  • 错误率: HTTP错误状态码统计
  • 吞吐量: 每秒请求数(RPS)
  • 内存使用: 堆内存、非堆内存使用情况

4.2 前端应用监控

4.2.1 性能监控

// 页面加载性能监控
window.addEventListener('load', () => {
  const perfData = performance.getEntriesByType('navigation')[0];
  const loadTime = perfData.loadEventEnd - perfData.fetchStart;
  
  // 发送性能数据到监控系统
  sendMetrics({
    type: 'page_load',
    duration: loadTime,
    url: window.location.href
  });
});

// 错误监控
window.addEventListener('error', (event) => {
  sendError({
    message: event.error.message,
    stack: event.error.stack,
    url: window.location.href,
    timestamp: Date.now()
  });
});

4.2.2 用户体验监控

  • 页面加载时间: 首屏加载、完全加载时间
  • JavaScript错误: 运行时错误、资源加载错误
  • 用户行为: 页面访问量、用户停留时间
  • 浏览器兼容性: 不同浏览器的使用情况

5. 业务监控

5.1 关键业务指标

5.1.1 用户相关指标

  • 注册用户数: 日新增、月活跃用户
  • 登录成功率: 登录成功/失败比例
  • 用户留存率: 日留存、周留存、月留存

5.1.2 业务功能指标

  • 养殖场管理: 新增养殖场数量、更新频率
  • 监控数据: 数据上报成功率、数据完整性
  • 报表生成: 报表生成成功率、生成时间

5.2 业务告警规则

# 业务告警配置示例
alerts:
  - name: 登录失败率过高
    condition: login_failure_rate > 0.1
    duration: 5m
    severity: warning
    
  - name: 数据上报中断
    condition: data_upload_count == 0
    duration: 10m
    severity: critical
    
  - name: 报表生成失败
    condition: report_generation_failure_rate > 0.05
    duration: 3m
    severity: warning

6. 日志管理

6.1 日志分类

6.1.1 应用日志

  • 访问日志: HTTP请求记录
  • 错误日志: 应用异常和错误
  • 业务日志: 关键业务操作记录
  • 性能日志: 性能相关数据

6.1.2 系统日志

  • 系统日志: 操作系统级别日志
  • 数据库日志: 数据库操作和错误日志
  • 安全日志: 安全相关事件记录

6.2 日志格式规范

// 统一日志格式
const logFormat = {
  timestamp: '2025-01-19T10:30:00.000Z',
  level: 'INFO',
  service: 'backend-api',
  module: 'user-management',
  message: 'User login successful',
  userId: '12345',
  ip: '192.168.1.100',
  userAgent: 'Mozilla/5.0...',
  requestId: 'req-uuid-12345',
  duration: 150
};

6.3 日志收集配置

# Logstash配置示例
input {
  file {
    path => "/var/log/nxxmdata/*.log"
    start_position => "beginning"
    codec => json
  }
}

filter {
  if [level] == "ERROR" {
    mutate {
      add_tag => ["error"]
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "nxxmdata-logs-%{+YYYY.MM.dd}"
  }
}

7. 告警系统

7.1 告警级别

7.1.1 告警分级

  • P0 - 紧急: 系统完全不可用,需要立即处理
  • P1 - 严重: 核心功能异常,影响用户使用
  • P2 - 警告: 性能下降或非核心功能异常
  • P3 - 信息: 需要关注但不影响正常使用

7.1.2 告警通知方式

级别 通知方式 响应时间
P0 电话 + 短信 + 钉钉 5分钟内
P1 短信 + 钉钉 + 邮件 15分钟内
P2 钉钉 + 邮件 30分钟内
P3 邮件 2小时内

7.2 告警规则配置

# Prometheus告警规则
groups:
  - name: system.rules
    rules:
      - alert: HighCPUUsage
        expr: cpu_usage_percent > 85
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "CPU使用率过高"
          description: "服务器CPU使用率超过85%持续5分钟"
          
      - alert: DatabaseConnectionHigh
        expr: mysql_connections_current / mysql_connections_max > 0.8
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "数据库连接数过高"
          description: "数据库连接数超过最大连接数的80%"

8. 性能优化

8.1 性能监控指标

8.1.1 响应时间优化

  • API响应时间: 目标 < 200ms
  • 数据库查询时间: 目标 < 100ms
  • 页面加载时间: 目标 < 3s

8.1.2 并发性能

  • 最大并发用户数: 1000+
  • 数据库连接池: 合理配置连接数
  • 缓存命中率: 目标 > 90%

8.2 优化策略

// Redis缓存配置
const redis = require('redis');
const client = redis.createClient({
  host: 'localhost',
  port: 6379,
  retry_strategy: (options) => {
    if (options.error && options.error.code === 'ECONNREFUSED') {
      return new Error('Redis服务器拒绝连接');
    }
    if (options.total_retry_time > 1000 * 60 * 60) {
      return new Error('重试时间超时');
    }
    return Math.min(options.attempt * 100, 3000);
  }
});

// 数据库连接池配置
const pool = mysql.createPool({
  connectionLimit: 10,
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'nxxmdata',
  acquireTimeout: 60000,
  timeout: 60000
});

9. 故障处理

9.1 故障分类

9.1.1 常见故障类型

  • 服务不可用: 应用崩溃、服务器宕机
  • 性能问题: 响应慢、超时
  • 数据问题: 数据丢失、数据不一致
  • 安全问题: 攻击、数据泄露

9.1.2 故障处理流程

  1. 故障发现: 监控告警、用户反馈
  2. 故障确认: 验证故障范围和影响
  3. 应急处理: 快速恢复服务
  4. 根因分析: 分析故障原因
  5. 永久修复: 实施根本性解决方案
  6. 总结改进: 更新监控和预防措施

9.2 应急预案

9.2.1 服务不可用处理

# 检查服务状态
systemctl status nxxmdata-backend
systemctl status nginx
systemctl status mysql

# 重启服务
systemctl restart nxxmdata-backend
systemctl restart nginx

# 检查日志
tail -f /var/log/nxxmdata/error.log
tail -f /var/log/nginx/error.log

9.2.2 数据库故障处理

# 检查数据库状态
mysql -u root -p -e "SHOW PROCESSLIST;"
mysql -u root -p -e "SHOW ENGINE INNODB STATUS;"

# 检查磁盘空间
df -h
du -sh /var/lib/mysql/

# 数据库备份恢复
mysqldump -u root -p nxxmdata > backup.sql
mysql -u root -p nxxmdata < backup.sql

10. 运维自动化

10.1 自动化部署

10.1.1 CI/CD流程

# GitHub Actions配置
name: Deploy to Production
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '18'
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm test
      - name: Build application
        run: npm run build
      - name: Deploy to server
        run: |
          ssh user@server 'cd /app && git pull && npm install && pm2 restart all'

10.1.2 自动化脚本

#!/bin/bash
# 自动化部署脚本

set -e

echo "开始部署..."

# 备份当前版本
cp -r /app/current /app/backup/$(date +%Y%m%d_%H%M%S)

# 更新代码
cd /app/current
git pull origin main

# 安装依赖
npm install --production

# 构建应用
npm run build

# 重启服务
pm2 restart all

# 健康检查
sleep 10
curl -f http://localhost:3000/health || exit 1

echo "部署完成!"

10.2 自动化监控

10.2.1 健康检查脚本

#!/bin/bash
# 系统健康检查脚本

# 检查服务状态
services=("nxxmdata-backend" "nginx" "mysql")
for service in "${services[@]}"; do
  if ! systemctl is-active --quiet $service; then
    echo "警告: $service 服务未运行"
    systemctl restart $service
  fi
done

# 检查磁盘空间
disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $disk_usage -gt 80 ]; then
  echo "警告: 磁盘使用率超过80%"
  # 清理日志文件
  find /var/log -name "*.log" -mtime +7 -delete
fi

# 检查内存使用
memory_usage=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
if [ $memory_usage -gt 85 ]; then
  echo "警告: 内存使用率超过85%"
fi

11. 备份与恢复

11.1 备份策略

11.1.1 数据备份

  • 全量备份: 每日凌晨2点执行
  • 增量备份: 每4小时执行一次
  • 备份保留: 本地保留7天远程保留30天

11.1.2 备份脚本

#!/bin/bash
# 数据库备份脚本

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mysql"
DB_NAME="nxxmdata"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
mysqldump -u root -p$MYSQL_PASSWORD \
  --single-transaction \
  --routines \
  --triggers \
  $DB_NAME > $BACKUP_DIR/nxxmdata_$DATE.sql

# 压缩备份文件
gzip $BACKUP_DIR/nxxmdata_$DATE.sql

# 上传到云存储
aws s3 cp $BACKUP_DIR/nxxmdata_$DATE.sql.gz s3://nxxmdata-backup/

# 清理本地旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

echo "备份完成: nxxmdata_$DATE.sql.gz"

11.2 恢复流程

11.2.1 数据库恢复

# 停止应用服务
systemctl stop nxxmdata-backend

# 恢复数据库
gunzip -c backup_file.sql.gz | mysql -u root -p nxxmdata

# 验证数据完整性
mysql -u root -p -e "SELECT COUNT(*) FROM nxxmdata.users;"

# 重启服务
systemctl start nxxmdata-backend

12. 安全运维

12.1 安全监控

12.1.1 安全事件监控

  • 异常登录: 异地登录、暴力破解
  • SQL注入: 恶意SQL查询检测
  • XSS攻击: 跨站脚本攻击检测
  • 文件上传: 恶意文件上传检测

12.1.2 安全日志分析

# 分析访问日志中的异常请求
awk '$9 >= 400 {print $1, $7, $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

# 检查失败的登录尝试
grep "authentication failure" /var/log/auth.log

# 监控文件系统变化
find /app -type f -mtime -1 -ls

12.2 安全加固

12.2.1 系统安全配置

# 防火墙配置
ufw enable
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp

# SSH安全配置
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd

# 自动安全更新
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

13. 联系方式

13.1 运维团队

13.2 紧急联系

  • 24小时值班电话: 400-xxx-xxxx
  • 紧急邮箱: emergency@nxxmdata.com
  • 钉钉群: 宁夏智慧养殖运维群

文档维护: 本文档将根据系统运维情况定期更新 最后更新: 2025-01-19