外观
主从数据同步
⭐ 题目日期:
阿里 - 2024/8/21
📝 题解:
主从数据同步是数据库系统中实现高可用、负载均衡和数据备份的核心技术,其核心目标是让从库(Slave)实时或准实时地与主库(Master)保持数据一致性。以下是主从同步的详细机制、流程和关键优化点:
1. 主从同步的核心流程
(1) 主库(Master)写入与日志记录
- 二进制日志(Binlog):
主库将所有数据变更(INSERT/UPDATE/DELETE)以事件形式记录到二进制日志。- Binlog 格式:
STATEMENT
:记录 SQL 语句(逻辑日志,可能存在主从不一致风险)。ROW
:记录行级数据变更(物理日志,推荐使用,一致性高)。MIXED
:混合模式,根据场景自动选择。
- Binlog 格式:
(2) 从库(Slave)拉取日志
- IO 线程:
从库通过 IO 线程连接到主库,请求并接收 Binlog 事件,将其写入本地中继日志(Relay Log)。- 同步模式:
- 异步复制(默认):主库不等待从库确认,性能高但可能丢数据。
- 半同步复制:主库等待至少一个从库接收 Binlog 后返回成功(平衡性能与一致性)。
- 全同步复制:主库等待所有从库确认(强一致,性能最低)。
- 同步模式:
(3) 从库重放日志
- SQL 线程:
从库的 SQL 线程读取 Relay Log 中的事件,按顺序重放(Replay)这些操作,更新从库数据。
2. 主从同步的关键机制
(1) 全局事务标识(GTID)
- GTID 格式:
server_uuid:transaction_id
,全局唯一标识事务。 - 优势:
- 简化主从切换:无需依赖 Binlog 文件名和位置。
- 自动跳过已执行事务,避免重复执行。
(2) 并行复制
- 原理:从库 SQL 线程多线程并行执行 Relay Log 中的事务,减少同步延迟。
- 按库并行:不同数据库的事务并行执行(早期方案)。
- 按事务组并行:基于事务依赖关系分组并行(如 MySQL 8.0 的 WRITESET 机制)。
(3) 延迟监控与优化
- 同步延迟指标:
Seconds_Behind_Master
(从库落后主库的时间)。 - 延迟原因:
- 网络带宽不足或延迟高。
- 从库硬件性能差(CPU/磁盘瓶颈)。
- 大事务或长事务阻塞 SQL 线程。
- 优化方案:
- 使用更快的网络或压缩 Binlog。
- 升级从库硬件或启用并行复制。
- 避免大批量写入或拆分大事务。
3. 主从同步的配置步骤(以 MySQL 为例)
(1) 主库配置
# my.cnf
[mysqld]
server_id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
(2) 从库配置
# my.cnf
[mysqld]
server_id = 2
relay_log = /var/lib/mysql/relay-bin
read_only = ON # 从库设为只读(防止误写)
(3) 建立主从关系
-- 在主库创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 在从库配置主库信息
CHANGE MASTER TO
MASTER_HOST = 'master_ip',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_AUTO_POSITION = 1; -- 启用 GTID
-- 启动从库复制
START SLAVE;
4. 主从同步的常见问题与解决
(1) 主从数据不一致
- 检测工具:
pt-table-checksum
(校验数据一致性) +pt-table-sync
(修复差异)。 - 修复方案:
手动修复差异或重建从库。
(2) 主从复制中断
- 常见原因:
- 主从版本不兼容。
- 主库误删从库所需的 Binlog。
- 主从服务器时间不同步。
- 恢复步骤:
跳过错误事务(SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1
)或重建同步。
(3) 主从切换(Failover)
- 手动切换:
- 确保主库不可用。
- 选择一个从库提升为新主库(
STOP SLAVE; RESET SLAVE ALL
)。 - 其他从库指向新主库。
- 自动切换:
使用中间件(如 MHA、Orchestrator)或云服务(如 AWS RDS)自动处理。
5. 主从同步的应用场景
- 读写分离:
- 主库处理写操作,从库处理读操作(需应用层路由)。
- 数据备份:
- 从库作为实时备份,可定期备份不影响主库性能。
- 高可用架构:
- 结合 VIP 或代理(如 ProxySQL)实现故障自动切换。
- 横向扩展:
- 通过增加从库分散读负载。
总结
- 核心流程:主库写 Binlog → 从库拉取并写入 Relay Log → 从库重放日志。
- 关键优化:GTID、并行复制、半同步复制。
- 典型问题:数据不一致、复制延迟、主从切换。
主从同步是构建高可用数据库系统的基石,合理配置和监控可显著提升系统稳定性和性能。