本教程基於前面兩篇
mysql高可用架構之MHA部署(一)(保姆級)mysql高可用架構之MHA部署(二)VIP漂移(保姆級) 實現了HMA發郵件提醒,QQ郵箱
【注意】
以下所有操作均在MHA管理節點【10.0.0.62】執行

1、前提條件

前提條件:主從架構正常、MHA啓動,請按下面操作進行環境檢查

  1. 檢查 SSH 免密登錄
masterha_check_ssh --conf=/etc/mha/mysql_cluster.cnf
  1. 檢查主從複製
masterha_check_repl --conf=/etc/mha/mysql_cluster.cnf
  1. 檢查 MHA 狀態
masterha_check_status --conf=/etc/mha/mysql_cluster.cnf
  1. MHA 啓動
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 停止
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

yum install -y mailx

Ubuntu/Debian

apt-get install -y heirloom-mailx

2.2 開啓 QQ 郵箱 SMTP 服務並獲取授權碼

登錄 QQ 郵箱 → 「設置」→「賬户」→ 開啓「POP3/SMTP 服務」;
完成安全驗證後,獲取 16 位授權碼(非登錄密碼,用於保存)。

2.3 配置 QQ 郵箱 SMTP 連接(關鍵)

創建或修改郵件配置文件,確保支持 QQ 郵箱的 SSL 加密連接:

vi /etc/mail.rc

添加以下內容(替換為你的信息):

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 事件併發送郵件):
可以用我這個,也可以自己寫一個,功能實現即可,我這個也不全面,參考即可,

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 賦予腳本執行權限:

chmod +x /usr/local/bin/masterha_send_report

3.2 配置 MHA 調用郵件腳本

修改 MHA 配置文件(如 /etc/mha/mysql_cluster.cnf),添加郵件腳本路徑:

[server default]
#其他配置...
manager_workdir=/var/log/mha/mysql_cluster
report_script= /usr/local/bin/masterha_send_report    # 關鍵:指定郵件腳本

例如:

mysql高可用架構之MHA部署(三)——故障轉移後郵件告警配置(保姆級) - 詳解_SSL

3.3 手動測試郵件腳本

/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

然後腳本里面的收件郵箱會有消息,如下

mysql高可用架構之MHA部署(三)——故障轉移後郵件告警配置(保姆級) - 詳解_SSL_02


具體告警信息

mysql高可用架構之MHA部署(三)——故障轉移後郵件告警配置(保姆級) - 詳解_SSL_03


測試郵件功能正常之後,進行主從故障模擬

4、模擬故障驗證自動通知

【注】
由於修改了MHA的配置文件,請停止MHA並重新啓動MHA,也可再次檢查下標題1裏面前提條件是否滿足,然後進行下列操作

  • 手動模擬故障(主庫執行)
systemctl stop mysqld

在主庫執行 systemctl stop mysqld 觸發 MHA 故障轉移,此時會收到郵件通知,包含故障類型、節點信息等內容。

  • 觀測MHA日誌
tail -f  /var/log/mha/mysql_cluster/manager.log

mysql高可用架構之MHA部署(三)——故障轉移後郵件告警配置(保姆級) - 詳解_mysql_04


這裏可以看到MHA主從故障後出發了故障轉移,VIP也進行了漂移,告警郵件發送

建議:可以仔細看下MHA日誌,你可以明白MHA主從替換的更詳細的過程,這對你理解MHA故障轉移的認識會更深一步。

也可參考我的博客,更詳細地瞭解。

MHA Failover 實現流程(核心步驟)

  • 觀測VIP腳本日誌(可選)
tail -f /var/log/mha/vip_failover.log

mysql高可用架構之MHA部署(三)——故障轉移後郵件告警配置(保姆級) - 詳解_mysql_05


IP漂移也成功了

  • 查看郵件

當然,更重要的是故障轉移告警郵件的接收

mysql高可用架構之MHA部署(三)——故障轉移後郵件告警配置(保姆級) - 詳解_SSL_06


郵件告警操作實現。

至此,關於mysql高可用架構MHA相關的部署、應用透明(VIP)、郵件告警都已完結。