RTO(Recovery Time Objective)指从故障发生到系统恢复可用状态的时间,是衡量数据库系统高可用性的核心指标。AliSQL基于社区MySQL,通过深度优化实例崩溃恢复(Crash-Recovery)全流程,加速实例启动的过程,缩短RTO时间,保证实例快速恢复服务。
优化内容概述
优化项 | 优化对象或流程 | 优化效果 |
表空间检查 | 实例正常启动时间缩短73%,崩溃恢复时间缩短95%以上,启动阶段内存占用减少81%以上。 | |
Buffer Pool并行初始化 | Buffer Pool初始化时间缩短80%以上。 | |
Redo Log的扫描与应用 | Redo Log应用时间缩短80%以上。 | |
Undo Log Record结构 | 100 万行记录大事务恢复时间约等于0秒,可忽略不计。 | |
未决事务的回滚 | 100 万行记录大事务回滚时间约等于0秒,可忽略不计。 | |
扫描定位损坏数据 | 10 GB General Log表恢复时间约等于0秒,可忽略不计。 |
海量表启动优化
表空间检查是崩溃恢复的基础,但海量表(如100万张表)会导致实例启动和崩溃恢复过程缓慢且占用大量内存。AliSQL针对此场景优化了文件扫描、数据字典读取、表对象构建等核心流程,显著缩短海量表场景下表扫描的耗时。优化效果如下:
场景 | 社区MySQL(优化前) | AliSQL(优化后) | 提升幅度 |
正常启动时间 | 90.7秒 | 24.1秒 | 缩短73%以上 |
崩溃恢复时间 | 521.7秒 | 25秒 | 缩短95%以上 |
启动阶段内存占用 | 高 | 减少81%以上 | 显著优化 |
开启方式
内核版本:RDS MySQL 8.0内核小版本大于等于20240731。
关键参数:
loose_fetch_raw_tablespace_at_startup
(默认开启)。参数开启时,实例启动仅加载必要元数据,延迟加载冗余信息,减少内存占用与启动时间。
Buffer Pool初始化加速
Buffer Pool是InnoDB核心内存结构,其初始化过程需分配内存并构建管理结构。虽然社区版MySQL已在实例级粒度上实现Buffer Pool并行初始化,但锁结构与全局统计信息更新仍存在并发瓶颈。AliSQL优化了Buffer Pool并行初始化流程,消除了并行初始化过程中的瓶颈点,显著缩短大内存实例的Buffer Pool初始化耗时。优化效果如下:
场景 | 社区MySQL(优化前) | AliSQL(优化后) | 提升幅度 |
512 GB Buffer Pool初始化时间 | 19.7秒 | 3.8秒 | 缩短80%以上 |
开启方式
内核版本:
RDS MySQL 8.0内核小版本大于等于20220530。
RDS MySQL 5.7内核小版本大于等于20230531。
关键参数:
innodb_buffer_pool_init_optimize
(默认开启)。参数开启时,系统自动优化Buffer Pool并行初始化流程,消除锁与同步瓶颈。
Redo Log并行应用
Redo Log作为MySQL数据库中的WAL日志,用于保证数据一致性。在崩溃恢复中,Redo Log的扫描与应用是关键步骤。社区MySQL仅支持单线程扫描和串行化应用,导致大量Redo Log(如4 GB)的恢复耗时可达数分钟。AliSQL通过引入流水线机制,实现Redo Log的扫描与应用并行化,显著提升恢复速度。优化效果如下:
场景 | 社区MySQL(优化前) | AliSQL(优化后) | 提升幅度 |
4 GB Active Redo Log应用时间 | 118.7秒 | 22.6秒 | 缩短80%以上 |
应用速度 | 基准速度 | 提升500%以上 | 显著提升 |
开启方式
内核版本:RDS MySQL 8.0内核小版本大于等于20241231。
关键参数:innodb_parallel_redo_threads(默认关闭)。需手动设置
innodb_parallel_redo_threads
参数(默认值为1)大于2(如innodb_parallel_redo_threads=4
)。该参数可指定Redo Log并行应用的线程数,提升Redo Log扫描和应用的速度。
Transaction快速恢复
在崩溃恢复中,Redo Log应用结束之后,MySQL需通过Undo Log恢复活跃事务的表锁。社区MySQL需逐行扫描所有Undo Log Record获取事务操作的表信息,导致大事务(如百万级记录)的恢复耗时显著提升。AliSQL通过扩展Undo Log Record结构,实现Undo Log的快速定位与扫描,显著减少事务恢复的时间。优化效果如下:
场景 | 社区MySQL(优化前) | AliSQL(优化后) | 提升幅度 |
100 万行记录大事务恢复时间 | 6.8秒 | 约等于0秒,可忽略不计 | 完全优化 |
开启方式
内核版本:
RDS MySQL 8.0内核小版本大于等于20230630。
RDS MySQL 5.7内核小版本大于等于20230831。
关键参数:innodb_trx_resurrect_table_lock_accelerate(默认关闭)。需手动设置
innodb_trx_resurrect_table_lock_accelerate
参数(默认值为OFF)为ON。参数开启时,启用Undo Log快速扫描机制,加速大事务恢复。
Transaction异步回滚
MySQL通过内部XA事务实现Binlog与InnoDB的一致性。具体流程为:事务提交时先执行InnoDB Prepare并保持Prepared状态,再写入Binlog,最后提交。崩溃恢复时,未决事务(Prepared状态)的提交或回滚需由Binlog决定。社区MySQL的未决事务回滚是同步操作,导致大事务(如百万级记录)的恢复耗时显著提升。AliSQL将未决事务的回滚改为异步处理,不阻塞实例启动,使实例快速恢复服务。优化效果如下:
场景 | 社区MySQL(优化前) | AliSQL(优化后) | 提升幅度 |
100 万行记录大事务回滚时间 | 100秒 | 约等于0秒,可忽略不计 | 完全优化 |
开启方式
内核版本:
RDS MySQL 8.0内核小版本大于等于20220530。
RDS MySQL 5.7内核小版本大于等于20230531。
关键参数:
async_binlog_recovery
(默认开启)。参数开启时,启用未决事务异步回滚机制,加速实例启动。
General Log Recovery优化
MySQL的General Log在TABLE模式下以CSV表形式存储用户操作记录。若崩溃恢复时发现该表损坏,社区MySQL需通过全表扫描定位损坏数据并重建,导致大数据量(如10 GB)的恢复耗时显著提升。AliSQL通过逆向扫描和截断文件等技术,快速修复日志表损坏,大幅缩短实例启动延迟,加速实例恢复。优化效果如下:
场景 | 社区MySQL(优化前) | AliSQL(优化后) | 提升幅度 |
10 GB General Log表恢复时间 | 270秒 | 约等于0秒,可忽略不计 | 完全优化 |
开启方式
内核版本:
RDS MySQL 8.0内核小版本大于等于20241130。
RDS MySQL 5.7内核小版本大于等于20241130。
关键参数:
reverse_repair_general_log_on_boot
(默认开启)。参数开启时,启用逆向扫描与截断修复机制,加速General Log表恢复。
其他优化
除了上述优化外,AliSQL还对Double Write的数据校验过程进行了优化,建议升级内核小版本到最新小版本。