引言
各位数据库爱好者们好!今天我们要深入探讨MySQL高可用架构的核心技术——复制与集群 🏗️。在现代互联网应用中,数据库的高可用性就像建筑物的抗震设计一样重要,直接决定了系统的稳定性和可靠性。本教程将从主从复制原理讲起,逐步深入到各种复制拓扑结构、GTID复制等高级主题,让你全面掌握构建健壮MySQL架构的关键技术!💪
一、主从复制原理与配置
1.1 复制工作原理
MySQL复制就像数据同步的"传声筒",将主库变更传播到从库 📢:
复制三线程模型:
- 主库Binlog Dump线程:读取binlog事件并发送给从库
- 从库I/O线程:接收主库的binlog事件并写入relay log
- 从库SQL线程:读取relay log中的事件并重放执行
复制流程:
1.2 主从复制配置实战
主库配置(my.cnf):
[mysqld]
server-id = 1 # 必须唯一
log_bin = mysql-bin # 开启binlog
binlog_format = ROW # 推荐使用ROW格式
binlog_row_image = FULL
sync_binlog = 1 # 每次事务提交都刷盘
expire_logs_days = 7 # 自动清理旧binlog
从库配置(my.cnf):
[mysqld]
server-id = 2 # 不同于主库
relay_log = mysql-relay-bin
read_only = ON # 从库只读
log_slave_updates = ON # 级联复制时需要
配置步骤:
-
在主库创建复制账号:
CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-
获取主库binlog位置:
SHOW MASTER STATUS; -- 记下File和Position值
-
在从库配置主库信息:
CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='repl', MASTER_PASSWORD='SecurePass123!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
-
启动复制:
START SLAVE;
-
检查复制状态:
SHOW SLAVE STATUS\G -- 确保Slave_IO_Running和Slave_SQL_Running都为Yes
二、读写分离实现
2.1 读写分离架构
读写分离就像交通分流,将读/写请求分配到不同节点 🚦:
典型架构:
客户端 → 读写分离中间件 → 主库(写)↘ 从库1(读)↘ 从库2(读)
2.2 实现方案对比
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
应用层实现 | 灵活可控,延迟低 | 需要修改代码 | 中小规模应用 |
中间件(ProxySQL) | 透明切换,功能丰富 | 增加网络跳转 | 大中型应用 |
数据库驱动实现 | 无额外组件 | 功能有限 | 简单读写分离 |
2.3 ProxySQL实战配置
安装与初始化:
# 安装
apt-get install proxysql# 启动服务
systemctl start proxysql# 管理命令行
mysql -u admin -padmin -h 127.0.0.1 -P 6032
基础配置:
-- 添加主从服务器
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'master',3306),
(20,'slave1',3306),
(20,'slave2',3306);-- 配置监控用户
UPDATE global_variables SET variable_value='monitor'
WHERE variable_name='mysql-monitor_username';-- 配置读写分离规则
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^SELECT.*FOR UPDATE',10,1), -- 写操作路由到主库
(2,1,'^SELECT',20,1); -- 读操作路由到从库-- 保存配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
三、复制拓扑结构
3.1 一主多从架构
架构特点:
[主库]/ | \[从库1][从库2][从库3]
- 优点:简单易维护,读扩展性好
- 缺点:主库单点故障,写无法扩展
适用场景:读多写少的应用
3.2 级联复制架构
架构特点:
[主库] → [从库1] → [从库2]↓[从库3]
- 优点:减轻主库复制压力
- 缺点:层级越深,数据延迟越大
配置关键:
# 中间从库配置
log_slave_updates = ON
3.3 双主复制架构
架构特点:
[主库A] ↔ [主库B]
- 优点:无单点故障,写高可用
- 缺点:冲突风险高,配置复杂
关键配置:
# 两台服务器都要配置
auto_increment_increment = 2
auto_increment_offset = 1 # 服务器1设为1,服务器2设为2
四、复制过滤与延迟
4.1 复制过滤配置
复制过滤就像数据"筛子",只同步需要的部分 🕵️:
主库过滤(不推荐,会导致binlog不完整):
binlog-do-db = db1
binlog-ignore-db = db2
从库过滤(推荐方式):
-- 配置复制过滤
CHANGE REPLICATION FILTER
REPLICATE_DO_DB = (db1),
REPLICATE_IGNORE_DB = (mysql);-- 通配符过滤(MySQL 8.0+)
CHANGE REPLICATION FILTER
REPLICATE_WILD_DO_TABLE = ('db1.orders%'),
REPLICATE_WILD_IGNORE_TABLE = ('db1.temp_%');
4.2 复制延迟问题解决
复制延迟就像快递延误,数据不能及时送达 ⏳:
监控延迟:
SHOW SLAVE STATUS\G
-- 查看Seconds_Behind_Master-- 更精确的方法(MySQL 8.0+)
SELECT * FROM performance_schema.replication_applier_status_by_worker;
常见解决方案:
-
并行复制:
slave_parallel_workers = 8 # 根据CPU核心数设置 slave_parallel_type = LOGICAL_CLOCK
-
减少大事务:拆分UPDATE 100万行数据为多个小事务
-
优化从库硬件:使用SSD,增加内存
-
半同步复制:确保至少一个从库收到数据
-- 主库安装插件 INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';-- 从库安装插件 INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';-- 启用半同步 SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_slave_enabled = 1;
五、GTID复制模式
5.1 GTID原理介绍
GTID(Global Transaction ID)就像事务的"身份证号" 🆔:
GTID格式:
source_id:transaction_id
-- 示例:3E11FA47-71CA-11E1-9E33-C80AA9429562:23
优势:
- 自动定位复制位置,无需手动指定binlog文件/位置
- 故障切换更简单可靠
- 支持自动故障转移
5.2 GTID复制配置
主从库配置(my.cnf):
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
从库配置命令:
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePass123!',
MASTER_AUTO_POSITION = 1; # 关键参数START SLAVE;
5.3 GTID常见操作
跳过特定事务:
-- 查看错误事务GTID
SHOW SLAVE STATUS\G
-- 找到Executed_Gtid_Set中的错误事务-- 跳过指定GTID
STOP SLAVE;
SET GTID_NEXT='3E11FA47-71CA-11E1-9E33-C80AA9429562:23';
BEGIN; COMMIT;
SET GTID_NEXT='AUTOMATIC';
START SLAVE;
GTID限制与解决方案:
- 不支持CREATE TABLE … SELECT:拆分为CREATE TABLE + INSERT INTO SELECT
- 临时表限制:避免在事务中使用临时表
- 版本兼容性:确保主从MySQL版本支持GTID
六、高可用集群进阶方案
6.1 MHA(Master High Availability)
架构特点:
[主库] - [从库1] - [从库2]│└─[MHA Manager]
- 优点:自动故障转移,支持GTID
- 缺点:需要额外管理节点
关键功能:
- 主库故障自动提升从库
- 自动识别差异binlog并补偿
- 支持在线切换
6.2 Group Replication
组复制原理:
- 基于Paxos协议的多主同步
- 自动冲突检测与解决
- 内置故障检测与成员管理
配置步骤:
-
初始化配置:
[mysqld] plugin_load_add = 'group_replication.so' group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" group_replication_start_on_boot = OFF group_replication_local_address = "node1:33061" group_replication_group_seeds = "node1:33061,node2:33061,node3:33061"
-
启动组复制:
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
6.3 InnoDB Cluster(MySQL Shell)
完整高可用方案:
- MySQL Group Replication:提供数据同步
- MySQL Router:自动路由请求
- MySQL Shell:集群管理接口
部署命令示例:
// 使用MySQL Shell配置
var cluster = dba.createCluster('myCluster')// 添加实例
cluster.addInstance('user@node2:3306')
cluster.addInstance('user@node3:3306')// 检查状态
cluster.status()
总结 🎯
通过本教程,我们系统掌握了MySQL高可用架构的核心技术 🎓:
- 主从复制:理解了复制原理与配置方法
- 读写分离:掌握了多种实现方案与ProxySQL配置
- 复制拓扑:学习了一主多从、级联复制等架构
- GTID复制:熟悉了更先进的GTID复制模式
- 集群方案:了解了MHA、Group Replication等高级方案
关键收获:
- 复制是MySQL高可用的基础技术
- 读写分离能显著提升读性能
- GTID极大简化了复制管理
- 根据业务需求选择合适的集群方案
生产环境建议:
- 使用GTID简化复制管理
- 监控复制延迟和状态
- 定期演练故障转移流程
- 考虑使用ProxySQL等中间件
下一步学习建议:
- 在测试环境实践各种复制架构
- 研究MySQL Router的自动故障转移
- 学习数据库中间件(MyCat, ShardingSphere)
- 探索云原生数据库架构
PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄