Skip to content

主从复制

复制概述

复制类型

类型说明
异步复制默认方式,主库不等待从库
半同步复制主库等待至少一个从库确认
全同步复制主库等待所有从库确认

复制原理

主库                    从库
  │                       │
  ├─── 写入 Binlog ───────┤
  │                       │
  │                 I/O线程读取 Binlog
  │                       │
  │                 写入 Relay Log
  │                       │
  │                 SQL线程执行 Relay Log
  │                       │

主从配置

主库配置

ini
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
binlog_do_db=mydb
expire_logs_days=7

从库配置

ini
[mysqld]
server-id=2
relay-log=relay-bin
read_only=ON

创建复制用户

sql
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

查看主库状态

sql
SHOW MASTER STATUS;

配置从库

sql
CHANGE MASTER TO
    MASTER_HOST='192.168.1.100',
    MASTER_USER='repl',
    MASTER_PASSWORD='Repl@123',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;

启动复制

sql
START SLAVE;
STOP SLAVE;

查看从库状态

sql
SHOW SLAVE STATUS\G

GTID 复制

启用 GTID

ini
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON

GTID 配置从库

sql
CHANGE MASTER TO
    MASTER_HOST='192.168.1.100',
    MASTER_USER='repl',
    MASTER_PASSWORD='Repl@123',
    MASTER_AUTO_POSITION=1;

GTID 操作

sql
SHOW GLOBAL VARIABLES LIKE '%GTID%';
SHOW MASTER STATUS;
SELECT * FROM mysql.gtid_executed;

半同步复制

安装插件

sql
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

主库配置

sql
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000;

从库配置

sql
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

查看状态

sql
SHOW STATUS LIKE 'Rpl_semi_sync%';

复制过滤

主库过滤

ini
[mysqld]
binlog_do_db=mydb
binlog_ignore_db=test

从库过滤

ini
[mysqld]
replicate_do_db=mydb
replicate_ignore_db=test
replicate_do_table=mydb.users
replicate_ignore_table=mydb.logs
replicate_wild_do_table=mydb.%
replicate_wild_ignore_table=mydb.log%

复制管理

查看复制状态

sql
SHOW SLAVE STATUS\G

关键指标:

  • Slave_IO_Running: Yes/No
  • Slave_SQL_Running: Yes/No
  • Seconds_Behind_Master: 延迟秒数

跳过复制错误

sql
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

重置复制

sql
STOP SLAVE;
RESET SLAVE;
RESET MASTER;

在线切换主库

sql
STOP SLAVE;
CHANGE MASTER TO
    MASTER_HOST='new_master',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_AUTO_POSITION=1;
START SLAVE;

延迟复制

配置延迟复制

sql
CHANGE MASTER TO
    MASTER_HOST='192.168.1.100',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_DELAY=3600;

查看延迟

sql
SHOW SLAVE STATUS\G

SQL_Delay 字段显示延迟秒数。

并行复制

启用并行复制

sql
STOP SLAVE;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers = 4;
START SLAVE;

配置文件

ini
[mysqld]
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=4
slave_preserve_commit_order=ON

复制监控

监控脚本

sql
SELECT
    variable_name,
    variable_value
FROM performance_schema.global_status
WHERE variable_name IN (
    'Slave_running',
    'Slave_IO_Running',
    'Slave_SQL_Running',
    'Seconds_Behind_Master'
);

复制延迟监控

sql
SHOW SLAVE STATUS\G

关注 Seconds_Behind_Master 字段。

常见问题

1. IO 线程停止

原因:

  • 网络问题
  • 主库 binlog 被删除
  • 复制用户权限问题

解决:

sql
STOP SLAVE;
START SLAVE;

2. SQL 线程停止

原因:

  • 数据冲突
  • 主键冲突
  • 数据不存在

解决:

sql
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;

3. 复制延迟

原因:

  • 从库性能不足
  • 大事务
  • 网络延迟

解决:

  • 启用并行复制
  • 优化从库性能
  • 拆分大事务

高可用架构

主从切换

sql
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

STOP SLAVE;
RESET SLAVE ALL;

SET GLOBAL read_only = OFF;

MHA 架构

  • 自动故障检测
  • 自动主从切换
  • 自动 VIP 漂移

MGR 架构

MySQL Group Replication:

  • 基于 Paxos 协议
  • 自动故障检测
  • 自动主从切换
sql
STOP GROUP_REPLICATION;
START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;