MySQL: MHA架构详解与配置指南之基于GTID的高可用MySQL主从故障转移方案

Gtid方式搭建主从复制+MHA高可用集群 GTID方式搭建的主从复制集群,无法实现高可用性,使用开源工具MHA来实现mysql主从复制的高可用性,用来简化mysql高可用的部署和管理。 阅读详情

基于GTID的高可用MySQL主从故障转移方案

MHA架构核心介绍

MHA(MySQL Master High Availability) 是由Perl脚本开发的成熟工具套件,专注于管理MySQL主从复制集群的高可用性

  • 核心目标:解决主数据库单点故障问题,重点关注主节点监控与故障切换
  • 核心能力:
    • 在主从复制架构下自动执行故障转移,30秒内完成切换,且最大程度保证数据一致性,最小化事务丢失风险
    • 最大程度保证数据一致性,通过保存故障主节点的二进制日志减少事务丢失
    • 支持从多个从服务器中自动选举新主节点,并重新配置其他从节点同步新主

与MMM架构的关键差异

特性MHAMMM
监控对象仅监控主节点监控主备节点
新主选举从所有从节点中选最新数据节点仅从主备节点中选择
GTID支持
Global Transaction Identifier(全局事务标识符)
✅ 支持基于GTID的复制❌ 不支持
日志保存尝试保存故障主节点二进制日志不保存日志,数据丢失风险高
核心功能与技术优势

1 )主库监控与故障检测

  • 仅监控主数据库服务器状态(区别于MMM工具),解决主库单点问题。
  • 主库不可用时,自动从多个从库中选举数据最新的节点作为新主库(支持人工配置排除节点)。

2 )数据一致性保障机制

  • 二进制日志抢救:尝试从宕机主库保存未同步的二进制日志(需SSH可访问),减少事务丢失(若主库硬件/网络故障无法SSH访问,则无法保存)
  • 差异日志同步:将新主库与旧从库的差异日志应用到其他从节点,最大限度避免事务丢失
  • 半同步复制兼容:结合MySQL 5.5+半同步复制,确保至少一个从库持有最新日志,大幅降低数据丢失风险,若任一从库已接收最新binlog,MHA将其同步至所有从库,确保集群数据一致

3 )故障切换流程

  1. 检测主库故障,尝试SSH保存其最新binlog。
  2. 选举数据最接近原主库的从库作为新主库(支持GTID复制模式)。
  3. 识别新主库与其他从库的差异日志,应用至所有从库(避免数据断层)。
  4. 提升新主库,切换虚拟IP(VIP),并重配置其他从库指向新主库。

关键点:若差异日志应用失败(如重复主键错误),故障转移将中止。

4 ) 与MMM的对比优势

关键优势(对比MMM):

  • 日志抢救机制:降低数据丢失概率(MMM无此能力)
  • 灵活选举策略:不从库均可竞选主库(MMM仅限备选主节点)
  • GTID支持:确保日志回放安全性(MMM仅支持日志点位复制)
    • 支持GTID复制(MMM不支持),避免日志重复回放
  • 从库选举基于数据最新性(MMM仅依赖主备角色)
故障切换流程与技术细节

故障切换步骤(共5步):

1 )主节点监控与日志保存

  • MHA持续监控主节点可用性
  • 主节点故障时,尝试通过SSH保存其最新二进制日志(需网络/硬件可访问)

2 ) 选举新主节点

  • 从所有从节点中选取数据最新的节点作为新主(可配置排除特定节点)
  • 示例选举逻辑:
    -- 检查从节点复制延迟(Seconds_Behind_Master)  
    SHOW SLAVE STATUS;  
    -- 选择延迟最小的节点  
    

3 ) 差异日志同步

  • 识别其他从节点与新主节点的差异日志(Relay Log),并应用至所有从节点,确保数据全局一致。

4 ) 二进制日志整合

  • 若成功保存故障主节点日志,将日志合并至新主节点。
  • 失败场景:若日志重复或冲突(如主键冲突),切换中止。

5 ) 拓扑重构

  • 提升新主节点,切换虚拟IP(VIP)。
  • 其他从节点重新指向新主节点,完成复制链路重建。

关键风险:若主节点硬件故障导致日志无法保存,可能丢失最新事务。
解决方案:启用MySQL 5.5+半同步复制,确保至少一个从节点接收日志后再提交事务。

典型部署架构与配置要求

拓扑结构示例:

主库 (Master) → 从库1 (Slave1)  
          ↘ 从库2 (Slave2 + MHA Monitor)

监控节点要求:独立物理服务器(演示中复用从库2)
复制模式:强制基于GTID的复制(避免日志重复应用)

MHA集群配置步骤

1 ) 前置准备

环境要求:

  • 复制模式:推荐GTID复制(避免日志重复回放)
  • SSH免密认证:集群内所有节点需配置SSH互信(故障转移依赖SSH操作)
  • 监控节点:独立物理服务器(演示中可用从节点替代)

SSH免密认证:集群内所有主机需配置SSH互信(故障转移依赖SSH操作)

# 生成密钥并分发至所有节点(含监控服务器)  
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub user@node1
ssh-copy-id -i ~/.ssh/id_rsa.pub user@node2 
ssh-copy-id -i ~/.ssh/id_rsa.pub user@monitor_node

软件安装:

# 所有节点安装Perl支持包及MHA Node  
yum install mha4mysql-node perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y  
# 监控服务器额外安装MHA Manager  
yum install mha4mysql-manager -y  

部署MHA组件注意事项:

  • 所有节点安装Node包(mha4mysql-node)(提供故障检测能力)
  • 监控节点安装Manager包(mha4mysql-manager)(执行切换逻辑)

2 )主从复制配置(GTID模式)

  • 启用GTID(推荐):

    • 主库配置(my.cnf)
      -- 主库配置(my.cnf)  
      server_id=1
      log_bin=mysql-bin 
      
      # 主要是下面的内容
      gtid_mode = ON  
      enforce_gtid_consistency = ON  
      
    • 从库配置:
      -- 从库配置(示例Slave1)
      server_id=2
      relay_log=relay-bin
      read_only=1
      
      gtid_mode = ON
      enforce_gtid_consistency = ON
      
  • 从库执行:

    # 示例Slave1
    CHANGE MASTER TO  
      MASTER_HOST = 'master_ip',  
      MASTER_USER = 'repl_user',  
      MASTER_PASSWORD = 'repl_pass',  
      MASTER_AUTO_POSITION = 1;  
    

3 )MHA配置文件(/etc/mha/app1.cnf)

[server default]  
manager_log = /var/log/mha/app1/manager.log
master_binlog_dir=/var/lib/mysql
user=mha_user 
password=MHA_pass123
ssh_user = root  
repl_user = repl_user  
repl_password = repl_pass  
 
[server1]  
hostname = master_ip    # 主节点IP
candidate_master = 1  
 
[server2]  
hostname = slave1_ip    # 从节点1 IP 
candidate_master = 1  
 
[server3]  
hostname = slave2_ip    # 从节点2 IP 
no_master = 1  # 不参与选举  

只需要在MHA管理节点(Manager Node)上一台服务器上配置

4 )配置验证与服务启动

# 检查SSH互信  
masterha_check_ssh --conf=/etc/mha/app1.cnf  
 
# 检查复制链路, 验证复制拓扑   
masterha_check_repl --conf=/etc/mha/app1.cnf  
 
# 启动MHA监控 注意:仅当检查通过后才能启动服务
nohup masterha_manager --conf=/etc/mha/app1.cnf  &
故障转移测试与注意事项

  • 模拟主库宕机:
    # 手动触发主库故障  
    masterha_master_switch --master_state=dead --conf=/etc/mha/app1.cnf  
    
  • 关键风险:
    • 若原主库binlog无法保存,最新事务可能丢失(半同步复制可缓解)
    • 差异日志应用失败将导致切换中止,需人工介入
生产环境优化与风险控制

  • 半同步复制增强数据安全
    -- 主库安装插件 
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    SET GLOBAL rpl_semi_sync_master_enabled=1;
    
    -- 从库安装插件
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
    SET GLOBAL rpl_semi_sync_slave_enabled=1;
    
  • 硬件级容灾:监控节点独立部署,避免单点故障。
  • 切换失败场景:主库硬件故障导致日志无法抢救时,手动介入恢复最新备份。
NestJS集成示例

1 ) 监控接口

// mha-monitor.controller.ts  
import { Controller, Get } from '@nestjs/common';  
import { exec } from 'child_process';  
 
@Controller('mha')  
export class MhaMonitorController {  
  @Get('status')  
  async getMhaStatus() {  
    return new Promise((resolve, reject) => {  
      exec('masterha_check_status --conf=/etc/mha/app1.cnf', (error, stdout) => {  
        if (error) reject({ status: 'DOWN', error });  
        resolve({ status: 'OK', details: stdout });  
      });  
    });  
  }  
}  

和

import { Controller, Get } from '@nestjs/common';  
import { execSync } from 'child_process';  
 
@Controller('mha')  
export class MHAController {  
  @Get('status')  
  checkMHAStatus() {  
    try {  
      const output = execSync('masterha_check_status --conf=/etc/mha/app1.cnf');  
      return { status: 'active', details: output.toString() };  
    } catch (error) {  
      return { status: 'inactive', error: error.message };  
    }  
  }  
 
  @Get('failover')  
  triggerFailover() {  
    const result = execSync('masterha_master_switch --conf=/etc/mha/app1.cnf');  
    return { action: 'failover', log: result.toString() };  
  }  
}  

2 ) 高可用数据库连接示例

// database.providers.ts
import { Provider } from '@nestjs/common';
import { createPool } from 'mysql2/promise';
 
export const MYSQL_CONNECTION = 'MYSQL_CONNECTION';
 
export const databaseProviders: Provider[] = [
  {
    provide: MYSQL_CONNECTION,
    useFactory: async () => {
      const pool = createPool({
        host: 'vip_address', // 指向MHA管理的虚拟IP 
        user: 'app_user',
        password: 'App_pass123',
        database: 'production_db',
        waitForConnections: true,
        connectionLimit: 10,
        queueLimit: 0,
      });
      return pool;
    },
  },
];

关键点:应用层通过虚拟IP连接数据库集群,故障切换对业务透明

补充知识点

1 ) 半同步复制配置:

-- 主库安装插件  
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  
SET GLOBAL rpl_semi_sync_master_enabled = 1;  

-- 从库安装插件  
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  
SET GLOBAL rpl_semi_sync_slave_enabled = 1;  

2 ) 虚拟IP切换原理:

  • MHA通过arping或ifconfig绑定VIP至新主库,确保应用无感知切换
要点总结

1 ) 数据一致性保障:

  • 日志保存优先:优先尝试恢复故障主节点日志。
  • 半同步复制集成:结合MySQL半同步复制,确保至少一个从节点同步日志。

2 ) 高可用设计:

  • 快速切换:30秒内完成故障转移。
  • 灵活选举:支持自定义节点选举策略(如配置no_master)。

3 ) 局限与规避:

  • 日志保存依赖网络:硬件故障时可能丢失数据→启用半同步复制。
  • 冲突中断切换:日志冲突导致失败→定期检查主键冲突。

通过GTID支持、SSH自动化操作与严格配置验证,MHA实现生产级MySQL高可用,适用于一主多从架构

MHA通过自动化故障转移、binlog抢救机制及GTID支持,构建高可靠MySQL集群
其核心价值在于最小化数据丢失与快速切换能力,但需严格前置条件(SSH互信、GTID配置)
生产环境建议独立部署监控节点,并定期验证故障转移流程

MHA高可用架构搭建实战:基于GTID复制与VIP漂移的MySQL集群部署

环境拓扑

  • 主库节点:192.168.3.100
  • 从库节点1:192.168.3.101
  • 从库节点2(兼MHA监控节点,不参与主选举):192.168.3.102
  • 写操作VIP:192.168.3.90 (业务写入口)
  • GTID 模式:所有节点均启用 GTID_MODE=ON
基础架构配置:GTID主从复制搭建

1 ) 启用GTID模式(所有节点执行)

# 检查GTID状态 
SHOW GLOBAL VARIABLES LIKE 'gtid_mode';
-- 输出应为 gtid_mode=ON
 
# 启用GTID(需重启实例)
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
SET GLOBAL GTID_MODE = ON;

关键点:所有节点必须启用GTID,否则无法构建基于GTID的复制链路

若任一节点未启用,也可以在my.cnf中添加:

[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON

关键验证:

SHOW SLAVE STATUS\G  -- 确保 Slave_IO_Running: Yes, Slave_SQL_Running: Yes

2 ) 创建复制账号(主库执行)

CREATE USER 'replay'@'192.168.3.%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'replay'@'192.168.3.%';
FLUSH PRIVILEGES;

3 ) 建立主从复制链路(从库执行)

# (以`192.168.3.101`为例)(101/102 均执行)
CHANGE MASTER TO 
  MASTER_HOST='192.168.3.100',
  MASTER_USER='replay',
  MASTER_PASSWORD='123456',
  MASTER_AUTO_POSITION=1;  -- 使用GTID自动定位
 
START SLAVE;

关键点:使用MASTER_AUTO_POSITION=1启用GTID自动定位

验证复制状态:
SHOW SLAVE STATUS\G → Slave_IO_Running: Yes, Slave_SQL_Running: Yes

MHA部署关键步骤

1 ) SSH免密认证(所有节点互信)

# 生成密钥(所有节点执行)
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
 
# 分发公钥(在每台节点执行)
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.3.100 
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.3.101
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.3.102 

ssh-copy-id 会自动检测重复:如果目标节点的 ~/.ssh/authorized_keys 中已有相同公钥,则跳过追加
验证命令:ssh root@192.168.3.102 date 应无密码验证提示

互信原理图解

公钥1
公钥1
公钥2
公钥2
公钥3
公钥3
节点1
节点2
节点3
  • 每个节点的 authorized_keys 文件包含所有节点的公钥。
  • 任意两个节点之间均可互相免密登录(如 node1 → node2、node2 → node3 均成立)。

强制要求:节点间需双向免密登录,避免主备切换后认证失败

扩展高效操作建议

  1. 使用脚本自动化:

    # 生成密钥(所有节点运行)
    for node in 100 101 102; do
      ssh root@192.168.3.$node "ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa"
    done 
    
    # 分发公钥(所有节点运行同一脚本)
    nodes=(192.168.3.100 192.168.3.101 192.168.3.102)
    for target_ip in "${nodes[@]}"; do
      ssh-copy-id root@$target_ip  # 自动推送当前节点的公钥 
    done
    
  2. 权限检查:

    • 确保 ~/.ssh 目录权限为 700。
    • 确保 authorized_keys 文件权限为 600。

2 ) 安装MHA组件

节点类型安装包依赖包
所有数据节点mha4mysql-nodeperl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch
监控节点(102)mha4mysql-managerperl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

简单来看

节点类型所需软件包
数据节点 (所有服务器)mha4mysql-node + Perl依赖包
监控节点 (192.168.3.102)mha4mysql-manager + Perl/Core依赖包
# 数据节点安装 100/101/102
yum install perl-DBD-MySQL perl-Config-Tiny -y 
rpm -ivh mha4mysql-node-0.58.rpm
 
# 监控节点安装 102
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
# yum install -y perl-Config-IniFiles perl-Time-HiRes perl-Parallel-ForkManager
rpm -ivh mha4mysql-manager-0.58.rpm

注意:

  • 数据节点仅需 perl-DBD-MySQL 和 perl-Config-Tiny,无需其他模块
  • 监控节点需补充 perl-Log-Dispatch 和 perl-Parallel-ForkManager,否则Manager服务可能启动失败
MHA配置文件详解 (/etc/mha/mha.cnf)
[server default]
user=mha                                    # 数据库管理用户
password=123456                             
manager_workdir=/home/mysql/mha             # MHA工作目录
remote_workdir=/home/mysql/mha              # 远程节点工作目录
ssh_user=root                               # SSH用户(已免密)
repl_user=replay                            # 复制账号 
repl_password=123456                        
ping_interval=1                             # 主库存活检测间隔(秒)
master_binlog_dir=/home/mysql/log           # 统一二进制日志路径
master_ip_failover_script=/usr/bin/master_ip_failover  # VIP切换脚本
secondary_check_script=/usr/bin/masterha_secondary_check  # 多路径检测脚本

[server1]
hostname=192.168.3.100 
candidate_master=1                          # 允许升主
 
[server2]
hostname=192.168.3.101 
candidate_master=1
 
[server3]
hostname=192.168.3.102 
no_master=1                                 # 禁止升主(兼监控节点)

VIP漂移脚本 (/usr/bin/master_ip_failover)

#!/bin/bash 
my_vip=192.168.3.90/24 
interface=eth0
 
case $1 in 
  start|stop)
    # VIP管理逻辑(由MHA自动调用)
    ifconfig $interface $my_vip || exit 1 
    ;;
  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;
esac 

或

#!/bin/bash
myVIP=192.168.3.90 
interface=eth0
 
case $1 in
  start|stop)
    # VIP转移逻辑
    /sbin/ip addr $1 $myVIP/24 dev $interface ;;
  *)
    echo "Usage: $0 {start|stop}"
    exit 1 ;;
esac 

或

#!/bin/bash 
myVIP=192.168.3.90           # 虚拟 IP 
myIFACE="eth0"               # 网卡接口 
无需修改以下逻辑 
command=$1 
orig_master_host=$2 
new_master_host=$3
 
case $command in
  stop|stopssh)
    /sbin/ip addr del $myVIP/24 dev $myIFACE ;;
  start)
    /sbin/ip addr add $myVIP/24 dev $myIFACE ;;
  *)
    echo "Usage: $0 {start|stop|stopssh}" 
    exit 1 ;;
esac

脚本权限:chmod +x /usr/bin/master_ip_failover

多路径检测脚本,使用MHA内置脚本:masterha_secondary_check

MHA启动与故障转移验证

1 ) 配置文件校验

# 检查SSH连通性
masterha_check_ssh --conf=/etc/mha/mha.cnf
 
# 检查主从复制状态
masterha_check_repl --conf=/etc/mha/mha.cnf

2 ) 启动监控服务

nohup masterha_manager --conf=/etc/mha/mha.cnf > /home/mysql/mha/manager.log 2>&1 &

3 ) 手动绑定初始VIP(主库执行)

ifconfig eth0:0 192.168.3.90/24
# 或
ip addr add 192.168.3.90/24 dev eth0

4 ) 模拟主库故障(主动停止主库mysqld)

# 在主节点(100)执行
systemctl stop mysqld 

5 ) 自动切换验证

检测项预期结果
新主库IP192.168.3.101绑定VIP 192.168.3.90
从库指向新主192.168.3.102自动指向192.168.3.101为主
MHA日志记录故障转移事件及VIP迁移过程
  • VIP 漂移:192.168.3.90 自动迁移至 192.168.3.101

    ip addr show eth0  # 在新主库验证 VIP 存在 
    
  • 复制拓扑切换:192.168.3.102 自动指向新主库 192.168.3.101

    SHOW SLAVE STATUS\G  -- 确认 Master_Host 变为 192.168.3.101 
    
  • 切换日志关键输出:

    • Master failover to 192.168.3.101 completed successfully
技术架构优劣分析

优势局限性
无损数据迁移:GTID+Binlog日志补偿确保数据一致性VIP依赖脚本:需自定义网络层切换漂移逻辑
分钟级故障恢复:自动选主+VIP漂移无读写分离:需配合中间件实现
单点风险:Manager 自身需高可用部署
轻量级部署:无中心节点单点依赖
无需额外硬件/中间件
主库检测单一:依赖网络层ping检测

生产建议:

  • 使用Keepalived替代自定义脚本实现VIP高可用
  • 对 Manager 节点部署双活监控
  • 启用 secondary_check_script 避免网络抖动误判
  • 增加多区域网络探测避免脑裂
  • 启用半同步复制降低数据丢失风险
关键补充技术点

1 ) GTID复制原理

  • 全局事务ID(GTID= source_id:transaction_id)
  • 从库通过Retrieved_Gtid_Set/Executed_Gtid_Set追踪事务进度

2 ) MHA故障转移流程

主库宕机
SSH登录检查存活
选择最新数据的从库升主
应用差异日志
漂移VIP至新主
重构其他从库复制链路

3 ) 数据一致性保障(日志补偿机制)

当主库宕机时,MHA执行:

  • 从旧主库拷贝未发送的二进制日志
  • 从最新从库应用这些日志
  • 确保所有节点数据对齐后切换
技术要点总结
  1. GTID一致性:所有节点必须启用GTID模式

  2. 目录规范:集群内binlog路径必须统一

  3. 权限最小化:

    CREATE USER 'mhauser'@'192.168.3.%' IDENTIFIED BY '123456';
    GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'mhauser'@'192.168.3.%';
    
  4. 故障转移逻辑:

    ping_interval=1
    主库宕机
    MHA检测
    确认主库不可达
    选举新主库 candidate_master=1
    调用master_ip_failover迁移VIP
    重建复制链路
  5. 生产建议:

    • 密码策略:使用强密码替代123456
    • 网络检测:配置多路径检测脚本避免误判
    • 日志监控:定期检查/home/mysql/mha/manager.log

关键说明:

  1. VIP配置时机:MHA不会在初始主库自动绑定VIP,需手动初始化
  2. binlog位置:集群中所有节点master_binlog_dir必须一致
  3. 节点角色隔离:通过no_master=1禁止监控节点成为主库
  4. 故障检测机制:ping_interval + secondary_check双验证策略

MHA核心优势与关键局限性

核心优势

1 ) 灵活的二次开发能力

  • MHA 基于 Perl 脚本开发,支持开源定制。提供标准化脚本接口,允许开发者使用 Perl 或 Python/Shell等语言扩展功能(如虚拟 IP 配置、邮件通知),只需确保参数与返回值规范一致即可集成
  • 示例脚本接口兼容性:
    # VIP 配置脚本示例 (Python)  
    def configure_vip(primary_ip, vip):  
        # 调用系统命令绑定 VIP  
        subprocess.run(f"ifconfig eth0:1 {vip} netmask 255.255.255.0 up", shell=True)  
        return {"status": "success", "vip": vip}  # 返回值需符合 MHA 规范  
    
  • 示例2
    # Python示例:虚拟IP切换脚本(MHA接口调用)
    import subprocess
    def assign_vip(new_master_ip, vip='192.168.1.100'):
        subprocess.run(f"ifconfig eth0:1 {vip} netmask 255.255.255.0 up", shell=True)
        # 可扩展:添加ARP广播更新逻辑 
    

2 ) 全面支持现代 MySQL 复制技术

  • 支持 GTID(全局事务标识)复制,相比传统二进制日志点位复制,显著提升数据一致性,避免主从切换后事务丢失风险
  • 原生兼容半同步复制(Semisynchronous Replication),确保事务提交至少同步到一个从库,最大限度保障数据安全
  • 与早期工具(如MMM)不同,MHA支持基于GTID的复制,通过全局事务标识符确保数据一致性,避免传统位点复制的主从不一致风险
    -- 启用GTID复制(主库配置)
    SET GLOBAL gtid_mode=ON;
    SET GLOBAL enforce_gtid_consistency=ON;
    

3 ) 智能故障切换机制

  • 主库故障时自动选择 数据最新的从库 提升为新主库,通过比对 中继日志(Relay Log)位置 实现精准决策
  • 最大程度保留原主库日志,配合 mysqlbinlog 工具恢复未同步事务,降低数据丢失概率
  • 主库宕机时,自动对比从库日志偏移量,选择数据最完整的从库提升为新主库
    • 通过binlog日志抢救机制,最大限度保留原主库未同步事务
    • 结合半同步复制(Semisynchronous Replication),确保已提交事务不丢失:
      -- 启用半同步复制
      INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
      SET GLOBAL rpl_semi_sync_master_enabled=1;
      

4 ) 多集群集中监控

  • 单监控节点可管理 多组主从复制集群,独立执行各集群故障切换,大幅节省服务器资源。
关键局限性

1 ) 虚拟 IP(VIP)管理缺失

  • 需手动开发脚本或依赖第三方工具(如 Keepalived) 实现主库 VIP 漂移
  • 无法自动为从库分配 VIP,导致故障从库剔除需人工干预,运维复杂度高于 MMM
  • Keepalived 冲突风险:第三方工具接管 VIP 时,破坏 MHA 自动选主逻辑,增加部署复杂度
    # Keepalived配置示例(与MHA冲突)
    vrrp_instance DB_HA {
        state MASTER 
        interface eth0
        virtual_router_id 51 
        priority 100
        virtual_ipaddress { 192.168.1.100/24 }
    }
    

2 ) 复制链路监控不足

  • MHA仅在启动/切换时检查主从链路,运行中不持续监控复制状态(如延迟、中断),无法自动隔离异常从库
  • 仅在校验启动和切换时检查主从链路,运行期无法实时检测以下问题:
    • 复制中断(Replication Break)
    • 主从延迟(Replication Lag)
  • 无法自动隔离异常从库(如 MMM 的读 VIP 切换机制),需手动排查

3 ) SSH 免密登录的安全风险

  • 强制要求所有节点(含监控服务器)配置 SSH 互信
  • 任一节点凭证泄露将威胁整个集群安全,多集群监控模式下风险指数级上升
  • 多集群统一监控时,安全威胁范围进一步扩大

4 ) 缺乏负载均衡能力

  • 不提供读流量分发功能,需额外集成代理中间件(如 ProxySQL或HAProxy)实现从库负载均衡
  • 原生 SQL 分流示例:
    /* ProxySQL 路由规则示例 */
    INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup)  
    VALUES (1, 1, '^SELECT', 10); -- 读流量路由至从库组  
    
    -- ProxySQL配置读组示例 
    INSERT INTO mysql_servers(hostgroup_id, hostname, port) 
    VALUES (10, 'slave1', 3306), (10, 'slave2', 3306);
    
技术实践补充

1 ) 应用层通过连接池VIP访问数据库,MHA切换后自动重连新主库:

// NestJS TypeORM 配置(使用VIP)
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: '192.168.1.100', // 指向VIP
      port: 3306,
      retryAttempts: 10,
      retryDelay: 3000,
    }),
  ],
})

2 ) NestJS 集成 MHA 切换通知服务

// MHA 切换事件处理模块 (NestJS)
import { Process, Injectable } from '@nestjs/common';
import { exec } from 'child_process';
 
@Injectable()
export class MhaEventHandler {
  
  @Process('failover_complete')
  async handleFailover(data: { newMaster: string }) {
    // 调用自定义 VIP 切换脚本 
    exec(`python /scripts/vip_handler.py --new-master=${data.newMaster}`, (err) => {
      if (err) this.sendAlert(`VIP 切换失败: ${err}`);
    });
    
    // 发送邮件通知
    this.sendEmail(`主库已切换至 ${data.newMaster}`);
  }
 
  private sendAlert(message: string) {
    // 集成告警系统(如 Prometheus AlertManager)
  }
}

安全加固建议

限制 SSH 访问范围(iptables 示例)
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT  # 仅允许内网访问 
iptables -A INPUT -p tcp --dport 22 -j DROP

3 )增强复制监控方案

补充Perl监控脚本,定时检测Seconds_Behind_Master:

# 监控从库延迟
my $delay = $dbh->selectrow_array("SHOW SLAVE STATUS")->{Seconds_Behind_Master};
die "Slave lag > 60s!" if $delay > 60;
总结对比

能力MHAMMM
GTID 支持✅❌ (传统二进制日志点位复制)
VIP 管理❌ (需自定义脚本)✅ 原生支持
复制链路监控❌ (仅切换时检查)✅ 实时监控
数据安全性⭐⭐⭐⭐ (半同步+日志保留)⭐⭐⭐

换个角度:

维度优势局限
数据安全GTID+半同步复制+日志抢救运行中复制状态监控缺失
高可用智能选主+多集群监控VIP管理依赖外部组件
扩展性脚本接口开放,支持多语言扩展无内置负载均衡
安全-SSH全信任模型风险

核心结论:

MHA 在数据一致性保障和集群扩展性上优势显著,但需通过脚本/第三方工具弥补 VIP 管理缺陷,并严格管控 SSH 安全风险

生产环境需组合MHA+Keepalived+ProxySQL,前者负责故障切换与数据保全,后两者分别实现VIP漂移与读负载均衡,同时通过Prometheus+Alertmanager补强实时监控

基于MHA搭建MySQL集群高可用架构 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且能在最大程度上保证数据的一致性,以达到真正意义上的高可用。 阅读详情

相关推荐

基于 MHA 的 MySQL 高可用主从架构

基于 MHA 的 MySQL 高可用主从架构。

RAB 1353

MYSQL高可用MHA一:GTID方式主从复制

MYSQL高可用MHA一:GTID方式主从复制详细搭建和错误集锦

weixin_42333478的博客 1003

MySQL高可用架构:MHA

MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间,MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。

eeeeebv的博客 1247

Mysql mha+GTID+半同步复制(一主二从)

在OracleLinux 7.9环境上部署MySQL 5.7.37版本一主二从复制架构,部署MHA manager节点部署在slave02上。为防止脑裂发生,推荐生产环境上才用脚本的方式管理虚拟IP,而不是使用keepalived来完成;首先创建failover、online脚本的目录,添加虚拟VIP,命令如下;在slave01上查看vip,能够查看到VIP已经漂移到slave01节点。当master节点宕机并发生切换之后,MHA监控服务会随之被关闭掉。,需要手动处理,并将原。恢复后,不会自动转成。

m0_72093175的博客 1174

MySQL MHA 高可用集群搭建

本文详细介绍了基于 MySQL 8.0 的 MHA(Master High Availability)高可用集群搭建流程,核心采用 “Master 主库与 MHA Manager 管理节点合一” 的架构,仅需 3 台物理服务器即可实现 MySQL 高可用。全文围绕 “主从复制搭建→服务器免密通信配置→MHA 组件安装与启动→故障切换(手动 / 自动)→VIP 漂移配置” 五大核心步骤展开,采用 GTID 复制模式保障数据一致性,通过虚拟 IP(VIP)实现应用访问透明化,最终达成主库故障时快速切换

racwwt的博客 1306

MySQL高可用之MHA架构企业实战

MHA目前在MySQL高可用方面是一个相对成熟的解决方案,最近客户需求,特分享部署方案给大家

IT邦德 6701

MySQL MHA 高可用架构搭建:基于 GTID + 半同步复制

新建虚拟机(VMware 为例)点击「创建新的虚拟机」→ 选择「典型」→ 选择 Linux 系统 ISO(与主从节点一致)。通过以上步骤,实现了基于独立管理节点的 MHA 高可用架构,结合 GTID 和半同步复制,兼顾数据一致性与服务连续性。配置 SSH 互信(管理节点 ↔ 主从节点 + 主从节点互信)安装管理包(仅管理节点 192.168.238.135)安装节点包(所有节点,包括管理节点)(所有 MySQL 节点都需安装)(仅 MHA 管理节点安装)安装依赖包(所有节点执行)启动 MHA 管理进程。

yifengyiyufjq的博客 981

MHA集群部署(GTID+vip+Sendmail+binlogserver).docx

MHA GTID sendmail VIP binlogserver 所有的部署安装了,傻瓜式教程

MySQL--MHA与GTID

##==========================================## MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始支持基于GTID的复制,在发生故障切换时判断群集是否能采用基于GTID的方式进行切换 ##==========================================##基于GTID进行故...

weixin_33847182的博客 625

MYSQL 5.7 MHA(GTID+ROW)部署

MYSQL 5.7 MHA(GTID+ROW)部署 Mysql 数据库GDIT主从复制

mysql mha相关的包perl-Log-Dispatch

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

MHA高可用

MHA高可用 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/manager.log 2>&1 & 一.MHA简介 1.作者:松信嘉範 2.软件简介 MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复

HD243608836的博客 836

perl-Log-Dispatch-2.27-1.el6.noarch

用于搭建MHA高可用,测试安装包可以运行,并且多次用次安装包安装成功

MySQL高可用之MHA

​ MHA(Master High Availability)是一套针对MySQL的高可用解决方案,能实现自动故障检测与主从切换,有效减少MySQL故障恢复时间,提高服务可用性。​ MHA适用于一主多从的MySQL架构,广泛应用于需要高可用保障的生产环境,尤其适合对数据库 downtime 敏感的业务场景。不过需要注意的是,它本身不提供负载均衡功能,通常需与其他工具(如ProxySQL、HAProxy)配合使用以实现读写分离和流量切换。

m0_57611641的博客 1229

TI AWR2944毫米波雷达开发板开箱:用官方Demo快速上手3D点云与热图生成

本文详细介绍了TI AWR2944毫米波雷达开发板的开箱与实战应用,包括硬件准备、软件开发环境搭建、Demo固件刷写与配置、实时可视化与数据解析等全流程指南。通过官方Demo快速上手3D点云与热图生成,帮助开发者高效掌握毫米波雷达技术在工业检测、智能交通等领域的应用。

weixin_42627853的博客 309

AD56XXR系列DAC驱动设计:SPI接口、寄存器配置与嵌入式工程实践

数模转换器(DAC)是嵌入式系统实现高精度模拟控制的核心器件,其性能取决于通信协议可靠性、寄存器配置准确性及硬件协同设计能力。基于SPI总线的电压输出型DAC广泛应用于工业控制、光模块偏置、传感器校准等场景,需兼顾静态精度、动态响应与低功耗特性。AD56XXR系列作为典型集成内部基准与多通道同步更新能力的12/14/16位DAC,支持轨到轨输出与灵活掉电模式,为资源受限MCU提供可移植固件范式。本文围绕SPI时序约束、16位指令字解析、LDAC同步机制及精度补偿策略展开,覆盖从硬件连接、初始化流程到量产级可

weixin_33481022的博客 611

10.MHA的部署(非gtid模式)

MHA是一套相对成熟的MySQL高可用方案,能在0~30s内自动完成数据库的故障切换操作,在master服务器不宕机的情况下,基本能保证数据的一致性。

weixin_42257277的博客 655

ComfyUI新手必看:JoyCaption 2插件安装全流程(附百度网盘资源)

本文为ComfyUI新手提供了JoyCaption 2插件的完整安装与部署指南。详细介绍了从环境准备、插件获取、模型文件配置到核心节点使用的全流程,并重点解析了其集成的LLM反推模式,帮助用户高效实现从图片到精准提示词的转换。

mango的博客 303

MHA搭建

环境准备 三台虚拟机(mysql gtid主从复制环境) hostname IP db01 10.0.0.51 db02 10.0.0.52 db03 10.0.0.53 1.1.1 配置关键程序软连接 ln -s /data/app/mysql5.7/bin/mysqlbinlog /usr/bin/mysqlbinlog ln -s /data/app/mys...

weixin_43046446的博客 243

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

说说PSTN、ISDN、 ADSL三种互联网接入方式的区别。

互联网的接入方式: 电话拨号接入(PSTN) ISDN接入 ADSL接入 Cable MODEM接入 局域网接入 光纤接入(FDDI) 卫星接入 DDN专线 目前来说,ADSL和Cable MODEM比较常用,今天我们就先来说说PSTN、ISDN和ADSL的区别。 电话拨号接入(PSTN/POTS,Public Switched Telephone Network / Public Oold Telephone Service) 数据终端设备(DTE)通过数据通信设备(DCE)再连

Winyaz的博客 2万+

MySQL生产环境高可用架构详解

MySQL生产环境高可用架构详解

yemuxiaweiliang的博客 611

C# 上位机内存泄漏排查指南:3 个工具 + 4 个技巧,从 GC 频繁到稳定运行 720 小时

C# 上位机内存泄漏排查的核心是「先定位泄漏存在,再追溯引用根源,最后修复验证通过「Visual Studio 诊断工具(快速定位)+ dotMemory(深度分析)+ PerfView(生产监控)」三个工具的配合,结合「复现场景、排查静态成员+事件、检查非托管资源、GC 日志验证」四个技巧,可高效解决绝大多数泄漏问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 739

MHA 高可用 MySQL 架构实战部署

本文详细介绍了MySQL MHA高可用集群的搭建与实践。首先阐述了MHA的核心功能和原理,包括自动故障转移、GTID支持和极低宕机时间等特点。随后通过实验环境搭建展示了具体实施步骤:从系统准备、MySQL主从配置,到MHA Manager和Node的安装部署。重点讲解了ProxySQL的联动配置和故障切换验证过程,包括模拟主库宕机、自动选举新主库、数据同步验证等关键环节。最后提供了原主库恢复为从库的完整数据恢复方案。整个方案实现了MySQL主库故障时的自动切换,确保业务高可用性和数据一致性。

m0_75006854的博客 2291

AI训练师三级考证避坑指南|假证辨别+机构套路+OSTA验证

这是最基础的问题,也是最容易忽略的问题。人工智能训练师三级证书本身是有价值的——政府认可的职业技能等级证书、多地紧缺工种补贴、人才引进加分。但正因为有价值,才引来了大量骗子。记住三句话OSTA查不到的证,一分钱都不值声称免考包过的,100%是骗子培训费一次性谈清楚,后续加价直接走人如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》99篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1222

【Davinci开发】:CS接口创建及连接

AUTOSAR SWC之间添加CS-port :详细讲解step

2529
上一篇: MySQL: 高可用架构设计与MMM方案深度解析
下一篇: MySQL: 数据库读写分离与负载均衡的实现方式及深度分析
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值