redo log生命周期介绍

redo实现(innoDB)

设计需求:
btree中page修改的持久化需在dirty page落盘后方可确认,page数据量大,且随机写耗时高。
引入WAL:redo log,仅包含page修改的差量逻辑信息,并以append-only方式落盘。达到减少数据传输+优化磁盘写入效率,提升持久化效率。

0.redo log生命周期概述:
创建内存对象————redo log buffer(下面简称buffer,在区分于os file buffer时会明确指明)————redo log file(os file buffer)————至此落盘(由OS接管持久化任务)
恢复时读取并构建内存对象,搜索相应修改page(通过前置检查page LSN保证幂等修改),最终恢复至停机时dirty page状态,之后由undo回撤未提交page修改,最终达到一致性状态(undo细节令起一篇)。
关注点:
伴随redo log内存对象生命周期,内存管理(空间优化)。
锁管理:log buffer读写、page latch、record lock。
redo log作为异构数据副本与page修改需保证相关偏序。
//事务粒度的持久性保证,较之page修改持久性保证更为宽泛,可放宽相关约束。

1.创建
在完成SQL逻辑编译,并定位修改所在page后,获取到page修改信息与定位信息
创建该page的redo log内存对象,
并将redo log LSN写入page。
LSN为log字节总量,page中的LSN对应于最后修改该page的LSN,从而建立page与redo log间关联。

2.写入redo log buffer
redo log 内存对象编码
log buffer lock管理buffer互斥访问,如事务log写
写入的正确性保证:
log传输原子性保证(主要用于后续落盘):log以block形式组织,block大小与扇区相同,后续落盘可。
//相应的,传输数据编码为定长信息,存在消息分割或填充。
同步写log与page修改:
1.持有page latch保证物理一致性,防止page修改的中间态被访问(脏读脏写)
2.log与page两种异构数据打包同步更新,预防死锁。也可以通过确定异构数据的加锁顺序,如先log,后page,index与page同理。
//相应的,若修改了辅助索引,作为额外的数据副本,没有同步保证辅助索引的完整性
内存优化:buffer实现为循环数组。
交替保存2份ckpt(存于log file header后),保证写入有效。
buffer负责LSN分发。如果视作生产者水位,则dirty page刷盘及redo log落盘可看作相应的两个消费者。

3.log buffer刷盘
buffer刷盘动机:log buffer空间不足,事务提交
刷盘的时间与io资源消费是不可预测的,且恢复速度难以预测
为此引入ckpt,决定了恢复的起点,加快恢复速度
对任意page,需保证redo log在file中顺序与page修改顺序一致。
ckpt规则:sharp ckpt,dirty page全刷;fuzzy ckpt需确保page刷新顺序与LSN一致,即记录page LSN消费进度

4.file
redo log的恢复价值是有时效性的,对于落盘的dirty page,该page对应的其余更小LSN的redo log在恢复过程中被直接跳过。
log file循环使用,覆写,需保证覆写的redo log相应修改page落盘。
归档日志,可视为log file尾部,用于增量恢复
其中os file sys提供的虚拟文件服务,log交付至file buffer后由os管理,或发起系统调用fsync强制刷盘。

5.组提交
lock——copy block——write disk——unlock————fsync file
相当于对buffer的读写,file system读旧,trx写新,读写速度不匹配。
//copy最后一个block,因为可能未填充完。

6.恢复
前置检查:DB关闭时最后刷新page LSN与ckpt LSN是否相等,判断是否需要恢复
3pass:analysis redo undo
analysis pass:读取redo log file,并将redo log按page组织为hash表,读相应page,利用空间连续性预读
redo pass每个page按LSN序逐个检查恢复,仅log LSN大于pageLSN恢复
ckpt LSN作为恢复起点
redo执行完,数据库恢复至宕机时刻内存中dirty状态

7.LSN顺序分析
mini-trx:
clock page
change page(in buffer)
写undo redo
unclock
//论文中用latch同时保证:1.避免脏读脏写;2.同步写log与page修改

fix rule: 所有page读写统一访问路径————即page fix至page buffer,且读写需持有锁
wal:redo log按LSN刷入log file
page落盘在log落盘后
page落盘时需fix,即落盘视作读buffer
force log at commmit
提交时log刷盘,作为持久性保证
8.ARIES论文相关补充

posted @ 2022-07-20 16:27  qmchao  阅读(103)  评论(0)    收藏  举报