强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

MySQL 完全指南 / 第 16 章:高可用

第 16 章:高可用

保证 MySQL 7×24 不间断服务,是 DBA 的核心职责。本章详解 MHA、MGR、ProxySQL 等高可用方案。


16.1 高可用指标

指标说明目标值
可用性年正常运行时间比例99.99%(年停机 < 53 分钟)
RTO恢复时间目标< 30 秒
RPO恢复点目标(数据丢失量)0(零数据丢失)

16.2 常见高可用架构

方案RTORPO复杂度适用场景
主从 + 手动切换分钟级可能有小规模
MHA10-30秒可能有中等规模
MGR (Group Replication)秒级0要求强一致
InnoDB Cluster秒级0官方推荐方案
ProxySQL + 主从秒级可能有读写分离
MySQL NDB Cluster秒级0特殊场景

16.3 MHA(Master High Availability)

16.3.1 架构

MHA Manager                    MySQL 集群
┌──────────────┐              ┌──────────────┐
│ MHA Manager  │    监控      │   Master     │
│ (故障检测)    │ ──────────→ │  (可写)      │
│              │              └──────────────┘
│              │              ┌──────────────┐
│              │    监控      │   Slave 1    │
│              │ ──────────→ │  (候选主)    │
│              │              └──────────────┘
│              │              ┌──────────────┐
│              │    监控      │   Slave 2    │
│              │ ──────────→ │  (只读)      │
└──────────────┘              └──────────────┘

16.3.2 核心功能

  • 自动故障检测
  • 自动主从切换(选举新主)
  • 补偿差异数据(从其他从库获取缺失的 Binlog)
  • VIP 漂移(应用无感知)

16.4 MGR(MySQL Group Replication)

16.4.1 概述

MGR 是 MySQL 官方的组复制方案,基于 Paxos 协议实现多节点数据一致性。

模式说明适用场景
单主模式(Single-Primary)一个可写主 + 多个只读从绝大多数场景
多主模式(Multi-Primary)所有节点都可写特殊需求,限制较多

16.4.2 配置

# my.cnf - 所有节点
[mysqld]
server-id = 1                    # 每个节点不同
gtid_mode = ON
enforce_gtid_consistency = ON
binlog_checksum = NONE
log_bin = mysql-bin
binlog_format = ROW
log_slave_updates = ON
relay_log = relay-bin

# Group Replication 配置
plugin_load_add = 'group_replication.so'
group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"  # 集群UUID
group_replication_start_on_boot = OFF
group_replication_local_address = "192.168.1.100:33061"  # 每个节点不同
group_replication_group_seeds = "192.168.1.100:33061,192.168.1.101:33061,192.168.1.102:33061"
group_replication_single_primary_mode = ON
-- 第一个节点(引导节点)
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;

-- 其他节点
START GROUP_REPLICATION;

-- 查看组成员
SELECT * FROM performance_schema.replication_group_members;

16.5 InnoDB Cluster

16.5.1 架构

InnoDB Cluster = Group Replication + MySQL Shell + MySQL Router

应用层
    ↓
MySQL Router(自动路由)
    ↓
InnoDB Cluster
├── Instance 1(Primary,可写)
├── Instance 2(Secondary,只读)
└── Instance 3(Secondary,只读)

16.5.2 使用 MySQL Shell 创建集群

// 连接到 MySQL Shell
// mysqlsh root@localhost

// 检查实例配置
dba.checkInstanceConfiguration('root@192.168.1.100:3306');
dba.checkInstanceConfiguration('root@192.168.1.101:3306');
dba.checkInstanceConfiguration('root@192.168.1.102:3306');

// 配置实例
dba.configureInstance('root@192.168.1.100:3306');
dba.configureInstance('root@192.168.1.101:3306');
dba.configureInstance('root@192.168.1.102:3306');

// 创建集群
var cluster = dba.createCluster('myCluster');

// 添加实例
cluster.addInstance('root@192.168.1.101:3306');
cluster.addInstance('root@192.168.1.102:3306');

// 查看集群状态
cluster.status();

16.6 ProxySQL 读写分离

16.6.1 安装

# Docker 方式
docker run -d \
  --name proxysql \
  -p 6033:6033 \
  -p 6032:6032 \
  proxysql/proxysql:latest

16.6.2 配置

-- 连接 ProxySQL 管理接口
mysql -h 127.0.0.1 -P 6032 -uradmin -pradmin

-- 添加后端 MySQL 服务器
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, comment) VALUES
(10, '192.168.1.100', 3306, 1, 'write-master'),
(20, '192.168.1.101', 3306, 1, 'read-slave-1'),
(20, '192.168.1.102', 3306, 1, 'read-slave-2');

-- 创建监控用户
INSERT INTO mysql_users (username, password, default_hostgroup) VALUES
('appuser', 'App!Pass123', 10);

-- 配置读写分离规则
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES
(1, 1, '^SELECT .* FOR UPDATE$', 10, 1),   -- FOR UPDATE 走主库
(2, 1, '^SELECT', 20, 1);                   -- 普通 SELECT 走从库

-- 加载配置
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;

-- 保存配置
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

16.7 故障切换流程

1. 故障检测(MHA/ProxySQL/Monitoring 发现主库不可用)
         ↓
2. 确认故障(多次检测确认,避免误判)
         ↓
3. 选举新主(选择数据最新的从库)
         ↓
4. 数据补偿(从其他从库获取缺失的 Binlog)
         ↓
5. 提升新主(STOP REPLICA; RESET REPLICA ALL;)
         ↓
6. 其他从库指向新主
         ↓
7. VIP 漂移 / 应用重连
         ↓
8. 旧主恢复后作为新从库加入

业务场景

场景 1:中小型系统高可用方案

组件方案说明
数据库层MGR(3节点)或一主两从数据冗余
代理层ProxySQL 或 MySQL Router读写分离 + 故障转移
监控Prometheus + Grafana实时告警
备份xtrabackup + binlogPITR 能力

扩展阅读