MySQL 主从复制原理

[!TIP|label:说明] MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,当主节点有多个从节点时,对于每一个主从连接,主节点会为每一个当前连接的从节点建一个binary log dump 进程

MySQL主从复制

  1. 主节点 binary log dump 线程 当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
  2. 从节点I/O线程 当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
  3. 从节点SQL线程 SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

流程

数据库有个bin-log二进制文件,记录了所有sql语句。

  1. binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
  2. 从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
  3. 从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

问题&解决

  • 主库宕机后,数据丢失

半同步复制

  • 主库写压力大,因从库只有一个sql 线程来持久化,复制可能延迟

并行复制

  • 复制出错处理 常见:1062(主键冲突),1032(记录不存在)

手动处理 OR 跳过复制错误:set global sql_slave_skip_counter=1

主从复制延迟

  1. 主节点如果执行一个很大的事务(更新千万行语句,总之执行很长时间的事务),那么就会对主从延迟产生较大的影响
  2. 网络延迟,日志较大,slave数量过多。
  3. 主上多线程写入,从节点只有单线程恢复

处理办法:

  1. 大事务:将大事务分为小事务,分批更新数据。
  2. 减少Slave的数量,不要超过5个,减少单次事务的大小。
  3. MySQL 5.7之后,可以使用多线程复制,使用MGR复制架构

半同步复制

原理:事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端

  • 5.5集成到mysql,以插件的形式存在,需要单独安装
  • 确保事务提交后binlog至少传输到一个从库
  • 不保证从库应用完成这个事务的binlog
  • 性能有一定的降低
  • 网络异常或从库宕机,卡主库,直到超时或从库恢复

并行复制

原理:从库多线程apply binlog

  • 在社区5.6中新增
  • 库级别并行应用binlog,同一个库数据更改还是串行的
  • 5.7版本并行复制基于事务组

联级复制(部分数据复制)

  • A->B->C
  • B中添加参数log_slave_updates
  • B将把A的binlog记录到自己的binlog日志中

results matching ""

    No results matching ""