0%

MySQL-主从复制原理

在大规模的数据库应用中,通过主从复制可以提高数据库系统的对外服务能力。

概述

MySQL主从复制也可以称为MySQL主从同步,它是构建数据库高可用集群架构的基础。

它通过将一台主机的数据复制到其他一台或多台主机上,并重新应用relay log中的SQL语句来实现复制功能。

功能

  • 实时灾备
  • 读写分离
  • 高可用
  • 平滑升级

原理

主服务数据库启用二级制日志,主服务器上的修改保存至本地二进制日志。

Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志位置之后的日志信息,返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次反馈的信息在Master端的Binary Log文件的名称以及在Binary Log中的位置。

Slave的IO线程接受到信息后,将接收到的日志内容依次写入Slave端的Realy Log(中继日志)文件(mysql-realy-lin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚地告诉Master “我需要从某个bin-log”的哪个位置开始往后的日志内容,请发给我”。

Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文件中的内容成为在Master端真实执行时候的那些可执行的Query语句,并在自身执行这些Query。这样,实际上就是在Master端和Slave端都执行了同样的Query,所以两端的数据是完成一样的。

原理图

也就是说:

  • 从库会生成两个线程,一个I/O线程,一个SQL线程;
  • I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
  • 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
  • SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;