Binlog 优化
AliSQL 8.0.44-2 提供两种默认关闭的 Binlog 优化,分别面向不同类型的事务。Persist Binlog Into Redo V2 将符合条件的 Binlog 事件随 Redo 持久化;Binlog Cache Free Flush 避免在提交时再次复制符合条件的溢出大事务缓存。
事务不满足条件时,两种优化都会使用标准 Binlog Group Commit。
选择机制
| 机制 | 工作方式 | 默认值 | 大小阈值 | DuckDB 限制 |
|---|---|---|---|---|
| Persist Binlog Into Redo V2 | 符合条件的事务 Binlog 缓存随 InnoDB Redo 持久化,再由后台线程写入 Binlog | OFF | 默认最多 1 MiB;可配置 0–10 MiB | 可在 duckdb_mode=NONE 下运行;启用 DuckDB 模式时无法开启 |
| Binlog Cache Free Flush | 将已完成且已溢出的事务缓存重命名为下一个 Binlog | OFF | 默认大于 256 MiB;阈值最低可配置为 10 MiB | 当前包含 DuckDB 的构建即使 duckdb_mode=NONE 也会使用标准 Binlog Group Commit |
只有满足全部条件的事务才会使用对应优化。请使用接近生产的事务和 Crash Recovery 测试确认实际行为。
Persist Binlog Into Redo V2
对于符合条件的提交,Binlog 事件会随 InnoDB Redo 一起持久化。后台写入和同步线程随后将事件写入 Binlog 文件;发生崩溃后,恢复流程可以从 Redo 补齐缺失的 Binlog 尾部,再继续常规恢复。
启用前配置必要的提交顺序设置:
[mysqld]
sync_binlog=1
innodb_flush_log_at_trx_commit=1
binlog_order_commits=OFF
replica_preserve_commit_order=OFF
persist_binlog_to_redo=ON
当前实现要求 sync_binlog=1、binlog_order_commits=OFF 和 replica_preserve_commit_order=OFF。建议同时设置 innodb_flush_log_at_trx_commit=1,但代码并不强制要求。
例如,事务使用非事务表、包含 Statement Binlog Cache、超过 persist_binlog_to_redo_size_limit、需要保持提交顺序,或存在不支持的 2PC 参与者时,都会使用标准 Binlog Group Commit。
| 变量 | 默认值 | 说明 |
|---|---|---|
persist_binlog_to_redo | OFF | 全局、动态启用 |
persist_binlog_to_redo_size_limit | 1 MiB | 符合条件的事务缓存最大值;0–10 MiB |
binlog_buffer_size | 20 MiB | 只读后台环形缓冲区;启动时配置 |
sync_binlog_interval | 50000 µs | 后台 Binlog 同步间隔 |
wait_binlog_flush | ON | 等待对应文件写入,不一定等待文件同步 |
Binlog Cache Free Flush
当大事务缓存溢出到临时文件时,标准 Binlog 提交流程会把该文件复制到 Binlog。Free Flush 会在临时文件中预留 Binlog 文件头空间,完成文件后将其重命名为下一个 Binlog 文件,从而避免再次复制大量数据。
仅当 Binlog 和 InnoDB 是已注册的 2PC 参与者时,才能使用该机制:
SET GLOBAL binlog_cache_free_flush_limit_size = 268435456;
SET GLOBAL binlog_cache_free_flush = ON;
仅开启配置不能证明事务实际使用了 Free Flush。事务还必须满足以下条件:缓存已溢出且写入完成,不含 Statement Cache 事件或故障,Binlog 和缓存文件未加密,Binlog 已打开,不更新 mysql.gtid_executed,并且除 InnoDB 外没有注册其他两阶段提交(2PC)引擎。
| 变量 | 默认值 | 文档记录的范围 |
|---|---|---|
binlog_cache_free_flush | OFF | ON、OFF |
binlog_cache_free_flush_limit_size | 256 MiB | 10 MiB 到 ULLONG_MAX 字节 |
Binlog in Redo 可以在 duckdb_mode=NONE 时运行;但只要构建中注册了 DuckDB 这一 2PC 参与者,即使 DuckDB 模式为 NONE,Free Flush 当前仍会使用标准 Binlog Group Commit。
验证清单
- 服务启动后检查实际的持久化和提交顺序变量。
- 分别执行符合条件和不符合条件的事务,确认优化路径与回退路径均符合预期。
- 同时测量 Redo 压力、Binlog 写延迟、存储带宽和提交延迟。
- 测试配置大小阈值两侧的事务。
- 加入崩溃注入、重启恢复、复制追赶、备份和恢复测试。
- 保留标准 Binlog Group Commit 作为回退方式;后台写入仍会产生底层 I/O。
参考来源
- Persist Binlog Into Redo V2 指南
- Binlog Cache Free Flush 指南
- AliSQL 8.0.44-2 Release Notes
- RDS AliSQL Binlog 性能优化 — 较早的托管服务工程背景;当前开源配置请以上面的仓库指南为准。
