外观
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.comMySQL 告警邮件配置
bash
# 在监控脚本中配置邮件发送
ADMIN_EMAIL="admin@example.com"
# 发送告警邮件
echo "MySQL 告警:服务器 $HOST 连接数过高,请及时处理!" | mail -s "[紧急] MySQL 连接数告警" $ADMIN_EMAILPrometheus 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"
doneZabbix 短信集成
安装短信网关:
bash# 安装 Gammu 短信网关 sudo apt install gammu-smsd配置 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/配置 Zabbix 告警媒介:
- 管理 → 报警媒介类型 → 创建媒体类型
- 名称:SMS
- 类型:脚本
- 脚本名称:sms.sh
创建短信脚本:
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"
done4. 即时通讯通知配置
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 告警集成
告警媒介配置
创建媒体类型:
- 管理 → 报警媒介类型 → 创建媒体类型
- 名称:Email
- 类型:Email
- SMTP服务器:smtp.example.com
- SMTP服务器端口:587
- SMTP HELO:example.com
- SMTP电子邮件:alerts@example.com
- 认证:用户名和密码
- 用户名:alerts@example.com
- 密码:password
- 启用TLS:是
用户媒体配置:
- 管理 → 用户 → 选择用户 → 报警媒介
- 添加 → 类型:Email
- 收件人:user@example.com
- 当启用:1-7,00:00-24:00
- 严重性:选择需要的告警级别
动作配置:
- 配置 → 动作 → 创建动作
- 名称:MySQL 告警通知
- 条件:触发器 = MySQL 相关触发器
- 操作:
- 发送到用户群组:MySQL 管理员
- 仅送到:Email
- 默认信息:包含告警详情
3. Grafana 告警集成
通知渠道配置
添加通知渠道:
- Alerting → Notification channels → Add channel
- Name: Email
- Type: Email
- Addresses: team@example.com
- Include image: 是
- Send on all alerts: 是
- Enable: 是
配置告警规则:
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 等技术提供沉浸式通知体验
