Mysql主从同步原理

230 阅读4分钟

前言

主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。

主从同步好处

  1. 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  2. 提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
  3. 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能

主从同步实现方式

主从同步是基于Bin Log日志来实现的。 BinLog日志参数配置

参数含义优点缺点
Statement语句级,binlog 会记录每次一执行写操作的语句。相对 row 模式节省空间,但是可能产生不一致性,比如“update tt set create_date=now()”,如果用 binlog 日志 进行恢复,由于执行时间不同可能产生的数据就不同节省空间有可能造成数据不一致
row行级, binlog 会记录每次操作后每行记录的变化。保持数据的绝对一致性。因为不管 sql 是什么,引用了什么函数,他只记录 执行后的效果占用较大空间
mixedstatement 的升级版,一定程度上解决了,因为一些情况而造成的 statement 模式不一致问题,默认还是 statement,在某些情况下譬如:当函数中包含 UUID() 时;包含 AUTO_INCREMENT 字段的表被更新时;执行 INSERT DELAYED 语句时;用 UDF 时;会按照 ROW 的方式进行处理节省空间,同时兼顾了一定的一致性还有些极个别情况依旧会造成不一致,另外 statement 和 mixed 对于需要对 binlog 的监控的情况都不方便

一主多从

主从.png
一般是主库负责所有读写请求,而从库只负责容灾恢复和冗余备份。

如果做了读写分离的话,主库负责写请求,从库负责读请求,可以提升数据库性能。

双主多从

主从 (1).png
一般是主库1负责所有读写请求,主库2不对外提供服务,只用来容灾恢复。

相比一主多从架构,双主多从架构可以减少宕机时间,更快恢复数据库可用状态。

主从同步原理

主从复制原理.png

  1. 主库数据发送变更的时写入Bin Log日志
  2. 从库IO发起dump主库请求
  3. 主库发送Bin Log到从库
  4. 从库IO线程写入Bin Log内容到Relay Log
  5. 从库SQL线程读取Relay Log内容
  6. 从库SQL线程重新执行一遍SQL语句

如何提升主从同步性能

1. 从库开启多线程复制

在最后两步SQL线程读取Relay Log 和重放时可以修改参数slave_parallel_workers=x来指定线程个数

2. 修改同步模式,改为异步

主从同步共有三种复制方式:

  1. 全同步复制

    当主库执行完一个事务,并且所有从库都执行完该事务后,才给客户端返回成功。

  2. 半同步复制

    至少有一个从库执行完成后,就给客户端返回成功。

  3. 异步复制

    主库执行完后,立即返回成功,不关心从库是否执行完成。

如果对数据安全性要求没那么高,可以把同步模式改成半同步复制或者异步复制。

3. 修改从库Bin Log配置

修改sync_binlog配置:

sync_binlog=0 ,表示写binlog不立即刷新磁盘,由系统决定什么时候刷新磁盘。

sync_binlog=1,每次写binlog都刷新磁盘,安全性高,性能差。

sync_binlog=N,写N次binlog才刷新磁盘。

从库对数据安全性要求没那么高,可以设置sync_binlog=0。

修改innodb_flush_log_at_trx_commit配置:

innodb_flush_log_at_trx_commit=0,每隔一秒钟,把事务日志刷新到磁盘。

innodb_flush_log_at_trx_commit=1,每次事务都刷新到磁盘。

innodb_flush_log_at_trx_commit=2,每次事务都不主动刷新磁盘,由系统决定什么时候刷新磁盘。

从库对数据安全性要求没那么高,可以设置innodb_flush_log_at_trx_commit=2。