MySQL 8.0 binlog日志事务压缩

MySQL 8.0.20 版本增加了binlog日志事务压缩功能,将事务信息使用zstd算法进行压缩,然后再写入binlog日志文件,这种被压缩后的事务信息,在binlog中对应为一个新的event类型,叫做Transaction_payload_event。

一、降低磁盘空间和网络带宽占用

压缩后的事务,被存储在新的binlog event Transaction_payload_event,该event在主从复制,组复制,以及mysqlbinlog之间传输,由于该event里面的内容是压缩过的,因此能够显著减少binlog,relay log文件占用的磁盘空间,同时也能有效降低传输binlog占用的网络宽带。

二、并不是所有类型的event都能被压缩

binlog由不同类型的event组成,binlog事务压缩功能,并不会对所有类型的event都进行压缩,以下类型的event将不会被压缩。

  • GTID events,保存GTID信息的event不会被压缩
  • 控制类型的events,比如 view change events 和 heartbeat events 不会被压缩
  • Incident events,严重的事件,比如一个事务期间,MySQL停止了,那么它也不会被压缩
  • 非事务的event,比如一个事务中,既包含事务引擎,也包含非事务引擎,那么这个事务在binlog中不会被压缩
  • binlog事务压缩仅适用于行格式的binlog,不适用statement格式的binlog

binlog事务压缩,与传统的连接协议压缩并不冲突,已经被压缩的binlog,在连接协议压缩中会再次被压缩,因为事务信息已经被压缩过了,再次被压缩时,压缩效果并不好,但是对于binlog事务压缩不支持的event类型,连接协议的压缩仍然能够对其进行压缩。

传统的连接协议压缩参数:

  • MASTER_COMPRESSION_ALGORITHMS
  • MASTER_ZSTD_COMPRESSION_LEVEL
  • slave_compressed_protocol(废弃)
三、相关参数
  • binlog_transaction_compression,是否开启binlog事务压缩,默认为OFF。
  • binlog_transaction_compression_level_zstd,binlog事务压缩等级,默认值为3,最小值为1,最大值为22,值越大,压缩效果越好,但是CPU和内存消耗也越大。

压缩状态的监控:

  • performance_schema.binary_log_transaction_compression_stats
  • performance_schema.events_stages_current
四、压缩效果

sysbench创建10张表,每张表100w条数据,测试binlog日志压缩打开与没有打开时,对binlog磁盘占用进行对比。

  • binlog_transaction_compression=ON
  • binlog_transaction_compression_level_zstd=3
binlog日志压缩 binlog文件大小
未开压缩 1.88G
打开压缩 0.92G

从测试结果来看,压缩后的binlog大小是未压缩时的一半,压缩效果还算不错。

发表评论