天天看点

设计编码-mysql数据库主从复制原理-学习笔记

作者:码哥流年

#头条创作挑战赛#

MySQL主从复制是一个基于自带二进制日志功能的异步过程。就是一台或多台从库(slave)从一台主库(master)进行日志的复制,然后从库再解析日志并应用到自身,最终实现把主库的数据同步到从库。

主从复制的作用如下:

  • 解决单点故障
  • 提高性能
  • 实现读写分离

主从复制的步骤如下:

第一步,当有增删改语句执行时,主库在更新数据的同时把信息写成二进制日志,将数据修改的内容记录进入日志中,并通知从库。

第二步,从库上运行的一些I/O进程,会监视主库上的二进制日志,当收到主库通知并发现修改时,I/O进程向主库发起请求获取二进制日志的名称、当前数据更新的位置和二进制日志文件位置的副本。

第三步,从库把获取到的信息同步到自身的中继日志。

第四步,从库上运行着的SQL thread进程,监视自身的中继日志,当发现中继日志发生改变时,立即将日志中改变对应的数据同步到自身的数据库。

设计编码-mysql数据库主从复制原理-学习笔记

(mysql主从复制原理图)

主从复制的数据同步策略如下:

  • 同步策略,主库等待所有的从库都回应后才会提交,这个主从的同步的性能会严重的影响。
  • 半同步策略,主库至少会等待一个从库回应后提交。
  • 异步策略,主库不用等待从回应就可以提交。
  • 延迟策略,从库要落后于主库指定的时间。

主从同步的三种方式及差异如下:

  • 基于SQL语句的复制。Binlog格式为STATEMENT,每一条修改数据的SQL语句都会记录到Binlog中,这样做的优点是并不需要记录每一条SQL语句和每一行的变化,减少了二进制日志量,节约了I/O。但是会导致某些情况下主、从库数据不一致的场景。
  • 基于行的复制。不记录每条SQL语句,仅记录哪条记录数据被修改了,以及修改后的结果。这样做的优点是不容易出现主、从库数据不一致的场景,但是缺点在于会产生大量日志。
  • 混合模式复制。在混合模式下,边的复制采用基于SQL语句的复制方式,只有当该方式无法复制(比如触发器、存储过程等等)时,才会使用基于行的方式。

主从复制同步常见方案如下:

  • M-S,一台主库,加上一台或多台从库。
设计编码-mysql数据库主从复制原理-学习笔记

M-S图

  • M-S-SS,一台主库,加上一台中继库,再加上多台从库。注意中继库不存储数据,只存日志,从库到中继库同步数据,不是从主库同步,达到减轻主库I/O压力。
设计编码-mysql数据库主从复制原理-学习笔记

M-S-SS图

  • M-M,一台主库,加上一台主库或多台主库,互为主库。
设计编码-mysql数据库主从复制原理-学习笔记

M-M图