Mysql复制的原理

大体来说,复制分为以下几步:

1、主库将数据的更新事件记录到二进制日志。

二进制日志由各种事件组成,一个事件通常为一个更新加一些其它信息,比如时间戳。在每次准备提交事务前,主库将数据更新的事件记录到二进制日志中。记录完毕后,主库将告诉存储引擎可以提交事件了。

2、从库将主库上的日志复制到自己的中继日志中。

首先,从库启动一个工作线程,称为 I/O 线程,该线程跟主库建立一个普通的连接,然后在主库上启动一个二进制转储(binlog dump)线程,这个二进制存储线程会读取并向从库发送主库上二进制日志中的事件,从库的 I/O 线程接收到事件并将其记录到从库的中继日志中。

注意,二进制存储线程的工作方式不是轮询,当该线程追赶上了主库,它就进入休眠状态,直到主库发送信号通知来将其唤醒。

3、从库读取中继日志中的事件,将其重放到从库中。

当主库的事件发送过来时,从库的 I/O线程将事件写入中继日志(relay log)中,然后从库上 SQL 线程就去读取并且重放中继日志中的事件,达到与主库数据的一致。可以看到, I/O 线程和 SQL 线程的协作,使得获取事件和重放事件的解耦,两者异步执行。在 5.6之前,只能有一个 SQL 线程工作,因此重放是串行化进行的。在5.6之后,增加了多线程重放,但是注意,多线程是基于库的,一个库只能使用一个 SQL 线程重放事件。5.7之后,才真正实现了同一个库的使用多个SQL线程重放事件。