Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • Python
  • Shell
  • MySQL8-SOP手册
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MySQL8-SOP

  • MySQL实战45讲学习笔记

    • MySQL45讲学习笔记
    • MySQL基础架构
    • MySQL日志系统 (Redo Log 与 Binlog)
    • MySQL字符串字段索引优化
    • MySQL索引原理与优化
    • MySQL锁机制详解
    • MySQL事务与MVCC机制
    • MySQL普通索引与唯一索引的选择
    • MySQL优化器如何选择索引
    • MySQL抖动刷脏页
    • 表空间管理与回收
    • count函数详解
    • 日志索引
    • orderby工作原理
    • 随机排序实现
    • SQL性能差异函数与转换
    • 慢查询分析锁与版本
    • 幻读与间隙锁
    • 加锁规则分析
    • 应急性能优化方法
    • 数据持久化保证
    • 主备一致性原理
      • 1. 主备一致性的基本概念
      • 2. 主备复制的基本流程
        • 2.1 Binlog传播机制
        • 2.2 数据同步过程
      • 3. 主备一致性保障机制
        • 3.1 两阶段提交
        • 3.2 Binlog格式的重要性
        • 3.3 GTID机制
      • 4. 主备延迟问题
        • 4.1 延迟产生的原因
        • 4.2 延迟监控
      • 5. 主备一致性策略
        • 5.1 可靠性优先策略
        • 5.2 可用性优先策略
      • 6. 主备一致性检查
        • 6.1 数据一致性校验
        • 6.2 一致性状态监控
      • 7. 故障处理机制
        • 7.1 常见故障场景
        • 7.2 故障恢复流程
      • 8. 最佳实践建议
        • 8.1 网络配置优化
        • 8.2 系统资源配置
        • 8.3 监控告警机制
      • 9. 总结
    • 高可用架构与切换
    • 备库延迟分析与优化
    • 主备切换GTID
    • 读写分离实践与问题
    • 数据库健康检查
    • 锁与死锁
    • 数据误删恢复
    • Kill命令详解
    • 查询与内存使用分析
    • Join原理与选择
    • 临时表原理与应用
    • 内部临时表详解
    • Memory引擎详解
    • 自增ID详解
    • Insert加锁分析
    • 表复制方法比较
    • Grant与权限管理
    • 分区表详解
    • SQL语句中的Join问题
    • 自增ID用尽问题
  • 专题系列
  • MySQL实战45讲学习笔记
Carry の Blog
2024-07-27
目录

主备一致性原理

# 主备一致性原理

在数据库主备复制架构中,主备一致性是保证数据可靠性的重要指标。本文将深入探讨主备一致性的工作原理和实现机制。

# 1. 主备一致性的基本概念

主备一致性指的是主库和备库之间的数据保持一致的状态。在正常情况下,备库应该实时或准实时地反映主库的数据变更。主备一致性是高可用架构的基础,确保在主库发生故障时,备库能够无缝接管服务。

# 2. 主备复制的基本流程

# 2.1 Binlog传播机制

主备复制的核心是Binlog的传播和应用:

  1. 主库生成Binlog:当主库执行事务时,会将事务的变更记录到Binlog中
  2. 备库拉取Binlog:备库通过IO线程连接主库,拉取Binlog日志
  3. 中转日志存储:备库将拉取的Binlog存储到本地的中转日志(relay log)中
  4. SQL线程应用:备库的SQL线程读取中转日志,并在备库上重放执行

# 2.2 数据同步过程

-- 主库操作
BEGIN;
UPDATE users SET balance = balance - 100 WHERE user_id = 1;
COMMIT;

-- 备库同步过程
-- 1. IO线程从主库拉取binlog
-- 2. 存储到relay log
-- 3. SQL线程读取relay log并执行
1
2
3
4
5
6
7
8
9

# 3. 主备一致性保障机制

# 3.1 两阶段提交

为了确保主备一致性,MySQL采用了两阶段提交机制:

-- 事务提交过程
1. PREPARE阶段:将事务写入redo log并标记为prepare状态
2. COMMIT阶段:将事务标记为committed并写入binlog
3. 备库应用:在备库上按相同顺序应用事务
1
2
3
4

# 3.2 Binlog格式的重要性

不同的binlog格式对主备一致性有重要影响:

  • Statement格式:记录SQL语句,可能存在主备不一致风险
  • Row格式:记录具体的行变更,保证一致性但占用更多空间
  • Mixed格式:结合两种格式的优点
-- 设置binlog格式
SET GLOBAL binlog_format = 'ROW'; -- 推荐用于高一致性场景
1
2

# 3.3 GTID机制

全局事务标识(GTID)是MySQL 5.6引入的重要特性,它简化了主备切换和一致性保障:

-- 启用GTID
SET GLOBAL gtid_mode = ON;
SET GLOBAL enforce_gtid_consistency = ON;

-- GTID格式示例
GTID=server_uuid:gno
-- 例如:GTID=12345678-1234-1234-1234-123456789012:100
1
2
3
4
5
6
7

# 4. 主备延迟问题

# 4.1 延迟产生的原因

  1. 网络延迟:主备库间的网络传输延迟
  2. IO压力:备库处理binlog的IO压力
  3. CPU瓶颈:备库处理binlog的CPU资源不足
  4. 大事务:单个大事务的处理时间较长

# 4.2 延迟监控

-- 查看主备延迟状态
SHOW SLAVE STATUS\G

-- 关键指标
Seconds_Behind_Master: 主备延迟的秒数
Last_IO_Error: IO线程错误信息
Last_SQL_Error: SQL线程错误信息
1
2
3
4
5
6
7

# 5. 主备一致性策略

# 5.1 可靠性优先策略

在切换前等待主备数据完全同步:

-- 等待主备同步
SELECT WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS('GTID_SET');

-- 或者等待延迟为0
SELECT MASTER_POS_WAIT('master-bin.000001', 12345);
1
2
3
4
5

# 5.2 可用性优先策略

快速切换,容忍短暂的数据不一致:

-- 快速切换配置
SET GLOBAL super_read_only = OFF; -- 允许备库写入
START SLAVE;
1
2
3

# 6. 主备一致性检查

# 6.1 数据一致性校验

-- 使用checksum校验数据一致性
CHECKSUM TABLE table_name;

-- 比较主备数据
SELECT COUNT(*) FROM table_name; -- 在主库执行
SELECT COUNT(*) FROM table_name; -- 在备库执行
1
2
3
4
5
6

# 6.2 一致性状态监控

-- 查看主备连接状态
SHOW PROCESSLIST;

-- 查看复制状态
SHOW SLAVE STATUS;
SHOW MASTER STATUS;
1
2
3
4
5
6

# 7. 故障处理机制

# 7.1 常见故障场景

  1. 网络中断:主备连接断开
  2. IO瓶颈:备库处理能力不足
  3. 数据不一致:由于各种原因导致的主备数据差异

# 7.2 故障恢复流程

-- 停止复制
STOP SLAVE;

-- 重置复制状态
RESET SLAVE ALL;

-- 重新配置主备关系
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_PORT=3306,
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=12345;

-- 启动复制
START SLAVE;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 8. 最佳实践建议

# 8.1 网络配置优化

  • 确保主备库间网络连接稳定
  • 使用专线或低延迟网络
  • 合理配置网络带宽

# 8.2 系统资源配置

-- 调整复制相关参数
SET GLOBAL slave_net_timeout = 60;
SET GLOBAL slave_parallel_workers = 8;
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';
1
2
3
4

# 8.3 监控告警机制

建立完善的监控体系:

  1. 实时监控主备延迟
  2. 监控复制线程状态
  3. 设置异常告警阈值

# 9. 总结

主备一致性是数据库高可用架构的核心要素。通过合理的配置和监控,可以有效保障主备数据的一致性。在实际应用中,需要根据业务需求在一致性和可用性之间找到平衡点,选择合适的策略来保证系统的稳定运行。

#MySQL#主备一致性#主备复制#学习笔记
上次更新: 3/4/2026

← 数据持久化保证 高可用架构与切换→

最近更新
01
表空间管理与回收
03-04
02
MySQL抖动刷脏页
03-04
03
count函数详解
03-04
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式