本文主要尝试说明MySQL主从复制的原理。

什么是主从复制?

主从复制指的是数据库在运行过程中,将数据从主库复制到从库的过程,可以从一主复制到一个或多个从库。可以采用异步复制、半同步复制方式。有基于日志点的复制和基于GTID(global transaction id:全局事务ID)的复制两种形式。将数据复制到从库,以达到高可用、高性能的目的。

为什么要用主从复制?

  1. 高可用

    当主库宕机或者主库需要做升级的时候,可以将主库切换到从库上,新的主库对外提供服务,保证服务可用,同时也可以对主库完成运维操作。

  2. 高性能

    大多数互联网业务读数据操作较多,可以采用多个从库,将读操作由从库进行,每个从库进行不同类型的读操作,而主库只进行写操作,从而提升数据库的整体性能。

  3. 数据备份

    可以使用从库的方式对数据库进行备份

主从复制有什么优缺点

优点

  • 可扩展:在读压力大的情况下,可以增加多个读节点,将读数据操作分发到不同的节点减轻读压力
  • 高性能:因为数据分发到不同的节点执行,每个服务器上的压力减小,性能得到提升

缺点

  • 一致性问题:主要有主从延迟导致的数据不一致和双写导致的数据不一致两种。一致性问题有很多解决方案,如全局唯一ID生成器、双主情况下的间隔ID自增策略
  • 延时问题:从库监听主库数据变化再复制到从库执行这个过程是需要时间的,因此从库一般和主库之间都会存在延时问题,且随着从库数量的增加,复制压力增加,主从复制的延时也会增加

MySQL主从复制原理

MySQL主从复制的基础是binlog(二进制日志),binlog记录了数据库中数据的变化,只有启用了binlog才能配置主从复制。

  1. 业务端在对主库操作时将会将操作的内容写入到binlog中
  2. 主库为每个从库创建一个log dump线程,读取和发送binlog中的内容
  3. 当从库建立和主库的连接之后,从节点会创建一个IO线程,用来请求主库中更新了的binlog,在接收了主节点中log dump线程发送的更新之后,将更新写入到从节点的relay log(中继日志)中
  4. 在接收到主库的变更之后,从库SQL线程读取relay log中的记录,解析为数据库的操作,并将操作应用到数据库,保证主库和从库的一致性。

MySQL主从复制原理

总结

本文主要描述了MySQL数据库主从复制优缺点及原理。MySQL数据库在互联网行业使用广泛,且具有高性能可扩展等特点,在近些年来发展相当迅速。虽然和Oracle RAC实时集群相比,做到双写双活有一定限制,但是对于大多数场景也足够使用了。