6.6.8 高可用方案对比与实践案例

在高可用架构与复制技术中,常见方案包括传统主从复制+VIP漂移、半同步复制+自动故障切换、GTID复制+MHA/Orchestrator、MGR/InnoDB Cluster、以及基于ProxySQL/HAProxy的读写分离架构。对比选型时需综合考虑一致性要求、恢复时间目标(RTO)、数据丢失目标(RPO)、运维复杂度、成本与生态成熟度。以下给出原理草图、安装与配置示例、排错与演练要点,便于落地实践。

文章图片

高可用方案对比关键点:
- 一致性:异步 < 半同步 < MGR强一致(多数派)。
- 切换方式:人工 < 脚本 < Orchestrator/MGR自动选主。
- 复杂度:主从+VIP最低;MGR最高但一致性最好。
- 适用:中小规模读多写少适合主从+ProxySQL;强一致或快速故障切换适合MGR/Orchestrator。


实践案例一:一主两从 + ProxySQL 读写分离 + Orchestrator 切换#

1) 安装与配置(示例)#

环境:M1(10.0.0.10), S1(10.0.0.11), S2(10.0.0.12), ProxySQL(10.0.0.20), Orchestrator(10.0.0.30)

MySQL主从与半同步示例:

# 主库
yum -y install mysql-community-server
systemctl enable --now mysqld

# 创建复制账户
mysql -uroot -p -e "CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';"
mysql -uroot -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';"

# 开启半同步
cat >> /etc/my.cnf <<'EOF'
[mysqld]
server_id=10
log_bin=mysql-bin
binlog_format=ROW
plugin_load_add='rpl_semi_sync_master=semisync_master.so'
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
EOF
systemctl restart mysqld

# 从库(S1/S2)
yum -y install mysql-community-server
systemctl enable --now mysqld

cat >> /etc/my.cnf <<'EOF'
[mysqld]
server_id=11
log_bin=mysql-bin
relay_log=relay-bin
read_only=1
plugin_load_add='rpl_semi_sync_slave=semisync_slave.so'
rpl_semi_sync_slave_enabled=1
EOF
systemctl restart mysqld

# 配置复制
# 在主库查看位置
mysql -uroot -p -e "SHOW MASTER STATUS\G"

# 在从库设置
mysql -uroot -p -e "
CHANGE MASTER TO
MASTER_HOST='10.0.0.10',
MASTER_USER='repl',
MASTER_PASSWORD='repl123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
"

ProxySQL 基础读写分离(示例)

# 安装
yum -y install proxysql

# 登录管理端口
mysql -uadmin -padmin -h 127.0.0.1 -P6032

# 添加后端
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES
(10,'10.0.0.10',3306,100),   -- 写
(20,'10.0.0.11',3306,100),   -- 读
(20,'10.0.0.12',3306,100);
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;

# 添加用户
INSERT INTO mysql_users(username,password,default_hostgroup) VALUES
('app','app123',10);
LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK;

# 读写规则
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^SELECT.*',20,1);
LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;

Orchestrator 发现拓扑与自动切换(示例)

# 安装
yum -y install orchestrator
cat >/etc/orchestrator.conf.json <<'EOF'
{
  "MySQLTopologyUser": "repl",
  "MySQLTopologyPassword": "repl123",
  "DiscoverByShowSlaveHosts": true,
  "ListenAddress": ":3000"
}
EOF
systemctl enable --now orchestrator

# 发现拓扑
orchestrator-client -c discover -i 10.0.0.10:3306

2) 故障演练与预期效果#

# 模拟主库宕机
systemctl stop mysqld  # 在M1
# Orchestrator 触发切换并提升S1为主(需配置自动恢复策略)

预期:ProxySQL 写组更新到新主库;从库重建复制链路。

3) 排错要点(含命令解释)#

  • 复制延迟:
mysql -uroot -p -e "SHOW SLAVE STATUS\G" | egrep "Seconds_Behind_Master|Slave_IO_Running|Slave_SQL_Running"
# Seconds_Behind_Master 为延迟,IO/SQL线程需为Yes
  • 半同步未生效:
mysql -uroot -p -e "SHOW STATUS LIKE 'Rpl_semi_sync_%';"
# Rpl_semi_sync_master_status=ON 表示半同步生效
  • ProxySQL 路由错误:
SELECT * FROM runtime_mysql_query_rules;
SELECT * FROM runtime_mysql_servers;

实践案例二:三节点 MGR 单主 + MySQL Router#

1) 原理草图#

文章图片

2) 安装与配置(示例)#

# 所有节点
cat >> /etc/my.cnf <<'EOF'
[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=mysql-bin
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="10.0.0.10:33061"
loose-group_replication_group_seeds="10.0.0.10:33061,10.0.0.11:33061,10.0.0.12:33061"
loose-group_replication_bootstrap_group=OFF
EOF
systemctl restart mysqld

# 安装插件并设置单主模式
mysql -uroot -p -e "INSTALL PLUGIN group_replication SONAME 'group_replication.so';"
mysql -uroot -p -e "SET GLOBAL group_replication_single_primary_mode=ON;"
mysql -uroot -p -e "SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;"

3) 切换验证#

# 查看主节点
mysql -uroot -p -e "SELECT * FROM performance_schema.replication_group_members;"
# 模拟主节点故障并观察新主选举
systemctl stop mysqld  # 在当前主

4) 排错#

  • 网络抖动导致成员掉线:
mysql -uroot -p -e "SHOW STATUS LIKE 'group_replication%';"
# group_replication_primary_member 查看当前主
  • 事务提交被拒绝:
mysql -uroot -p -e "SHOW VARIABLES LIKE 'group_replication_enforce_update_everywhere_checks';"

实践案例三:跨机房单活 + 异步灾备#

1) 架构草图#

文章图片

2) 关键配置与校验#

# 开启二进制日志并配置复制同案例一
# 定期校验
pt-table-checksum --host=10.0.0.10 --user=check --password=chk123
pt-table-sync --execute --sync-to-master h=10.0.0.12,u=check,p=chk123

3) 演练步骤#

  • 停主库服务 -> 应用切只读 -> 验证灾备库提升与数据一致性 -> 回切计划。

高可用评估矩阵与落地清单#

  • 复制类型:异步/半同步/强一致
  • 切换方式:人工/脚本/Orchestrator/MGR
  • 核心组件:Keepalived/Orchestrator/MGR/ProxySQL
  • 监控指标:复制延迟、IO/SQL线程状态、GTID差距、连接数、事务提交耗时
  • 演练:每季度故障注入、切换脚本审计、权限最小化

练习#

  1. 搭建一主两从并开启半同步,验证 Rpl_semi_sync_master_status=ON
  2. 使用 ProxySQL 实现 SELECT 走从库,写入走主库,抓包验证路由。
  3. 使用 Orchestrator 发现拓扑并模拟主库故障,记录 RTO/RPO。
  4. 搭建三节点 MGR 单主,验证主节点故障后的自动选主时间。