引言

各位数据库爱好者们好!今天我们要深入探讨MySQL高可用架构的核心技术——复制与集群 🏗️。在现代互联网应用中,数据库的高可用性就像建筑物的抗震设计一样重要,直接决定了系统的稳定性和可靠性。本教程将从主从复制原理讲起,逐步深入到各种复制拓扑结构、GTID复制等高级主题,让你全面掌握构建健壮MySQL架构的关键技术!💪


一、主从复制原理与配置

1.1 复制工作原理

MySQL复制就像数据同步的"传声筒",将主库变更传播到从库 📢:

复制三线程模型:

  1. 主库Binlog Dump线程:读取binlog事件并发送给从库
  2. 从库I/O线程:接收主库的binlog事件并写入relay log
  3. 从库SQL线程:读取relay log中的事件并重放执行

复制流程:

Binlog事件
主库
从库I/O线程
从库Relay Log
从库SQL线程
从库数据

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  # 级联复制时需要

配置步骤:

  1. 在主库创建复制账号:

    CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    
  2. 获取主库binlog位置:

    SHOW MASTER STATUS;
    -- 记下File和Position值
    
  3. 在从库配置主库信息:

    CHANGE MASTER TO
    MASTER_HOST='master_host',
    MASTER_USER='repl',
    MASTER_PASSWORD='SecurePass123!',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;
    
  4. 启动复制:

    START SLAVE;
    
  5. 检查复制状态:

    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;

常见解决方案:

  1. 并行复制:

    slave_parallel_workers = 8  # 根据CPU核心数设置
    slave_parallel_type = LOGICAL_CLOCK
    
  2. 减少大事务:拆分UPDATE 100万行数据为多个小事务

  3. 优化从库硬件:使用SSD,增加内存

  4. 半同步复制:确保至少一个从库收到数据

    -- 主库安装插件
    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

优势:

  1. 自动定位复制位置,无需手动指定binlog文件/位置
  2. 故障切换更简单可靠
  3. 支持自动故障转移

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限制与解决方案:

  1. 不支持CREATE TABLE … SELECT:拆分为CREATE TABLE + INSERT INTO SELECT
  2. 临时表限制:避免在事务中使用临时表
  3. 版本兼容性:确保主从MySQL版本支持GTID

六、高可用集群进阶方案

6.1 MHA(Master High Availability)

架构特点:

[主库] - [从库1] - [从库2]
  │
  └─[MHA Manager]
  • 优点:自动故障转移,支持GTID
  • 缺点:需要额外管理节点

关键功能:

  1. 主库故障自动提升从库
  2. 自动识别差异binlog并补偿
  3. 支持在线切换

6.2 Group Replication

组复制原理:

  • 基于Paxos协议的多主同步
  • 自动冲突检测与解决
  • 内置故障检测与成员管理

配置步骤:

  1. 初始化配置:

    [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"
    
  2. 启动组复制:

    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    

6.3 InnoDB Cluster(MySQL Shell)

完整高可用方案:

  1. MySQL Group Replication:提供数据同步
  2. MySQL Router:自动路由请求
  3. MySQL Shell:集群管理接口

部署命令示例:

// 使用MySQL Shell配置
var cluster = dba.createCluster('myCluster')

// 添加实例
cluster.addInstance('user@node2:3306')
cluster.addInstance('user@node3:3306')

// 检查状态
cluster.status()

总结 🎯

通过本教程,我们系统掌握了MySQL高可用架构的核心技术 🎓:

  1. 主从复制:理解了复制原理与配置方法
  2. 读写分离:掌握了多种实现方案与ProxySQL配置
  3. 复制拓扑:学习了一主多从、级联复制等架构
  4. GTID复制:熟悉了更先进的GTID复制模式
  5. 集群方案:了解了MHA、Group Replication等高级方案

关键收获:

  • 复制是MySQL高可用的基础技术
  • 读写分离能显著提升读性能
  • GTID极大简化了复制管理
  • 根据业务需求选择合适的集群方案

生产环境建议:

  1. 使用GTID简化复制管理
  2. 监控复制延迟和状态
  3. 定期演练故障转移流程
  4. 考虑使用ProxySQL等中间件

下一步学习建议:

  1. 在测试环境实践各种复制架构
  2. 研究MySQL Router的自动故障转移
  3. 学习数据库中间件(MyCat, ShardingSphere)
  4. 探索云原生数据库架构

PS:如果你在学习过程中遇到问题,别慌!欢迎在评论区留言,我会尽力帮你解决!😄

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐