MySQL Binlog 文件格式解析(HEARTBEAT_LOG_EVENT)

MySQL 通过 Binlog 进行主从数据的复制,Binlog 由多种不同类型的 event 组成,本文简单介绍 event 类型为 HEARTBEAT_LOG_EVENT 的结构。

本文涉及的源码版本 MySQL Server 5.7.19

1. HEARTBEAT_LOG_EVENT 有什么用?

MySQL 主从复制通过 Binlog 来同步数据,正常情况下主库写入数据,以 Binlog event 结构发送给从库,从库应用 Binlog。这一过程中,主库 binlog dump 线程在发送数据,从库 io 线程在接收数据,dump 线程与 io 线程之间建立网络通信,如果主库长时间没有数据写入,主从库之间的网络连接需要定时发送心跳包,来让从库知道主库还活着,HEARTBEAT_LOG_EVENT 就是主库发送的心跳事件。

HEARTBEAT_LOG_EVENT 属于控制类的 event,它与通常的 WRITE_ROWS_EVENT,UPDATE_ROWS_EVENT,DELETE_ROWS_EVENT 等不同,HEARTBEAT_LOG_EVENT 不需要写入到文件中,因为它只是用于确认主库是否还活着,并没有实质性的数据需要存储,收到之后,就可以丢弃,而其他类型的 event 必须写入到文件中,以便在级联复制中,能够将数据同步到下一个节点。

2. HEARTBEAT_LOG_EVENT 格式

在源码文件 sql/rpl_binlog_sender.cc 中,通过类 Binlog_sender 来向从库发送 HEARTBEAT_LOG_EVENT,函数名如下:

int Binlog_sender::send_heartbeat_event(my_off_t log_pos)

从该函数中,可以找到 HEARTBEAT_LOG_EVENT 的具体格式,如下:

event header(19字节) event data event checksum(4字节)