关于 MySQL 复制协议的深入探讨

主要观点:MySQL 的复制协议广泛用于实现高可用性、负载均衡和数据冗余,自 2000 年引入以来不断发展并流行。文中深入探讨了 MySQL 复制协议的细节,包括 GTID 定位、复制格式(行式、语句式、混合式)、启动复制流、二进制日志事件(初始事件、DDL 事件、DML 事件)及类型序列化等方面。
关键信息

  • MySQL 复制通过源服务器将事件记录到二进制日志,副本连接后接收并应用这些事件来保持同步。
  • GTID 基于全局事务标识符,使副本更易重新连接并继续复制流,主从服务器需启用GTID_MODE
  • 复制格式有行式、语句式和混合式,行式在多数情况下能正确复制数据,但在某些情况下效率不如语句式。
  • 启动复制流时,副本先注册自己,查询配置,然后发送COM_BINLOG_DUMP_GTID命令,源服务器定期发送心跳事件保持连接。
  • 二进制日志事件包括初始事件(Rotate、Format Description、Previous GTIDs 事件)、DDL 事件(以 GTID 事件开始,后跟 Query 事件)、DML 事件(以 GTID 事件开始,后跟 Table Map 事件、Rows 事件和 XID 事件)。
  • 类型序列化方面,MySQL 二进制日志一般使用内部序列化格式,各数据类型有不同的序列化方式,MySQL 的 JSON 序列化格式有空间效率优化但可能影响序列化效率。
    重要细节
  • 二进制日志文件开头有魔法字节0xfe 0x62 0x69 0x6e,初始 Rotate 事件不写入日志文件但用于帮助副本定位。
  • DDL 语句以 Query 事件发送,包含 DDL 语句和执行相关的元数据。
  • DML 事件中的 Table Map 事件包含表结构的大量数据,Rows 事件描述行的变化,Update Rows 事件有额外字段。
  • MySQL 的 JSON 序列化格式在空间效率和序列化效率之间有权衡,小格式用两字节表示元素计数和偏移位置,大格式用四字节。
阅读 12
0 条评论