MySQL的主从复制使用基于TCP/IP的自定义协议来传输二进制日志(binlog)
-
连接建立: 从库(slave)通过TCP/IP与主库(master)建立连接并进行身份验证。这是标准的网络连接和认证过程。
-
Binlog Dump 请求:
- 从库的I/O线程向主库发送一个
COM_BINLOG_DUMP
命令。这是一种二进制协议命令,用于请求从某个指定的binlog文件和偏移量开始传输binlog事件。 COM_BINLOG_DUMP
命令包含以下信息:- binlog文件名
- binlog位置(偏移量)
- 服务器ID(用以标识请求的从库)
- 从库的I/O线程向主库发送一个
-
主库响应 Binlog Dump 请求:
- 主库接收到
COM_BINLOG_DUMP
命令后,会启动一个专用的binlog dump线程。 - 该线程读取指定的binlog文件,从给定的偏移量开始,并将binlog事件通过二进制协议发送给从库。
- 主库接收到
-
Binlog 事件格式:
- Binlog事件被定义为结构化的二进制数据块。每个事件都包含事件头(如事件类型、时间戳、服务器ID等)和事件体(具体的变更数据)。
- 这些事件按照固定的二进制格式编码,以保证高效的传输和解析。
-
从库处理 Binlog 事件:
- 从库的I/O线程接收到这些二进制格式的binlog事件后,将它们写入本地的中继日志(relay log)。
- 从库的SQL线程随后读取中继日志中的binlog事件,并将这些事件应用到从库的数据库中。
二进制协议的优势
- 高效性:二进制协议相比文本协议具有更高的效率,因为它减少了解析和序列化/反序列化的开销。
- 一致性:通过使用统一的二进制格式,确保了主库到从库数据传输的一致性和完整性。
- 易于传输复杂数据:二进制协议能够高效地传输复杂数据结构,而不需要像文本协议那样进行额外的编码和解码。
总结
MySQL主从复制确实基于一个高效的二进制协议进行binlog事件的传输。从库请求binlog时使用COM_BINLOG_DUMP
命令,主库响应请求并通过二进制协议将binlog事件发送给从库。这种机制不仅提高了数据传输的效率,还保证了数据的一致性和完整性。