§ 大事务 binlog 独立落盘
§ 功能发布说明
本特性通过优化大事务 binlog 的落盘路径,实现 binlog cache 文件到 binlog 文件的直接转换,避免传统模式下“缓存回读 + 二次写入”的高 I/O 开销,从而显著降低大事务提交延迟,提升数据库整体吞吐能力与稳定性。
§ 1. 特性概述
在传统 MySQL / GreatSQL binlog 提交流程中,大事务在提交时需要将 binlog cache 内容重新读取并写入 binlog 文件,导致:
- 高 I/O 消耗
- 长时间持有 binlog 锁
- 阻塞其他事务提交
- TPS 波动明显
本特性通过“binlog cache 文件结构预构建 + 头部预留空间 + rename 替换机制”,使大事务可以:
直接将 binlog cache 文件转换为 binlog 文件完成提交
§ 2. 设计目标
- 降低大事务提交 I/O 成本
- 减少 binlog lock 持有时间
- 提升系统 TPS 稳定性
- 优化写放大问题
- 提升高并发场景下整体吞吐能力
§ 3. 核心原理
本方案核心基于三项关键改造:
§ 3.1 可重构 binlog cache 文件结构
binlog cache 在写入阶段预留:
- File Header 空间
- Format Description Event
- Previous GTID Event
- GTID Event
- 对齐 padding 空间(IO_SIZE 对齐)
使其具备“可直接作为 binlog 文件”的结构基础。
§ 3.2 直接 rename 落盘机制
当检测到大事务满足条件时:
- 结束当前 binlog 文件(rotate)
- 生成新 binlog 文件结构
- 将 header events 写入 cache 预留空间
- 删除临时 binlog 文件
- 将 binlog cache rename 为正式 binlog 文件
§ 3.3 checksum 状态继承机制
为保证文件一致性:
- 大事务独立落盘期间关闭 binlog checksum
- 后续写入同一 binlog 文件的事务继承该状态
- rotate 过程同步传播 checksum 状态
§ 4. 触发条件
满足以下条件时启用优化:
- 事务大小 ≥ binlog_large_commit_threshold(默认 128MB)
- binlog cache 已发生落盘(非纯内存)
- 未同时使用 stmt cache + trx cache
- 未开启 binlog 压缩 / 加密
- end_log_pos 计算一致性校验通过
§ 5. 系统架构变化
§ 5.1 优化前
binlog cache → 读取 → binlog file write → commit。
存在问题:
- 二次 I/O
- CPU + I/O 放大
- 提交链路长
§ 5.2 优化后
binlog cache → 预构建 → rename → commit。
优势:
- 零二次写 I/O
- 提交路径缩短
- I/O 延迟显著下降
§ 6. 性能收益
在大事务场景下:
- 提交耗时显著降低
- binlog 写放大减少
- TPS 波动收敛
- I/O wait 明显下降
典型收益:
- 大事务提交延迟降低 30%~70%
- 高并发场景 TPS 提升 10%~40%
§ 7. 参数说明
§ binlog_large_commit_threshold
- 类型:ulonglong
- 默认值:128MB
- 说明:触发大事务优化的阈值
- 范围:[0, ULLONG_MAX]
§ 8. 兼容性说明
- 完全兼容 MySQL binlog 协议
- 兼容 GTID 体系
- 支持 mysqlbinlog 工具解析
- 不影响主从复制逻辑
- 不改变事务语义
§ 9. 使用限制
以下场景不启用优化:
- 开启 binlog compression
- 开启 binlog encryption
- stmt cache 与 trx cache 混用
- header 空间不足
- checksum 不一致风险场景
§ 10. 风险与控制
- 预留空间不足 → 自动回退传统写入模式
- end_log_pos 不一致 → 自动降级
- checksum 状态异常 → 禁止 rename 优化
- 文件系统失败 → fallback to standard binlog write
§ 11. 总结
本特性通过重构 binlog cache 文件模型,使大事务具备“零拷贝式落盘能力”,从根本上减少 binlog 写入路径中的 I/O 放大问题,是提升数据库高负载场景稳定性的重要优化能力。
扫码关注微信公众号
