本教程基于前面两篇
mysql高可用架构之MHA部署(一)(保姆级)
mysql高可用架构之MHA部署(二)VIP漂移(保姆级)
实现了HMA发邮件提醒,QQ邮箱
【注意】
以下所有操作均在MHA管理节点【10.0.0.62】执行
1、前提条件
前提条件:主从架构正常、MHA启动,请按下面操作进行环境检查
- 检查 SSH 免密登录
bash
masterha_check_ssh --conf=/etc/mha/mysql_cluster.cnf
- 检查主从复制
bash
masterha_check_repl --conf=/etc/mha/mysql_cluster.cnf
- 检查 MHA 状态
bash
masterha_check_status --conf=/etc/mha/mysql_cluster.cnf
- 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 &
- 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)、邮件告警都已完结。