MySQL主从复制
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