Skip to content

PostgreSQL 告警通知方式

邮件告警配置

1. 安装和配置邮件服务

PostgreSQL 可以通过 pg_notify 结合外部脚本实现邮件告警。首先需要确保服务器上安装了邮件服务,如 sendmailpostfix

bash
# 安装 postfix(以 CentOS 为例)
yum install -y postfix

# 启动并启用服务
systemctl start postfix
systemctl enable postfix

2. 创建邮件发送脚本

创建一个用于发送邮件的脚本 send_email.sh

bash
#!/bin/bash
# 邮件发送脚本

SUBJECT="$1"
MESSAGE="$2"
RECIPIENT="$3"

# 使用 sendmail 发送邮件
echo "Subject: $SUBJECT

$MESSAGE" | sendmail $RECIPIENT

3. 配置告警触发器

创建告警触发器,当特定事件发生时调用邮件发送脚本:

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. 创建钉钉机器人

  1. 登录钉钉,进入需要接收告警的群聊
  2. 点击群设置 → 智能群助手 → 添加机器人 → 自定义
  3. 填写机器人名称,复制 Webhook 地址
  4. 设置安全设置(如自定义关键词、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_URL

Slack 告警配置

1. 创建 Slack 应用和 Webhook

  1. 登录 Slack,进入 Apps → Build → Create New App
  2. 选择 "From scratch",填写应用名称和工作区
  3. 在 "Add features and functionality" 中选择 "Incoming Webhooks"
  4. 启用 Webhook,添加新的 Webhook 到工作区
  5. 选择要发送告警的频道,复制 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. 创建微信工作机器人

  1. 登录微信工作,进入需要接收告警的群聊
  2. 点击群设置 → 群机器人 → 添加机器人
  3. 填写机器人名称和描述,复制 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)创建告警工单
  • 在告警消息中包含唯一标识符,便于跟踪
  • 定期分析告警处理时间和解决率
  • 建立告警处理知识库,积累处理经验