全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-15 10 分钟 ✍️ juanwangdev

MySQL 高可用方案MHA与Orchestrator

高可用是数据库架构的核心要求,MHA 和 Orchestrator 是 MySQL 最常用的两种方案。

MHA(Master High Availability)

架构原理

ini
                    ┌──────────────┐
                    │   MHA Manager │
                    │  (监控+切换)   │
                    └──────┬───────┘
                           │ 监控
          ┌────────────────┼────────────────┐
          │                │                │
    ┌─────┴─────┐    ┌─────┴─────┐    ┌─────┴─────┐
    │  Master   │───▶│  Slave1   │    │  Slave2   │
    │ (主库)    │复制│  (从库)   │复制│  (从库)   │
    └───────────┘    └───────────┘    └───────────┘

核心组件:

  • MHA Manager:监控主库健康,协调故障切换
  • MHA Node:运行在每个 MySQL 节点上,执行具体切换脚本

故障切换流程

Bash
1. 检测主库故障(连续3次心跳失败)
         ↓
2. 确认主库宕机
         ↓
3. 从各从库读取最新 binlog 位置
         ↓
4. 选择数据最新的从库作为新主库
         ↓
5. 其他从库补齐差异数据(relay log)
         ↓
6. 提升新主库,配置其他从库复制
         ↓
7. 可选:VIP 漂移或 DNS 切换
         ↓
8. 发送告警通知

部署配置

配置文件:/etc/mha/app1.cnf

Bash
[server default]
# Manager 配置
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log

# SSH 配置(免密登录)
ssh_user=root
ssh_port=22

# MySQL 用户
user=mha
password=mha_password

# 复制用户
repl_user=repl
repl_password=repl_password

# 切换脚本
master_ip_failover_script=/usr/local/bin/master_ip_failover
shutdown_script=""
report_script=/usr/local/bin/send_report

# 检测间隔(秒)
ping_interval=3

[server1]
hostname=192.168.1.101
port=3306
candidate_master=1

[server2]
hostname=192.168.1.102
port=3306
candidate_master=1

[server3]
hostname=192.168.1.103
port=3306
no_master=1

VIP 切换脚本:master_ip_failover

JSON
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";

sub start_vip {
    my $output = `$ssh_start_vip 2>&1`;
}

sub stop_vip {
    my $output = `$ssh_stop_vip 2>&1`;
}

MHA 常用命令

Bash
# 检查 SSH 免密登录
masterha_check_ssh --conf=/etc/mha/app1.cnf

# 检查复制状态
masterha_check_repl --conf=/etc/mha/app1.cnf

# 启动监控
masterha_manager --conf=/etc/mha/app1.cnf

# 手动切换(主库正常时)
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive

# 手动切换(主库故障时)
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=dead

MHA 优缺点

优点缺点
切换时间短(10-30秒)不支持 GTID(需额外处理)
数据丢失最少开源版已停止维护
配置灵活需 SSH 免密
支持在线切换仅支持一主多从

Orchestrator

架构原理

Bash
┌─────────────────────────────────────────┐
│           Orchestrator                    │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐   │
│  │ Web UI  │  │  API    │  │  后端存储│   │
│  └─────────┘  └─────────┘  └────┬────┘   │
└────────────────────────────────┼────────┘
                                 │
        ┌────────────────────────┼────────────────────────┐
        │                        │                        │
  ┌─────┴─────┐           ┌──────┴─────┐          ┌──────┴─────┐
  │  Master   │◀─────────│  Replica1  │          │  Replica2  │
  └───────────┘   复制    └────────────┘          └────────────┘

核心特性:

  • 拓扑感知:自动发现复制拓扑
  • 伪 GTID:无需 GTID 也能精确定位
  • 多后端存储:支持 MySQL、SQLite、PostgreSQL
  • Web UI:可视化管理和操作
  • Hook 机制:可扩展自动化脚本

故障切换流程

text
1. 连续探测失败(默认多次)
         ↓
2. 确认主库不可达
         ↓
3. 分析复制拓扑,选择最佳候选
         ↓
4. 验证候选主库数据最新
         ↓
5. 原子切换:重构复制关系
         ↓
6. 调用 Hook 脚本(通知、VIP等)
         ↓
7. 记录切换历史

部署配置

配置文件:/etc/orchestrator.conf.json

text
{
  "ListenAddress": ":3000",
  "MySQLTopologyUser": "orchestrator",
  "MySQLTopologyPassword": "orchestrator_password",
  "BackendDB": "mysql",
  "MySQLOrchestratorHost": "127.0.0.1",
  "MySQLOrchestratorPort": 3306,
  "MySQLOrchestratorDatabase": "orchestrator",
  "MySQLOrchestratorUser": "orchestrator",
  "MySQLOrchestratorPassword": "orchestrator_password",

  "RecoveryPeriodBlockMinutes": 60,
  "RecoveryIgnoreHostnameFilters": [],
  "RecoverMasterClusterFilters": ["*"],

  "PostFailoverProcesses": [
    "/usr/local/bin/failover_hook.sh {failureType} {failedHost} {failureCluster} {successorHost}"
  ],

  "PostMasterFailoverProcesses": [
    "/usr/local/bin/master_failover_hook.sh {failedHost} {successorHost}"
  ],

  "PseudoGTIDPattern": "drop view if exists `_pseudo_gtid_`",
  "DetectPseudoGTIDQuery": "show global status like 'PseudoGTIDStatus'"
}

故障切换 Hook 脚本

text
#!/bin/bash
# /usr/local/bin/master_failover_hook.sh

FAILED_HOST=$1
SUCCESSOR_HOST=$2

# VIP 漂移
ssh root@$FAILED_HOST "ip addr del 192.168.1.100/24 dev eth0"
ssh root@$SUCCESSOR_HOST "ip addr add 192.168.1.100/24 dev eth0"

# DNS 更新
nsupdate <<EOF
update delete db-master.example.com A
update add db-master.example.com 300 A $SUCCESSOR_HOST
send
EOF

# 告警通知
curl -X POST "https://hook.example.com/alert" \
  -d "{\"text\": \"MySQL Failover: $FAILED_HOST -> $SUCCESSOR_HOST\"}"

Orchestrator 常用命令

text
# 发现实例
orchestrator -c discover -i 192.168.1.101:3306

# 查看拓扑
orchestrator -c topology -i 192.168.1.101:3306

# 手动切换主库
orchestrator -c repoint -i 192.168.1.102:3306

# 故障恢复
orchestrator -c recover -i 192.168.1.101:3306

# 重置恢复周期
orchestrator -c reset-recovery-period -i 192.168.1.101:3306

Web UI 操作

访问 http://orchestrator-host:3000

功能说明
Clusters查看所有集群
Topology可视化复制拓扑
Audit操作审计日志
Agents节点健康状态
Failover手动/自动切换

Orchestrator 优缺点

优点缺点
支持非 GTID 模式学习曲线较陡
活跃开发维护依赖较多组件
Web UI 可视化配置相对复杂
支持多数据中心切换时间略长
伪 GTID 精确定位需要额外存储

方案对比

特性MHAOrchestrator
开发状态停止维护活跃开发
GTID 支持需额外处理原生支持
非 GTID 支持支持支持(伪 GTID)
Web UI
切换速度10-30秒30-60秒
配置复杂度简单较复杂
多集群管理不支持支持
扩展性脚本Hook 机制

选型建议

场景推荐方案
传统架构、快速上线MHA
非 GTID 环境Orchestrator
多集群统一管理Orchestrator
需要可视化运维Orchestrator
已有 GTID 环境Orchestrator
追求最快切换MHA

要点总结

  1. MHA:轻量级、切换快、配置简单,适合快速部署
  2. Orchestrator:功能全面、可视化、活跃维护,适合现代架构
  3. 切换流程:检测故障 → 选新主 → 数据同步 → 切换完成
  4. VIP 管理:故障切换后需自动漂移 VIP 或更新 DNS
  5. 监控告警:切换后必须发送通知,确保运维感知

📝 发现内容有误?点击此处直接编辑

← 上一篇 MySQL 分库分表策略
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库