mysql高可用架构之MHA部署(三)——故障转移后邮件告警配置(保姆级)

本教程基于前面两篇
mysql高可用架构之MHA部署(一)(保姆级)
mysql高可用架构之MHA部署(二)VIP漂移(保姆级)

实现了HMA发邮件提醒,QQ邮箱
【注意】
以下所有操作均在MHA管理节点【10.0.0.62】执行

1、前提条件

前提条件:主从架构正常、MHA启动,请按下面操作进行环境检查

  1. 检查 SSH 免密登录
bash 复制代码
masterha_check_ssh --conf=/etc/mha/mysql_cluster.cnf
  1. 检查主从复制
bash 复制代码
masterha_check_repl --conf=/etc/mha/mysql_cluster.cnf
  1. 检查 MHA 状态
bash 复制代码
masterha_check_status --conf=/etc/mha/mysql_cluster.cnf
  1. MHA 启动
bash 复制代码
nohup masterha_manager   --conf=/etc/mha/mysql_cluster.cnf   --remove_dead_master_conf   --ignore_laster_failover   > /var/log/mha/mysql_cluster/manager.log 2>&1 &
  1. MHA 停止
bash 复制代码
masterha_stop  --conf=/etc/mha/mysql_cluster.cnf

2、MHA故障提醒

怎么实现HMA发邮件提醒?QQ邮箱

要通过 MHA(Master High Availability)实现 QQ 邮箱的邮件提醒,需配置 MHA 调用邮件工具发送邮件,并解决 QQ 邮箱强制 SSL 加密的问题。以下是完整步骤:

2.1、准备工作

安装邮件工具,在 MHA 管理节点安装 mailx(用于发送邮件):

CentOS/RHEL

bash 复制代码
yum install -y mailx

Ubuntu/Debian

bash 复制代码
apt-get install -y heirloom-mailx

2.2 开启 QQ 邮箱 SMTP 服务并获取授权码

登录 QQ 邮箱 → 「设置」→「账户」→ 开启「POP3/SMTP 服务」;

完成安全验证后,获取 16 位授权码(非登录密码,用于保存)。

2.3 配置 QQ 邮箱 SMTP 连接(关键)

创建或修改邮件配置文件,确保支持 QQ 邮箱的 SSL 加密连接:

bash 复制代码
vi /etc/mail.rc

添加以下内容(替换为你的信息):

bash 复制代码
set from=你的QQ号@qq.com              # 发件人邮箱(如123456@qq.com)
set smtp=smtps://smtp.qq.com:465      # QQ邮箱SSL端口(必须用465)
set smtp-auth-user=你的QQ号@qq.com    # 与发件人一致
set smtp-auth-password=你的16位授权码  # 刚获取的授权码(无引号)
set smtp-auth=login                   # 认证方式
set nss-config-dir=/etc/pki/nssdb/    # SSL证书库路径
set ssl-verify=off                    # 关闭证书验证(避免QQ证书识别问题)

3、创建 MHA 邮件通知脚本

MHA 通过脚本触发邮件发送,创建脚本 masterha_send_report

脚本内容(实现接收 MHA 事件并发送邮件):

可以用我这个,也可以自己写一个,功能实现即可,我这个也不全面,参考即可,

bash 复制代码
vim /usr/local/bin/masterha_send_report 

#!/bin/bash
# MHA 故障转移邮件通知脚本(彻底消除dead.letter提示)
# 脚本路径:/usr/local/bin/masterha_send_report

# 1. 基础配置
TO="你的QQ号@qq.com"                     # 邮件接收人
CLUSTER_NAME="mysql_cluster"            # MHA集群名称
MANAGER_LOG_DIR="/var/log/mha/mysql_cluster"  # MHA日志目录
DEAD_LETTER="/root/dead.letter"         # 死信文件路径(固定)

# 2. 解析MHA参数
for arg in "$@"; do
    case "$arg" in
        --orig_master_host=*) ORIG_MASTER_IP="${arg#*=}" ;;
        --orig_master_port=*) ORIG_MASTER_PORT="${arg#*=}" ;;
        --new_master_host=*) NEW_MASTER_IP="${arg#*=}" ;;
        --new_master_port=*) NEW_MASTER_PORT="${arg#*=}" ;;
        --new_slave_hosts=*) NEW_SLAVE_IP="${arg#*=}" ;;
        --conf=*) MHA_CONF="${arg#*=}" ;;
        --subject=*) EVENT_TYPE="Master 故障转移成功" ;;
    esac
done

# 3. 端口默认值
ORIG_MASTER_PORT=${ORIG_MASTER_PORT:-3306}
NEW_MASTER_PORT=${NEW_MASTER_PORT:-3306}

# 4. 邮件主题与内容
SUBJECT="【MHA 告警】$CLUSTER_NAME 集群故障转移完成(原主:$ORIG_MASTER_IP:$ORIG_MASTER_PORT → 新主:$NEW_MASTER_IP:$NEW_MASTER_PORT)"

BODY=$(cat <<EOF
MHA 集群故障转移通知

【1. 核心事件信息】
- 事件类型:$EVENT_TYPE(failover_succeeded)
- 集群名称:$CLUSTER_NAME
- 故障原主节点:
  IP: $ORIG_MASTER_IP
  端口: $ORIG_MASTER_PORT
  状态:已下线(Master is down)
- 新主节点:
  IP: $NEW_MASTER_IP
  端口: $NEW_MASTER_PORT
  状态:已激活(已应用所有日志、已绑定主节点 IP)

【2. 从节点同步状态】
- 从节点 IP:$NEW_SLAVE_IP
- 同步状态:正常(已启动,正在从新主节点 $NEW_MASTER_IP:$NEW_MASTER_PORT 同步数据)

【3. 日志与配置信息】
- MHA 配置文件路径:$MHA_CONF
- 故障转移日志路径:$MANAGER_LOG_DIR/manager.log(查看完整过程)
- 管理节点主机名:$(hostname)

【4. 故障转移过程摘要】
1. 启动自动非交互式故障转移
2. 失效原主节点 $ORIG_MASTER_IP:$ORIG_MASTER_PORT 的 IP 绑定
3. 选择 $NEW_MASTER_IP:$NEW_MASTER_PORT 作为新主节点并应用日志
4. 激活新主节点 IP 绑定
5. 从节点 $NEW_SLAVE_IP 启动并同步新主节点
6. 重置新主节点的从节点信息,故障转移完成

【5. 后续操作建议】
1. 排查原主节点 $ORIG_MASTER_IP:$ORIG_MASTER_PORT 故障原因
2. 验证新主节点 $NEW_MASTER_IP:$NEW_MASTER_PORT 运行状态
3. 确认从节点 $NEW_SLAVE_IP 同步状态
4. 修复原主节点后配置为新从节点
EOF
)
# 5. 发送邮件(关键优化:屏蔽错误+发送后立即清理死信文件)
echo -e "$BODY" | mailx -s "$SUBJECT" "$TO" >/dev/null 2>&1 && \
# 无论发送成功与否,强制删除空的死信文件(解决提示问题)
if [ -f "$DEAD_LETTER" ] && [ $(stat -c %s "$DEAD_LETTER") -eq 0 ]; then
    rm -f "$DEAD_LETTER" >/dev/null 2>&1
fi

exit 0

3.1 赋予脚本执行权限:

bash 复制代码
chmod +x /usr/local/bin/masterha_send_report

3.2 配置 MHA 调用邮件脚本

修改 MHA 配置文件(如 /etc/mha/mysql_cluster.cnf),添加邮件脚本路径:

bash 复制代码
[server default]
#其他配置...
manager_workdir=/var/log/mha/mysql_cluster
report_script= /usr/local/bin/masterha_send_report    # 关键:指定邮件脚本

例如:

3.3 手动测试邮件脚本

bash 复制代码
/usr/local/bin/masterha_send_report  \
--orig_master_host=10.0.0.61 \
--orig_master_port=3306 \
--new_master_host=10.0.0.60 \
--new_master_port=3306 \
--new_slave_hosts=10.0.0.62 \
--conf=/etc/mha/mysql_cluster.cnf

然后脚本里面的收件邮箱会有消息,如下

具体告警信息

测试邮件功能正常之后,进行主从故障模拟

4、模拟故障验证自动通知

【注】

由于修改了MHA的配置文件,请停止MHA并重新启动MHA,也可再次检查下标题1里面前提条件是否满足,然后进行下列操作

  • 手动模拟故障(主库执行)
bash 复制代码
systemctl stop mysqld

在主库执行 systemctl stop mysqld 触发 MHA 故障转移,此时会收到邮件通知,包含故障类型、节点信息等内容。

  • 观测MHA日志
bash 复制代码
tail -f  /var/log/mha/mysql_cluster/manager.log

这里可以看到MHA主从故障后出发了故障转移,VIP也进行了漂移,告警邮件发送

建议:可以仔细看下MHA日志,你可以明白MHA主从替换的更详细的过程,这对你理解MHA故障转移的认识会更深一步。

也可参考我的博客,更详细地了解。
MHA Failover 实现流程(核心步骤)

  • 观测VIP脚本日志(可选)
bash 复制代码
tail -f /var/log/mha/vip_failover.log

IP漂移也成功了

  • 查看邮件

当然,更重要的是故障转移告警邮件的接收

邮件告警操作实现。

至此,关于mysql高可用架构MHA相关的部署、应用透明(VIP)、邮件告警都已完结。

相关推荐
disanleya4 小时前
MySQL时间格式转换,时间数据混乱不堪如何彻底重构?
数据库·mysql·重构
奥尔特星云大使4 小时前
mysql读写分离中间件——Atlas详解
数据库·mysql·中间件·dba·读写分离
lang201509284 小时前
MySQL字符集配置全攻略:告别乱码
mysql
程序员水自流7 小时前
MySQL InnoDB存储引擎缓存刷盘CheckPoint技术底层实现原理详细介绍
数据库·mysql·缓存
Java陈序员8 小时前
简单好用!一款针对 IT 团队开发的文档管理系统!
mysql·docker·go
野犬寒鸦9 小时前
从零起步学习MySQL || 第一章:初识MySQL及深入理解内部数据类型
java·服务器·数据库·后端·mysql
初听于你10 小时前
MySQL数据库面试高频问题及解析
数据库·sql·mysql·oracle·面试
-雷阵雨-11 小时前
MySQL——数据类型
数据库·mysql
北极糊的狐19 小时前
MySQL常见报错分析及解决方案总结(15)---Can’t connect to MySQL server on ‘localhost‘ (10061)
数据库·mysql