
# 三种回放模式及备机读
Redo Log（本章节统一称Xlog）是用于恢复已确认但未写入数据库的数据，记录数据修改后的值。GaussDB备机通过同步Xlog并进行回放实现主备机数据同步。流式同步原理如[图1]所示。
图1流式同步原理   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590200724.png "点击放大")
1. 主机会话线程在数据更新时优先确保Xlog写入磁盘。
2. walsender线程持续将已落盘的本地Xlog传输至备机的walreceiver进程。
3. 备机walwriter进程将接收的Xlog写入磁盘，并向主机反馈接收位置、刷盘位置及当前回放位置，主机根据此信息完成多数派同步决策。
4. 备机回放线程读取本地Xlog并执行回放操作，完成实际数据同步。
#### 串行回放
- 按主机记录的顺序依次回放Xlog。
- 单个CN/DN实例串行回放备机读： 备机读线程在首次打开relation时，会获取当前备机回放的最新Global Xmin作为自身snapshot xmin，并以此快照执行读操作。
  事务状态由csn committing、csn committed两条Xlog组成；当备机回放完csn committed日志后，该事务可见。
  
- Page clean up（VACUUM）日志冲突： 当备机回放VACUUM日志时，若与备机snapshot中xmin较小的读事务冲突，此类读会话将在超过max_standby_streaming_delay阈值后被强制终止。
  
 
#### 并行回放
利用现代CPU多核处理能力，针对回放日志流程中耗时最长的"回放日志流程"分配多个线程，将回放日志任务按照relation粒度分发到多个线程同时处理，显著提升并行度。并行回放日志分发模型如[图2]所示。
图2并行回放日志分发模型   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620720241.png "点击放大")
- 备机通过walreader顺序读取Xlog，根据relation id分发至不同redo worker线程并行处理。
- 事务提交的Xlog由独立的事务回放线程进行回放。
- 单个CN/DN实例上的并行回放备机读： 查询与回放冲突的解决机制与串行回放模式一致。
  
- 由于并行回放采用文件级并行机制，某一时刻可能出现索引与表回放速度差异导致的两种异常场景：
  1. 索引回放比表快，索引Tuple指向的Heap Tuple尚未写入Heap。
  
  2. 索引回放比表慢，指向Heap的索引Tuple尚未写入索引。
  
  
  在情况1下，索引回放比表快，索引扫描相关操作符先访问索引，再访问表，会出现tid不存在或者页面不存在报错。
  
 
#### 极致RTO回放
回放优化基于现代CPU多核处理能力，将回放流程拆解为多级流水线架构，包含独立的事务回放pipeline及多个数据回放pipeline，实现按页面粒度分发Xlog执行回放。极致RTO回放原理如[图3]所示。
图3极致RTO回放原理   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620640365.png "点击放大")
相较于并行回放模式，极致RTO回放通过进一步提升并行度并构建多级流水线架构，每条流水线由page manager将Xlog分发至多个page worker并行处理。
单节点CN/DN极致RTO备机读机制：
引入多版本读机制：当页面回放导致历史版本数据被覆盖时，日志系统将记录历史版本页面的base page；其余Xlog以LSN链形式持久化存储。读操作根据快照LSN判断应读取最新页面或历史版本页面。极致RTO备机读原理如[图4]所示。
图4极致RTO备机读原理   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002620720243.png "点击放大")
读线程select backend1执行涉及多个页面的读操作时，在打开relation阶段会获取当前极致RTO快照（如快照125），提取该relation1的base page 100，回放LSN链上的Xlog直至达到读快照LSN阈值，随后依次获取relation2等其他数据页的base page并回放对应LSN链上的Xlog，最终整合所有页面数据完成历史版本读操作。
针对引发物理数据页删除的部分DDL操作，如VACUUM、DROP TABLE、TRUNCATE TABLE、DROP DATABASE，增加延迟删除机制，同时通过系统表MVCC机制与syscache的invalid msg机制协同实现系统表的多版本处理，有效解决查询与回放此类DDL操作的冲突。
