MySQL 完全指南 / 第 16 章:高可用
第 16 章:高可用
保证 MySQL 7×24 不间断服务,是 DBA 的核心职责。本章详解 MHA、MGR、ProxySQL 等高可用方案。
16.1 高可用指标
| 指标 | 说明 | 目标值 |
|---|
| 可用性 | 年正常运行时间比例 | 99.99%(年停机 < 53 分钟) |
| RTO | 恢复时间目标 | < 30 秒 |
| RPO | 恢复点目标(数据丢失量) | 0(零数据丢失) |
16.2 常见高可用架构
| 方案 | RTO | RPO | 复杂度 | 适用场景 |
|---|
| 主从 + 手动切换 | 分钟级 | 可能有 | 低 | 小规模 |
| MHA | 10-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 创建集群
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 + binlog | PITR 能力 |
扩展阅读