← 返回首页
🗄️

MySQL主从复制

📂 architecture ⏱ 1 min 165 words

MySQL主从复制

复制原理

主库将变更写入Binlog,从库IO线程拉取Binlog写入Relay Log,SQL线程重放数据。

Master                          Slave
┌──────────┐    Dump Thread    ┌──────────┐
│ Binlog   │ ──────────────→   │Relay Log │
└──────────┘                   └────┬─────┘
                                    │ SQL Thread
                               ┌────▼─────┐
                               │ 数据文件  │
                               └──────────┘

基于Binlog的复制

配置主从复制的基本步骤和参数。

# Master my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
sync-binlog = 1
innodb-flush-log-at-trx-commit = 1

# Slave my.cnf
[mysqld]
server-id = 2
relay-log = relay-bin
read-only = 1
-- Master创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- Slave配置并启动
CHANGE MASTER TO
  MASTER_HOST='master-host',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1;
START SLAVE;

GTID复制

全局事务标识符简化主从切换和故障恢复。

# my.cnf
[mysqld]
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
-- GTID模式下配置复制
CHANGE MASTER TO
  MASTER_HOST='master-host',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1;
START SLAVE;

-- 查看GTID执行状态
SHOW SLAVE STATUS\G

半同步复制

确保至少一个从库收到Binlog后主库才返回提交成功,防止数据丢失。

-- Master安装半同步插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 5000;

-- Slave安装半同步插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE; START SLAVE;

监控复制状态

关键监控指标:延迟时间、IO线程状态、SQL线程状态。

-- 查从库复制状态
SHOW SLAVE STATUS\G

-- 关键字段
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
-- Last_IO_Error / Last_SQL_Error