NOTE

1.2 MySQL主从复制

1. 主从复制是什么 - 将主库的数据同步到从库 2. 主从复制的作用 分布式系统复制.md 3. 主从复制的使用场景 - 读多写少且读的时候对数据时效性要求没那么高 4. 如何开启主从复制 - my.ini 5. 主从复制的原理 MySQL增删改数据的时候除了更新数据外,还会把增删改写入binlo

MySQL / Database创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 主从复制是什么

  • 将主库的数据同步到从库

2. 主从复制的作用

分布式系统复制.md

3. 主从复制的使用场景

  • 读多写少且读的时候对数据时效性要求没那么高

4. 如何开启主从复制

  • my.ini
    [mysqld]
    log-bin=mysql-bin # 开启 binlog
    binlog-format=ROW # 选择 ROW 模式
    server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

5. 主从复制的原理

MySQL增删改数据的时候除了更新数据外,还会把增删改写入binlog MySQL bin-log.md

  1. 主库新开一个log dump线程读取bin-log,与从库的IO线程通信
  2. 从库的IO线程把主库发送过来的bin-log写入relay-log
  3. 从库的SQL线程读取relay-log,更新到数据库 MySQL主从复制

6. 主从复制延迟问题

6.1. 主从复制延迟是什么

主库写入了数据,从库还没有同步过来,此时客户端连接从库就会读不到该数据

6.2. 为什么会发生主从复制延迟

  • 根本原因:一致性问题。由于主从复制是异步的,主库写入了数据后,从库没有把数据同步过来,此时从从库读就会不一致
  • 表面原因:假设主库执行事务的时间是T1,从库收到的时间是T2,在从库执行完的时间是T3,
    • T3-T1就是主从延迟
    • T2-T1就是网络传输时间。如果是跨网络的机器那么这个传输时间就会比较长
    • T3-T2就是事务执行时间。如果是大事务或者从库机器性能差那么这个事务执行时间就会比较长

6.3. 如何解决主从延迟问题

6.3.1. 半同步复制

  • 主从复制方式有三种:异步复制、全同步复制、半同步复制
  • MySQL默认是异步复制
    • 客户端提交给主库后,主库接受、执行完成就返回给客户端成功
  • 可以配置成全同步
    • 客户端提交给主库后,主库接受、执行完后还得等待所有从库接受并执行完,才返回给客户端成功
  • 可以用插件配置成半同步
    • 客户端提交给主库后,主库接受、执行完后等待任意一个从库接受并且写入relay-log,才返回给客户端成功

6.3.2. 并行复制

6.3.2.1. 什么是并行复制
  • 从库SQL thread重放SQL使用多线程,那么就是并行复制
6.3.2.2. 为什么需要并行复制
  • 在官方的5.6版本之前,MySQL只支持单线程复制,为了避免顺序性的问题。但是单线程在主库并发高、TPS高时就会出现严重的主备延迟问题,因此推出了并行复制机制
6.3.2.3. 并行复制原则
  • 同一个事务的语句,必须放到同一个线程中
  • 更新同一行的两个事务,必须分发到同一个线程中
6.3.2.4. 并行复制策略
6.3.2.4.1. MySQL5.6 基于schema的并行复制
  • 从库开启多个线程,并行读取relay log不同库的日志,进而写入不同库。
  • 这是库级别的并行
6.3.2.4.2. MySQL5.7 基于group commit的并行复制
  • redo log组提交
6.3.2.4.3. MySQL8.0 基于write-set的并行复制
  • 基于主键的冲突检测

6.3.3. 读写分离过期读

强一致性场景,解决方案;

  • 强制走主库方案;
  • sleep方案;
  • 判断主备无延迟方案;
  • 配合semi-sync方案;
  • 等主库位点方案;
  • 等GTID方案。

7. 参考