外观
PostgreSQL 告警通知方式
邮件告警配置
1. 安装和配置邮件服务
PostgreSQL 可以通过 pg_notify 结合外部脚本实现邮件告警。首先需要确保服务器上安装了邮件服务,如 sendmail 或 postfix。
bash
# 安装 postfix(以 CentOS 为例)
yum install -y postfix
# 启动并启用服务
systemctl start postfix
systemctl enable postfix2. 创建邮件发送脚本
创建一个用于发送邮件的脚本 send_email.sh:
bash
#!/bin/bash
# 邮件发送脚本
SUBJECT="$1"
MESSAGE="$2"
RECIPIENT="$3"
# 使用 sendmail 发送邮件
echo "Subject: $SUBJECT
$MESSAGE" | sendmail $RECIPIENT3. 配置告警触发器
创建告警触发器,当特定事件发生时调用邮件发送脚本:
sql
-- 创建告警函数
CREATE OR REPLACE FUNCTION send_alert_email()
RETURNS TRIGGER AS $$
DECLARE
subject TEXT;
message TEXT;
BEGIN
subject := 'PostgreSQL 告警: ' || TG_TABLE_NAME || ' 数据变更';
message := '表 ' || TG_TABLE_NAME || ' 发生了 ' || TG_OP || ' 操作\n' ||
'时间: ' || CURRENT_TIMESTAMP || '\n' ||
'用户: ' || current_user;
-- 调用外部邮件脚本
EXECUTE format('\$HOME/send_email.sh ''%s'' ''%s'' ''admin@example.com''',
subject, message);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 创建触发器
CREATE TRIGGER alert_trigger
AFTER INSERT OR UPDATE OR DELETE ON critical_table
FOR EACH STATEMENT
EXECUTE FUNCTION send_alert_email();短信告警配置
1. 使用短信 API 服务
可以使用第三方短信服务提供商的 API(如阿里云短信、腾讯云短信)来发送短信告警。
2. 创建短信发送脚本
bash
#!/bin/bash
# 短信发送脚本
MESSAGE="$1"
PHONE="$2"
# 使用阿里云短信 API 发送短信
curl -X POST "https://dysmsapi.aliyuncs.com/" \
--data "AccessKeyId=your_access_key_id" \
--data "Action=SendSms" \
--data "PhoneNumbers=$PHONE" \
--data "SignName=PostgreSQL告警" \
--data "TemplateCode=SMS_123456789" \
--data "TemplateParam={\"message\":\"$MESSAGE\"}" \
--data "Version=2017-05-25"钉钉告警配置
1. 创建钉钉机器人
- 登录钉钉,进入需要接收告警的群聊
- 点击群设置 → 智能群助手 → 添加机器人 → 自定义
- 填写机器人名称,复制 Webhook 地址
- 设置安全设置(如自定义关键词、IP 白名单)
2. 创建钉钉告警脚本
bash
#!/bin/bash
# 钉钉告警脚本
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=your_token"
TITLE="$1"
MESSAGE="$2"
# 构建 JSON 数据
JSON_DATA=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"title": "$TITLE",
"text": "# $TITLE\n\n$MESSAGE"
}
}
EOF
)
# 发送请求
curl -s -H "Content-Type: application/json" -d "$JSON_DATA" $WEBHOOK_URLSlack 告警配置
1. 创建 Slack 应用和 Webhook
- 登录 Slack,进入 Apps → Build → Create New App
- 选择 "From scratch",填写应用名称和工作区
- 在 "Add features and functionality" 中选择 "Incoming Webhooks"
- 启用 Webhook,添加新的 Webhook 到工作区
- 选择要发送告警的频道,复制 Webhook URL
2. 创建 Slack 告警脚本
bash
#!/bin/bash
# Slack 告警脚本
WEBHOOK_URL="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
CHANNEL="#postgresql-alerts"
USERNAME="PostgreSQL-Alert"
MESSAGE="$1"
# 构建 JSON 数据
JSON_DATA=$(cat <<EOF
{
"channel": "$CHANNEL",
"username": "$USERNAME",
"text": "$MESSAGE"
}
EOF
)
# 发送请求
curl -s -H "Content-Type: application/json" -d "$JSON_DATA" $WEBHOOK_URL微信工作告警配置
1. 创建微信工作机器人
- 登录微信工作,进入需要接收告警的群聊
- 点击群设置 → 群机器人 → 添加机器人
- 填写机器人名称和描述,复制 Webhook 地址
2. 创建微信工作告警脚本
bash
#!/bin/bash
# 微信工作告警脚本
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key"
MESSAGE="$1"
# 构建 JSON 数据
JSON_DATA=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"content": "# PostgreSQL 告警\n\n$MESSAGE"
}
}
EOF
)
# 发送请求
curl -s -H "Content-Type: application/json" -d "$JSON_DATA" $WEBHOOK_URL使用 Prometheus + Alertmanager 配置告警
1. 配置 Alertmanager
创建 alertmanager.yml 配置文件:
yaml
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email'
routes:
- match:
severity: critical
receiver: 'dingtalk'
- match:
severity: warning
receiver: 'slack'
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:25'
- name: 'dingtalk'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=your_token'
- name: 'slack'
webhook_configs:
- url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'2. 配置 Prometheus 告警规则
创建 postgresql_rules.yml 告警规则文件:
yaml
groups:
- name: postgresql_alerts
rules:
- alert: HighConnectionCount
expr: pg_stat_database_numbackends > 100
for: 5m
labels:
severity: warning
annotations:
summary: "PostgreSQL 连接数过高"
description: "数据库 {{ $labels.datname }} 连接数超过 100,当前值: {{ $value }}"
- alert: HighCpuUsage
expr: pg_stat_bgwriter_checkpoints_timed > 100
for: 5m
labels:
severity: critical
annotations:
summary: "PostgreSQL CPU 使用率过高"
description: "数据库 {{ $labels.datname }} CPU 使用率过高,检查点数量: {{ $value }}"告警通知最佳实践
1. 告警分级
- 紧急(Critical):立即影响业务的问题,如数据库连接失败、主从复制中断
- 重要(Major):影响部分业务的问题,如磁盘使用率超过 90%
- 警告(Warning):潜在问题,如连接数接近阈值
- 信息(Info):常规操作通知,如备份完成
2. 告警发送策略
- 紧急告警:通过多种渠道同时发送(邮件、短信、钉钉)
- 重要告警:通过邮件和钉钉发送
- 警告和信息:仅通过邮件发送
3. 告警抑制和聚合
- 告警抑制:当同一问题产生多个告警时,只发送最严重的告警
- 告警聚合:将相关告警合并发送,减少告警噪音
4. 定期测试
定期测试告警通知渠道,确保告警能够及时送达:
bash
# 测试邮件告警
./send_email.sh "测试告警" "这是一封测试邮件" "admin@example.com"
# 测试钉钉告警
./send_dingtalk.sh "测试告警" "这是一条测试消息"常见问题(FAQ)
Q1:如何确保告警通知的可靠性?
A1:可以通过以下方式提高告警通知的可靠性:
- 配置多种告警渠道,避免单一渠道故障导致告警丢失
- 定期测试所有告警渠道
- 监控告警系统本身的运行状态
- 配置告警确认机制,确保告警被及时处理
Q2:如何减少告警噪音?
A2:减少告警噪音的方法包括:
- 合理设置告警阈值,避免误报
- 配置告警抑制和聚合规则
- 对告警进行分级,只关注重要告警
- 定期审查和优化告警规则
Q3:如何处理大量告警?
A3:处理大量告警的建议:
- 建立告警处理流程,明确责任人和处理时间
- 使用告警管理平台,集中管理和处理告警
- 分析告警趋势,找出根本原因并解决
- 自动化处理常见告警,减少人工干预
Q4:如何配置告警通知的接收人员?
A4:根据告警级别和类型配置不同的接收人员:
- 紧急告警:发送给 DBA 团队所有成员
- 重要告警:发送给值班 DBA
- 警告和信息:发送给 DBA 团队邮箱列表
Q5:如何记录和跟踪告警处理情况?
A5:可以通过以下方式记录和跟踪告警:
- 使用 ITSM 系统(如 Jira、ServiceNow)创建告警工单
- 在告警消息中包含唯一标识符,便于跟踪
- 定期分析告警处理时间和解决率
- 建立告警处理知识库,积累处理经验
