MySQL如何传输二进制日志

MySQL Replication可以很方便的用来做应用的读扩展,也可以帮MySQL实现一定程度的HA方案。MySQL通过向备库传送二进制日志来实现Replication,本文将通过二进制日志相关源代码的主要接口来解释:“MySQL如何传输二进制日志,是主库推,还是备库拉?MySQL日志传输的实时性如何?”。

在MySQL Replication结构中,备库端初次通过CHANGE MASTER TO完成Replication配置,再使用start slave命令开始复制。更细致的,备库通过IO Thread向主库发起读取binlog的请求(COM_BINLOG_DUMP命令),主库收到COM_BINLOG_DUMP请求后,使用单独线程(dump thread)不断向备库IO Thread发送Binlog。示意图(大图):

在主库端一旦有新的日志产生后,立刻会发送一次广播,dump线程在收到广播后,则会读取二进制日志并通过网络向备库传输日志,所以这是一个主库向备库不断推送的过程;

新日志在产生后,只需一次广播和网络就会立刻(<1ms)向发送到备库,如果主备之间网络较好的话(例如RTT<1ms),备库端的日志也就小于2ms了。所以,一般的(依赖于RTT),备库的实时性都非常好。 参考: 1. MySQL Replication Manual

2. 图解”How MySQL Replication Works”

Have fun!

广告:我们寻找靠谱的人 | 感谢作者

In:

3 responses to “MySQL如何传输二进制日志”

  1. 你好,我看到很多资料包含mysql手册都是说二进制的复制过程是:
    1.从服务器I/O线程,连接主服务器并让它发送记录在其二进制日志中指定位置开始的语句。
    2.主服务器接到请求后Binlog Dump线程将二进制日志中的内容发送到从服务器。
    3.从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即relay-log。

    期间如果主服务器空闲会断开连接。

    也就说,二进制日志还是从服务器主动请求的,而不是主服务主动发送的。

  2. 到底是主库推送,还是备库请求的方式?这也是我之前困惑的问题。所以后来通过分析源码,发现:一旦连接建立,则是由主库主动推送的。

Leave a Reply

Your email address will not be published. Required fields are marked *