DDL Redo压缩

更新时间:
复制 MD 格式

PolarDB提供DDL Redo压缩功能,对DDL创建索引、重建表过程中生成的Redo日志进行压缩后再写入,减少Redo写入量,缓解Redo写入带宽压力,降低DDL期间对在线写入业务的影响。

背景信息

在执行ALTER TABLE创建索引、OPTIMIZE TABLE等需要重建索引或重建表的DDL时,构建B+树阶段会快速产生大量Redo日志。开启并行DDL后,Redo写入速度更快,容易让Redo写入带宽成为集群瓶颈,既影响DDL自身的执行效率,也可能造成集群上其他写入业务的抖动。

DDL Redo压缩功能对DDL过程中生成的Redo进行压缩后再写入,可以实现:

  • 减少Redo写入量,缓解Redo写入带宽压力。

  • 进一步发挥并行DDL的吞吐能力,缩短DDL执行时间。

  • 降低DDL期间对在线写入业务的影响。

  • 降低物理复制带宽与回放压力。

适用场景

DDL Redo压缩在以下走批量构建B+树路径的DDL中生效:

  • 创建二级索引,例如ALTER TABLE ... ADD INDEX

  • 重建表,例如ALTER TABLE ... ENGINE=InnoDB

  • 上述DDL并行DDL能力,需要配合innodb_polar_parallel_ddl_threads参数(控制每一个DDL操作的并行线程数)使用。

说明

普通DML写入(INSERTUPDATEDELETELOAD DATA)不会触发此优化,无需额外关注。

适用范围

PolarDB集群版本需为以下版本之一,您可以通过查询版本号确认集群版本:

  • MySQL 8.0.2,且内核小版本为8.0.2.2.27及以上。

  • MySQL 8.0.1,且内核小版本为8.0.1.1.52及以上。

  • MySQL 5.7,且内核小版本为5.7.1.0.39及以上。

使用限制

  • 仅对通过批量加载(Bulk Load)构建B+树的Inplace DDL生效,不支持Copy DDL,普通DML不受影响。

  • 仅支持InnoDB存储引擎的表。

  • 不支持临时表和ROW_FORMAT=COMPRESSED的压缩表。

  • 不支持全文索引(FULLTEXT)和空间索引(SPATIAL)。

参数说明

DDL Redo压缩涉及以下参数,您可以通过在PolarDB控制台上进行设置:

  • 兼容性说明:部分集群参数在PolarDB控制台上均已添加MySQL配置文件的兼容性前缀loose_

  • 操作方法:找到并修改这些带loose_前缀的参数。

参数

级别

说明

loose_innodb_bulk_load_redo_compress_enable

Global

控制DDL Redo压缩的作用范围,取值如下:

  • none(默认):关闭DDL Redo压缩。

  • secondary:仅压缩二级索引的Redo。

  • all:同时压缩聚簇索引(主键)与二级索引的Redo。

loose_innodb_bulk_load_redo_compress_algorithm

Global

选择压缩算法,取值如下:

  • none:关闭压缩。

  • lz4(默认):使用LZ4压缩算法。

  • zstd:使用Zstandard压缩算法。

使用方法

开启压缩

通过控制台修改集群参数开启DDL Redo压缩。具体操作请参见设置集群参数和节点参数

  1. 登录PolarDB控制台

  2. 在左侧导航栏中,选择配置与管理 > 参数配置

  3. 搜索参数loose_innodb_bulk_load_redo_compress_enable,根据需要修改取值:

    • 仅压缩二级索引:设置为secondary

    • 同时压缩主键和二级索引:设置为all

执行DDL

参数设置生效后,执行相关DDL操作即可自动触发Redo压缩,示例如下:

ALTER TABLE t1 ADD INDEX idx_b (b);
ALTER TABLE t1 ENGINE = InnoDB;
OPTIMIZE TABLE t1;

关闭压缩

配置与管理 > 参数配置页面,将loose_innodb_bulk_load_redo_compress_enable设置为none

观测方法

通过SHOW ENGINE INNODB STATUS查看

执行SHOW ENGINE INNODB STATUS后,在DDL OPERATIONS子项中查看DDL Redo写入量、压缩前后字节数及压缩比例:

----------
DDL OPERATIONS
----------
Amount of redo written by DDL bulk load: <总字节> Byte, <速率> Byte/s
Amount of compressed redo written by DDL bulk load: <压缩后字节> Byte, original size: <原始字节> Byte
Compression ratio: 0.35

通过SHOW GLOBAL STATUS查看

执行以下SQL语句查看压缩相关的状态变量,适合对接监控系统:

SHOW GLOBAL STATUS LIKE 'Innodb_ddl_bulk_load_write_redo%';

状态变量

说明

Innodb_ddl_bulk_load_write_redo

DDL Bulk Load写入Redo的累计字节数(开启压缩后为压缩后字节)。

Innodb_ddl_bulk_load_write_redo_compressed

压缩后的累计字节。

Innodb_ddl_bulk_load_write_redo_original

压缩前的原始累计字节。

实际压缩比 ≈ Innodb_ddl_bulk_load_write_redo_compressed / Innodb_ddl_bulk_load_write_redo_original,数值越小表示压缩效果越好。

最佳实践

  • secondary模式起步:建议先开启secondary模式观察压缩比与CPU开销,稳定后再按需升级到all模式。

  • 算法选择:无特殊需求时使用默认的lz4算法即可,兼顾压缩率和性能。

  • 结合并行DDL使用:与innodb_polar_parallel_ddl_threads参数(控制每一个DDL操作的并行线程数)配合使用,可大幅提升DDL执行效率,并缓解并行DDL场景下的Redo带宽瓶颈。