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大小是未压缩时的一半,压缩效果还算不错。