
# 极致RTO
极致RTO（Recovery Time Objective，恢复时间目标）功能是通过充分利用服务器的多核CPU资源，建立多级日志回放流水线，使备机日志回放的并发度提高到页面级，实现回放加速的高可用功能。
GaussDB数据库的主机通过发送WAL日志给备机回放，实现主备同步。当业务压力过大时，如果备机的回放速度跟不上主机的速度，在系统长时间的运行后，备机上就会出现日志累积。此时当主机故障后，数据库恢复提供服务能力需要很长时间，影响系统可用性。在硬件资源充足的情况下，开启极致RTO特性，可以提高备机回放速度，减少主机故障后数据库的恢复时间，提高系统的可用性。
极致RTO功能可通过设置参数recovery_parse_workers和recovery_redo_workers开启，recovery_parse_workers代表开启的数据回放流水线数量，recovery_redo_workers代表每条数据回放流水线上启动的数据回放线程数量。如上两个参数中有一个大于1即为开启极致RTO。
#### 原理
极致RTO特性是通过充分利用服务器的多核CPU资源，采用多级流水线架构实现回放加速的高可用功能。其主要原理是流水线上游的三个线程分别负责从硬盘以字节流的形式读取日志到缓存、将字节流解析成逐条Xlog、解析Xlog语义并进行分发，实现了对日志的高效并行预处理。流水线下游分为多条数据回放流水线和一条事务回放流水线，对数据页面日志和事务日志的回放实现了并行化。在对数据页面日志进行分发时，先以表级粒度进行拆分和分发到不同的数据回放流水线，然后再按照页面粒度拆分和分发给不同的回放线程进行回放。分发的环节通过利用相关哈希算法，保障同一张表的日志由同一条流水线回放，表上同一个页面的日志由同一个数据回放线程回放。由此，实现了将备机日志回放的并发度提高到页面级，并可通过设置参数扩展流水线和回放线程的数量，提高回放速度和回放并发度。架构图如[图1]所示。
图1极致RTO架构示意图   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/figure/zh-cn_image_0000002590360970.png "点击放大")
#### 示例
1. 完成GaussDB集群的安装部署。
2. 完成数据库安装后，通过修改GUC参数recovery_parse_workers和recovery_redo_workers开启极致RTO回放模式，具体操作请参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 预写式日志 \>日志回放"章节。recovery_parse_workers代表开启的数据回放流水线数量，recovery_redo_workers代表每个数据回放流水线的回放线程数量。参数修改后需要重启数据库后才可生效。
3. 在主机执行DML业务测试。然后通过cm_ctl query -rv查询备机回放状态。其中speed字段表示此时的回放速度，delay字段表示当前备机落后主机的时延。 
   ```
   node                           : 3
   instance_id                    : 6003
   node_ip                        : 8.92.5.241
   data_path                      : /data/omm/data/slave12
   type                           : Datanode
   instance_state                 : Standby
   is_by_query                    : 1
   primary_flush_location         : 00000023/5D6A4998
   standby_received_location      : 00000023/5D6A1560
   standby_replay_location        : 00000023/5AE12260
   static_connections             : 2
   HA_state                       : Normal
   reason                         : Normal
   redo_start_location            : 00000022/5D9EB3D0
   min_recovery_location          : 00000023/5569D660
   read_location                  : 00000023/5D66F6D0
   last_replayed_end_location     : 00000023/5AE12260
   recovery_done_location         : 00000000/00000000
   local_max_lsn                  : 00000023/5D6743A8
   read_xlog_io_counter           : 32253
   read_xlog_io_total_dur         : 3840586
   read_data_io_counter           : 1649089
   read_data_io_total_dur         : 168654452
   write_data_io_counter          : 0
   write_data_io_total_dur        : 0
   process_pending_counter        : 0
   process_pending_total_dur      : 0
   apply_counter                  : 5
   apply_total_dur                : 16095
   speed(est.)                    : 78664 KB/s
   delay(est.)                    : 0 s
   senderPercent                  : 0%
   receiverPercent                : 99%
   worker_info                    : 
   id  q_use   q_max_use  rec_cnt              
   0   42      0          23119337             
   10  41      0          12575866
   ```
   
   
 
#### 注意事项
- 极致RTO功能可通过设置参数recovery_parse_workers和recovery_redo_workers开启。recovery_parse_workers代表开启的回放流水线数量，recovery_redo_workers代表每个流水线的worker数量。如上两个参数中有一个大于1即为开启极致RTO。
- 打开极致RTO后，备机会额外启动的回放线程总数=recovery_parse_workers \* (recovery_redo_workers + 2) + 5。回放线程越多，占用CPU、内存和I/O资源越多。请根据实际硬件配置合理设置参数，避免因为参数设置过大，导致CPU和内存占用过高，进而导致系统启动异常。
 
#### 另请阅读
极致RTO相关参数描述参见《参考》中"数据库运行参数说明 \> GUC参数说明 \> 预写式日志 \> 日志回放"章节中recovery_parse_workers和recovery_redo_workers参数描述。
