Skip to content

MySQL 告警通知方式

通知渠道比较

1. 常见通知渠道

渠道实时性可靠性适用场景配置复杂度成本
邮件所有级别告警
短信P0/P1 级别告警
电话极高P0 级别告警
即时通讯P0/P1/P2 级别告警
监控平台实时所有级别告警
移动应用所有级别告警

2. 通知渠道特性

邮件通知

  • 优点
    • 成本低,几乎免费
    • 可包含详细信息和附件
    • 可长期保存和归档
    • 支持批量发送
  • 缺点
    • 实时性较差,可能延迟
    • 可能被邮件过滤器拦截
    • 紧急情况下可能被忽略

短信通知

  • 优点
    • 实时性高,几乎即时送达
    • 携带方便,随时随地接收
    • 简洁明了,重点突出
  • 缺点
    • 有字数限制(通常 70 字)
    • 成本较高,按条收费
    • 无法包含详细信息

电话通知

  • 优点
    • 实时性极高,强制接听
    • 适用于最紧急的情况
    • 可直接沟通处理方案
  • 缺点
    • 成本最高
    • 可能打扰正常工作
    • 只能一对一通知

即时通讯通知

  • 优点
    • 实时性高,即时送达
    • 支持群组通知
    • 可包含图片和文件
    • 成本低
  • 缺点
    • 可能被其他消息淹没
    • 依赖网络连接
    • 可能在非工作时间被忽略

通知渠道配置

1. 邮件通知配置

系统邮件配置

bash
# 安装邮件服务(Ubuntu/Debian)
sudo apt update
sudo apt install postfix mailutils

# 配置 postfix(选择 "Internet Site")
sudo dpkg-reconfigure postfix

# 测试邮件发送
echo "测试邮件内容" | mail -s "测试邮件" admin@example.com

MySQL 告警邮件配置

bash
# 在监控脚本中配置邮件发送
ADMIN_EMAIL="admin@example.com"

# 发送告警邮件
echo "MySQL 告警:服务器 $HOST 连接数过高,请及时处理!" | mail -s "[紧急] MySQL 连接数告警" $ADMIN_EMAIL

Prometheus Alertmanager 邮件配置

yaml
# alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'password'
  smtp_require_tls: true

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'team-email'

receivers:
- name: 'team-email'
  email_configs:
  - to: 'team@example.com'
    send_resolved: true
    html: |
      <h3>MySQL 告警</h3>
      <p>告警名称: { { .CommonLabels.alertname } }</p>
      <p>服务器: { { .CommonLabels.instance } }</p>
      <p>状态: { { .Status } }</p>
      <p>告警详情:</p>
      <pre>{ { .CommonAnnotations.description } }</pre>
      <p>触发时间: { { .StartsAt.Format "2006-01-02 15:04:05" } }</p>

2. 短信通知配置

使用云服务 API

bash
#!/bin/bash
# sms_notification.sh

# 配置信息
API_KEY="your_api_key"
API_URL="https://api.sms-service.com/send"
PHONE_NUMBERS="13800138000,13900139000"

# 发送短信函数
send_sms() {
    local message="$1"
    local phone="$2"
    
    curl -X POST $API_URL \
         -H "Content-Type: application/json" \
         -d "{\n            \"api_key\": \"$API_KEY\",\n            \"phone\": \"$phone\",\n            \"message\": \"$message\"\n          }"
}

# 发送告警短信
ALERT_MESSAGE="[紧急] MySQL 服务器故障,请立即处理!"

for phone in $(echo $PHONE_NUMBERS | tr "," "\n"); do
    send_sms "$ALERT_MESSAGE" "$phone"
done

Zabbix 短信集成

  1. 安装短信网关

    bash
    # 安装 Gammu 短信网关
    sudo apt install gammu-smsd
  2. 配置 Gammu

    bash
    # /etc/gammu-smsdrc
    [gammu]
    port = /dev/ttyUSB0
    model = AT
    connection = at
    
    [smsd]
    service = files
    logfile = /var/log/gammu-smsd.log
    inboxpath = /var/spool/gammu/inbox/
    outboxpath = /var/spool/gammu/outbox/
    sentsmspath = /var/spool/gammu/sent/
    errorsmspath = /var/spool/gammu/error/
  3. 配置 Zabbix 告警媒介

    • 管理 → 报警媒介类型 → 创建媒体类型
    • 名称:SMS
    • 类型:脚本
    • 脚本名称:sms.sh
  4. 创建短信脚本

    bash
    # /usr/lib/zabbix/alertscripts/sms.sh
    #!/bin/bash
    PHONE=$1
    SUBJECT=$2
    MESSAGE=$3
    
    echo "$MESSAGE" > /var/spool/gammu/outbox/$(date +%s).out
    echo "To = $PHONE" >> /var/spool/gammu/outbox/$(date +%s).out

3. 电话通知配置

使用语音通知服务

bash
#!/bin/bash
# voice_notification.sh

# 配置信息
API_KEY="your_api_key"
API_URL="https://api.voice-service.com/call"
PHONE_NUMBERS="13800138000,13900139000"

# 发送电话通知函数
send_voice_call() {
    local message="$1"
    local phone="$2"
    
    curl -X POST $API_URL \
         -H "Content-Type: application/json" \
         -d "{\n            \"api_key\": \"$API_KEY\",\n            \"phone\": \"$phone\",\n            \"message\": \"$message\"\n          }"
}

# 发送告警电话
ALERT_MESSAGE="紧急通知,MySQL 服务器发生严重故障,请立即处理"

for phone in $(echo $PHONE_NUMBERS | tr "," "\n"); do
    send_voice_call "$ALERT_MESSAGE" "$phone"
done

4. 即时通讯通知配置

Slack 集成

bash
#!/bin/bash
# slack_notification.sh

# 配置信息
WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
CHANNEL="#mysql-alerts"
USERNAME="MySQL Monitor"

# 发送 Slack 通知函数
send_slack_notification() {
    local message="$1"
    local severity="$2"
    
    # 根据严重程度设置颜色
    case $severity in
        "critical") color="#FF0000" ;;
        "warning") color="#FFA500" ;;
        "info") color="#008000" ;;
        *) color="#808080" ;;
    esac
    
    curl -X POST $WEBHOOK_URL \
         -H "Content-Type: application/json" \
         -d "{\n            \"channel\": \"$CHANNEL\",\n            \"username\": \"$USERNAME\",\n            \"attachments\": [\n                {\n                    \"color\": \"$color\",\n                    \"title\": \"MySQL 告警\",\n                    \"text\": \"$message\",\n                    \"ts\": \"$(date +%s)\"\n                }\n            ]\n          }"
}

# 发送告警通知
alert_message="服务器 db-server-01 MySQL 连接数达到 95%,请及时处理"
send_slack_notification "$alert_message" "warning"

企业微信集成

bash
#!/bin/bash
# wechat_notification.sh

# 配置信息
CORP_ID="your_corp_id"
APP_SECRET="your_app_secret"
AGENT_ID="your_agent_id"
TO_USER="@all"

# 获取访问令牌
get_token() {
    local response=$(curl -s "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CORP_ID&corpsecret=$APP_SECRET")
    echo $response | grep -oP '"access_token":"\K[^"]+'
}

# 发送企业微信通知
send_wechat_notification() {
    local message="$1"
    local token=$(get_token)
    
    curl -X POST "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$token" \
         -H "Content-Type: application/json" \
         -d "{\n            \"touser\": \"$TO_USER\",\n            \"msgtype\": \"text\",\n            \"agentid\": $AGENT_ID,\n            \"text\": {\n                \"content\": \"$message\"\n            },\n            \"safe\": 0\n          }"
}

# 发送告警通知
alert_message="【紧急】MySQL 服务器故障\n服务器:db-server-01\n时间:$(date '+%Y-%m-%d %H:%M:%S')\n详情:复制中断,请立即处理"
send_wechat_notification "$alert_message"

钉钉集成

bash
#!/bin/bash
# dingtalk_notification.sh

# 配置信息
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=your_token"
SECRET="your_secret"

# 计算签名
get_signature() {
    local timestamp=$(date +%s)
    local string="$timestamp\n$SECRET"
    local signature=$(echo -n "$string" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64)
    echo "timestamp=$timestamp&sign=$signature"
}

# 发送钉钉通知
send_dingtalk_notification() {
    local message="$1"
    local sign=$(get_signature)
    
    curl -X POST "$WEBHOOK_URL&$sign" \
         -H "Content-Type: application/json" \
         -d "{\n            \"msgtype\": \"markdown\",\n            \"markdown\": {\n                \"title\": \"MySQL 告警\",\n                \"text\": \"$message\"\n            }\n          }"
}

# 发送告警通知
alert_message="### MySQL 告警\n> **服务器**:db-server-01\n> **时间**:$(date '+%Y-%m-%d %H:%M:%S')\n> **级别**:紧急\n> **详情**:磁盘空间不足,请立即处理\n> **状态**:<font color=\"#FF0000\">触发</font>"
send_dingtalk_notification "$alert_message"

告警通知策略

1. 分级通知策略

告警级别通知渠道通知频率升级机制
P0 紧急邮件 + 短信 + 电话 + 即时通讯立即发送,5分钟未确认重复15分钟未处理升级到上级
P1 严重邮件 + 短信 + 即时通讯立即发送,15分钟未确认重复30分钟未处理升级到上级
P2 警告邮件 + 即时通讯立即发送,4小时未确认重复8小时未处理升级到上级
P3 提示邮件立即发送,24小时未确认重复48小时未处理升级到上级

2. 通知内容规范

邮件通知内容

主题:[紧急] MySQL 连接数告警 - db-server-01

内容:
尊敬的数据库管理员:

您负责的 MySQL 服务器出现紧急告警,请及时处理:

告警级别:紧急 (P0)
告警时间:2024-01-01 12:00:00
服务器地址:db-server-01 (192.168.1.100)
告警内容:连接数达到 98%,已接近最大连接数限制
当前值:196/200
历史趋势:过去 30 分钟连接数持续上升

建议处理:
1. 检查是否有异常连接
2. 考虑增加 max_connections 参数
3. 优化应用程序连接池配置

请在 5 分钟内确认处理,如有问题请联系值班负责人。

--
MySQL 监控系统

短信通知内容

【紧急】MySQL 服务器 db-server-01 连接数达到 98%,请立即处理!

即时通讯通知内容

markdown
🚨 **MySQL 紧急告警** 🚨

**服务器**: db-server-01
**时间**: 2024-01-01 12:00:00
**级别**: 紧急 (P0)
**内容**: 连接数达到 98%,已接近最大连接数限制
**当前值**: 196/200

**建议**: 检查异常连接,优化连接池配置

请立即处理并在群内回复确认!

3. 通知时间策略

工作时间通知

  • 工作时间:9:00 - 18:00
  • 通知方式:所有渠道正常使用
  • 响应要求:P0/P1 级告警 15 分钟内响应

非工作时间通知

  • 非工作时间:18:00 - 9:00,周末和节假日
  • 通知方式
    • P0 级:电话 + 短信 + 即时通讯
    • P1 级:短信 + 即时通讯
    • P2/P3 级:延迟到工作时间
  • 响应要求:P0 级告警 5 分钟内响应

告警通知集成

1. Prometheus Alertmanager 集成

多渠道配置

yaml
# alertmanager.yml
global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'team-email'
  routes:
  - match:
      severity: critical
    receiver: 'team-critical'
  - match:
      severity: warning
    receiver: 'team-warning'

receivers:
- name: 'team-email'
  email_configs:
  - to: 'team@example.com'
    send_resolved: true

- name: 'team-critical'
  email_configs:
  - to: 'team@example.com'
    send_resolved: true
  webhook_configs:
  - url: 'http://localhost:8080/slack'
  - url: 'http://localhost:8080/wechat'
  pagerduty_configs:
  - service_key: 'your-pagerduty-service-key'

- name: 'team-warning'
  email_configs:
  - to: 'team@example.com'
    send_resolved: true
  webhook_configs:
  - url: 'http://localhost:8080/slack'

2. Zabbix 告警集成

告警媒介配置

  1. 创建媒体类型

    • 管理 → 报警媒介类型 → 创建媒体类型
    • 名称:Email
    • 类型:Email
    • SMTP服务器:smtp.example.com
    • SMTP服务器端口:587
    • SMTP HELO:example.com
    • SMTP电子邮件:alerts@example.com
    • 认证:用户名和密码
    • 用户名:alerts@example.com
    • 密码:password
    • 启用TLS:是
  2. 用户媒体配置

    • 管理 → 用户 → 选择用户 → 报警媒介
    • 添加 → 类型:Email
    • 收件人:user@example.com
    • 当启用:1-7,00:00-24:00
    • 严重性:选择需要的告警级别
  3. 动作配置

    • 配置 → 动作 → 创建动作
    • 名称:MySQL 告警通知
    • 条件:触发器 = MySQL 相关触发器
    • 操作:
      • 发送到用户群组:MySQL 管理员
      • 仅送到:Email
      • 默认信息:包含告警详情

3. Grafana 告警集成

通知渠道配置

  1. 添加通知渠道

    • Alerting → Notification channels → Add channel
    • Name: Email
    • Type: Email
    • Addresses: team@example.com
    • Include image: 是
    • Send on all alerts: 是
    • Enable: 是
  2. 配置告警规则

    json
    {
      "alert": {
        "name": "MySQL 连接数告警",
        "message": "MySQL 连接数达到阈值",
        "rule": {
          "for": "5m",
          "condition": "B > 90",
          "query": {
            "params": ["A", "5m", "now"]
          }
        },
        "notifications": [
          {
            "uid": "email-notification",
            "settings": {
              "addresses": "team@example.com"
            }
          },
          {
            "uid": "slack-notification",
            "settings": {
              "url": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
            }
          }
        ]
      }
    }

告警通知最佳实践

1. 通知内容最佳实践

  • 简明扼要:标题和开头直接说明问题
  • 信息完整:包含服务器、时间、级别、详情、建议
  • 格式规范:使用统一的格式和模板
  • 突出重点:使用加粗、颜色等强调重要信息
  • 可操作:提供具体的处理建议
  • 包含上下文:提供历史趋势和相关指标

2. 通知频率最佳实践

  • 避免重复:相同告警在指定时间内不重复发送
  • 智能间隔:根据告警级别设置不同的重复间隔
  • 恢复通知:告警恢复后发送恢复通知
  • 批量发送:短时间内的多个告警批量发送
  • 静默期:非工作时间设置合理的静默期

3. 通知管理最佳实践

  • 分组管理:按团队、服务、区域分组管理通知
  • 权限控制:根据角色设置不同的通知权限
  • 模板管理:使用统一的通知模板
  • 历史记录:保存所有通知的历史记录
  • 统计分析:定期分析通知数据,优化通知策略

4. 故障演练最佳实践

  • 定期演练:每季度进行一次告警通知演练
  • 模拟场景:模拟不同级别的告警场景
  • 测试渠道:测试所有通知渠道的可用性
  • 响应时间:测量从告警触发到收到通知的时间
  • 持续改进:根据演练结果优化通知策略

常见问题与解决方案

1. 通知延迟

问题:告警触发后,通知送达延迟

解决方案

  • 检查通知服务是否正常运行
  • 优化网络连接,减少网络延迟
  • 配置多个通知渠道,提高送达率
  • 对于紧急告警,使用实时性更高的渠道

2. 通知丢失

问题:告警触发后,未收到通知

解决方案

  • 检查通知服务配置是否正确
  • 检查通知渠道是否被拦截(如邮件被标记为垃圾邮件)
  • 配置多个通知渠道,确保至少一个渠道送达
  • 实现通知确认机制,未确认的通知自动重试

3. 通知噪音

问题:收到大量重复或不重要的通知

解决方案

  • 优化告警阈值,减少误报
  • 设置通知抑制规则,避免告警风暴
  • 实现告警聚合,将相关告警合并发送
  • 对不同级别的告警使用不同的通知策略

4. 通知内容不完整

问题:收到的通知缺少关键信息

解决方案

  • 检查通知模板是否包含所有必要信息
  • 确保监控系统能够采集到完整的指标数据
  • 优化通知内容格式,突出重要信息
  • 定期测试通知内容的完整性

常见问题(FAQ)

Q1: 如何选择合适的通知渠道?

A1: 选择通知渠道应考虑:

  • 告警级别:高级别告警使用多种渠道,低级别告警使用单一渠道
  • 实时性要求:紧急告警使用实时性高的渠道(电话、短信)
  • 成本预算:平衡通知效果和成本
  • 用户习惯:考虑团队成员的使用习惯
  • 可靠性:选择可靠的通知服务提供商

Q2: 如何避免通知风暴?

A2: 避免通知风暴的方法:

  • 设置告警抑制规则:当高级别告警触发时,抑制同类型低级别告警
  • 实现告警聚合:将短时间内的多个告警聚合为一个通知
  • 调整告警阈值:优化告警阈值,减少误报
  • 设置静默期:在指定时间内不再重复发送相同告警
  • 使用智能告警:基于机器学习减少重复告警

Q3: 如何确保通知的可靠性?

A3: 确保通知可靠性的方法:

  • 多渠道发送:使用多个通知渠道,确保至少一个渠道送达
  • 通知确认:实现通知确认机制,未确认的通知自动重试
  • 服务监控:监控通知服务本身的状态
  • 冗余配置:配置多个通知服务提供商,避免单点故障
  • 定期测试:定期测试所有通知渠道的可用性

Q4: 如何管理不同时区的通知?

A4: 管理不同时区通知的方法:

  • 统一时区:所有服务器和监控系统使用 UTC 时间
  • 本地化显示:通知内容中显示本地时间
  • 时区配置:在通知系统中配置用户时区
  • 智能通知:根据用户时区调整通知时间
  • 全球团队:按区域分组管理通知

Q5: 如何处理非工作时间的告警?

A5: 处理非工作时间告警的方法:

  • 轮值制度:建立团队轮值制度,确保有人负责
  • 分级通知:非工作时间只发送高级别告警
  • 智能路由:根据时间和人员状态自动路由告警
  • 移动应用:使用支持推送通知的移动应用
  • 应急联系人:设置多级应急联系人

Q6: 如何集成自定义通知渠道?

A6: 集成自定义通知渠道的方法:

  • Webhook 接口:使用监控系统的 Webhook 接口
  • API 集成:通过通知服务的 API 进行集成
  • 中间件:开发中间件转换告警格式
  • 开源工具:使用开源的告警通知工具(如 Alertmanager)
  • 容器化部署:使用容器化技术快速部署通知服务

Q7: 如何分析通知数据?

A7: 分析通知数据的方法:

  • 通知频率分析:分析不同时间段的通知频率
  • 告警类型分析:分析不同类型告警的分布
  • 响应时间分析:分析告警响应时间
  • 解决时间分析:分析告警解决时间
  • 趋势分析:分析告警数量和类型的趋势

Q8: 如何优化通知内容?

A8: 优化通知内容的方法:

  • 简洁明了:突出重点信息,避免冗余
  • 结构化:使用结构化格式,便于快速阅读
  • 可操作:提供具体的处理建议
  • 上下文:包含相关的历史数据和趋势
  • 个性化:根据接收人的角色定制通知内容

Q9: 如何确保通知的安全性?

A9: 确保通知安全性的方法:

  • 加密传输:使用 HTTPS 等加密方式传输通知
  • 身份验证:对通知服务进行身份验证
  • 访问控制:限制通知系统的访问权限
  • 敏感信息处理:避免在通知中包含敏感信息
  • 审计日志:记录所有通知的发送和接收情况

Q10: 未来通知方式的发展趋势是什么?

A10: 未来通知方式的发展趋势:

  • 智能化:使用 AI 分析告警,提供智能通知
  • 多模态:结合文本、语音、视频等多种形式
  • 个性化:根据用户偏好和场景自动调整通知方式
  • 预测性:基于趋势预测,提前发送通知
  • 沉浸式:使用 AR/VR 等技术提供沉浸式通知体验