一、主从架构作用

  • 数据安全

给主服务增加一个数据备份,实现故障转移和高可用的基础。

  • 实现读写分离

当主服务访问压力过大时,可以将数据读请求转移到从服务器,主库负责数据的写入。
注意:mysql主从架构是实现读写分离的基础,实现读写分离还需要一些中间件来支持。如ShardingSphere

二、主从同步原理

主节点上的操作
1、master服务将数据的改变写入binlog日志
2、binlog dump线程

  • 当slave连接到master的时候,master机器会为slave开启binlog dump线程。
  • 当master 的 binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。

从节点的操作
当主从同步开启的时候,slave上会创建2个线程

  • I/O线程,线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。
  • SQL线程。该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。

image.png

  1. 注意:mysqlbinlog不光可以用于主从同步,还可以用于其它场景,例如阿里开源的canal框架可以监控binlog日志
  2. 的变化,然后将数据同步到缓存、es等其它组件。
  3. 搭建主从集群的要求
  4. 主从服务mysql的版本要一致。
  5. 主从两节点的时间需要同步。

三、半同步复制原理

mysql主从集群默认采用的是一种异步复制的机制,主服务器在执行用户提交事务后,写入binlog日志,就会给客户端返回成功响应,而binlog会由一个dump线程异步发送给slave从服务。
image.png
由于发送binlog是异步的,如果此过程宕机会造成数据丢失,为了保证数据安全,mysql提供了半同步复制机制。
半同步复制机制是一种介于异步复制和全同步复制之间的一种机制。主库在执行完客户端提交事务后,并不立即返回客户端响应,而是等待至少一个从库接收并写入relay log中,才返回客户端。mysql在等待确认时,默认会等10s,如果超过10s没收到ack,就会降级为异步复制。
image.png

四、主从同步数据延迟原因

面向业务的主服务数据都是多线程并发写入的,而从服务是单个线程慢慢拉取binlog的,这中间会有效率差。所以解决这个问题关键是让从服务器多线程并发复制binlog数据。
mysql5.7版本后支持并行复制,可以在从服务器上设置slave_parallel_workers为一个大于0的数,然后把slave_parallel_type参数设置为 LOGICAL_CLOCK,这就可以了