MySQL 主从复制深度解析:搭建高可用数据库架构

MySQL 主从复制是企业级数据库架构的基石。作为冉冉博客的 MySQL 教程系列,今天详细讲解主从复制的原理与实战配置。

一、主从复制原理

MySQL 主从复制基于 binlog 日志实现:

  • Master:记录所有数据变更到 binlog
  • Slave:通过 IO 线程连接 Master,读取 binlog
  • Relay Log:Slave 本地存放中转日志
  • SQL 线程:读取 relay log,执行 SQL
┌─────────┐     binlog      ┌─────────┐    relay log    ┌─────────┐
│  Master │ ────────────→ │  Slave  │ ←────────────── │ SQL     │
│         │  IO Thread    │         │                 │ Thread  │
└─────────┘                └─────────┘                 └─────────┘

二、配置主节点

# /etc/mysql/my.cnf
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin
binlog_format = ROW
sync_binlog = 1
expire_logs_days = 7

# 只复制指定数据库(可选)
binlog_do_db = myapp

# 创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

FLUSH PRIVILEGES;

三、配置从节点

# /etc/mysql/my.cnf
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
super_read_only = 1  # 5.7.26+ 使用这个

# 复制过滤(可选)
replicate_do_db = myapp

四、建立复制连接

-- 查看 Master 状态
SHOW MASTER STATUS;
-- File: mysql-bin.000001
-- Position: 154

-- 在 Slave 上执行
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.100',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'repl_password',
  MASTER_LOG_FILE = 'mysql-bin.000001',
  MASTER_LOG_POS = 154;

-- 启动复制
START SLAVE;

-- 查看复制状态
SHOW SLAVE STATUSG
-- 关键指标:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes

五、半同步复制配置

确保数据至少复制到一个从节点才返回成功:

-- 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 = 3000;  -- 3秒超时

-- Slave 安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME ' semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

-- 确认状态
SHOW GLOBAL STATUS LIKE 'rpl_semi%';

六、GTID 复制模式

全局事务 ID,复制更可靠:

-- Master 配置
gtid_mode = ON
enforce_gtid_consistency = ON

-- Slave 配置
gtid_mode = ON
enforce_gtid_consistency = ON
slave_parallel_workers = 4  # 并行复制
slave_parallel_type = LOGICAL_CLOCK

-- 使用 GTID 复制
CHANGE MASTER TO
  MASTER_AUTO_POSITION = 1;

七、常见问题排查

-- 1. 复制跳过错误
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

-- 2. 连接失败检查
TELNET master_ip 3306
SHOW VARIABLES LIKE '%timeout%';

-- 3. 数据不一致修复
pt-table-checksum h=master,u=checksum,p=pass
pt-table-sync --sync-to-master h=slave,u=root

八、监控与维护

-- 复制延迟监控
SHOW SLAVE STATUSG
SHOW PROCESSLIST;

-- Prometheus 监控
SELECT 
  variable_name,
  variable_value 
FROM information_schema.global_status
WHERE variable_name LIKE 'slave%';

主从复制是数据库高可用的基础。掌握这些配置与排查技巧,能让你的数据库架构更加稳定可靠。更多 MySQL 实战教程,欢迎持续关注冉冉博客。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容