6.6.1 高可用架构演进与选型要点

高可用架构演进从“单机备份”到“主从复制”,再到“多副本集群与一致性协议”,核心驱动是业务连续性、可扩展性与故障恢复目标的提升。选型需围绕业务SLA与成本权衡,明确RPO/RTO目标、读写比例、一致性要求、跨机房容灾级别与团队运维能力。

文章图片

选型要点清单(可直接用于评审)#

  • RPO/RTO:RPO=0更倾向MGR;RTO分钟级可用主从+自动切换
  • 写入比例高:MGR或InnoDB Cluster;读多写少:主从+读写分离
  • 跨机房:优先异步复制+容灾切换,评估延迟与双写冲突
  • 复杂度:代理层(ProxySQL/HAProxy)带来额外故障域,需配合监控

示例:从单机到主从的最小演进(含关键命令)#

场景:单机MySQL升级为一主一从,目标RTO<10分钟
环境:主库 10.0.0.10 从库 10.0.0.11

1) 主库启用binlog并创建复制账号
/etc/my.cnf

[mysqld]
server_id=1
log_bin=mysql-bin
binlog_format=ROW
systemctl restart mysqld
mysql -uroot -p -e "CREATE USER 'repl'@'10.%' IDENTIFIED BY 'Repl@123';"
mysql -uroot -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.%'; FLUSH PRIVILEGES;"

2) 获取主库位点

mysql -uroot -p -e "SHOW MASTER STATUS\G"
# 记录 File 和 Position

3) 从库配置并启动复制
/etc/my.cnf

[mysqld]
server_id=2
read_only=ON
systemctl restart mysqld
mysql -uroot -p -e "
CHANGE MASTER TO
MASTER_HOST='10.0.0.10',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G"

预期效果Slave_IO_Running: YesSlave_SQL_Running: Yes

示例:加入半同步(缩短RTO风险)#

# 主从均安装半同步插件
mysql -uroot -p -e "INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';"
mysql -uroot -p -e "INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';"

# 主库开启半同步并设定超时
mysql -uroot -p -e "SET GLOBAL rpl_semi_sync_master_enabled=ON;"
mysql -uroot -p -e "SET GLOBAL rpl_semi_sync_master_timeout=5000;"

# 从库开启半同步
mysql -uroot -p -e "SET GLOBAL rpl_semi_sync_slave_enabled=ON;"

预期效果SHOW STATUS LIKE 'Rpl_semi_sync_master_status'; 返回 ON

示例:读写分离最小架构(ProxySQL示意)#

文章图片

简单路由示例(ProxySQL):

INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'10.0.0.10',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (20,'10.0.0.11',3306);
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (20,'10.0.0.12',3306);

-- 写入路由到10,读取路由到20
INSERT INTO mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) 
VALUES (1,1,'^SELECT',20,1);
LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;

排错清单(带命令)#

1) 复制中断

mysql -uroot -p -e "SHOW SLAVE STATUS\G"
# 关注 Last_IO_Error/Last_SQL_Error

2) 延迟过大

mysql -uroot -p -e "SHOW SLAVE STATUS\G" | egrep "Seconds_Behind_Master|Relay_Log_Space"
# 检查磁盘IO和网络
iostat -x 1 5
ping 10.0.0.10

3) 半同步不生效

mysql -uroot -p -e "SHOW VARIABLES LIKE 'rpl_semi_sync%';"
mysql -uroot -p -e "SHOW STATUS LIKE 'Rpl_semi_sync_master_status';"
# 若为OFF,多为从库未启用或网络抖动导致回退为异步

练习与演练#

1) 故障切换演练:模拟主库宕机,手动提升从库为主库

# 从库提升
mysql -uroot -p -e "STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only=OFF;"
# 应用切换连接到新主库

2) 一致性验证:在主库写入后从库读取验证延迟

mysql -uroot -p -h10.0.0.10 -e "CREATE DATABASE ha_test; USE ha_test; CREATE TABLE t(id INT PRIMARY KEY); INSERT INTO t VALUES(1);"
mysql -uroot -p -h10.0.0.11 -e "SELECT * FROM ha_test.t;"

3) 容量评估:在主库执行压力测试并观察复制延迟

sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=10.0.0.10 --mysql-user=root --mysql-password=pass \
  --mysql-db=sbtest --tables=5 --table-size=100000 \
  prepare
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=10.0.0.10 --mysql-user=root --mysql-password=pass \
  --mysql-db=sbtest --threads=16 --time=60 run

选型结论建议#

  • 先“可观测、可恢复”,再“可自动化”
  • 小团队优先主从+半同步+标准化切换脚本
  • 高一致性与高并发场景优先MGR/InnoDB Cluster
  • 跨机房避免强一致,采用异步+容灾演练与一致性校验