极致RTO
特性简介
- 支撑数据库主机重启后快速恢复的场景。
- 支撑主机与同步备机通过日志同步,加速备机回放的场景。
客户价值
当业务压力过大时,备机的回放速度跟不上主机的速度。在系统长时间的运行后,备机上会出现日志累积。当主机故障后,数据恢复需要很长时间,数据库不可用,严重影响系统可用性。
开启极致RTO(Recovery Time Object,恢复时间目标),减少了主机故障后数据的恢复时间,提高了可用性。
特性描述
极致RTO开关开启后,xlog日志回放建立多级流水线,提高并发度,提升日志回放速度。
采用page多版本的方式支持备机读,回放线程维护每一个page的日志链,读线程根据指定的LSN(wal日志的位置)读取对应版本的page。当查询和回放冲突时,查询超时会被取消,报错信息是"canceling statement due to conflict with recovery",错误码是40001,当出现这种类型的报错时,业务端可根据错误码进行重试。
造成查询和回放冲突的日志类型主要包含如下几种:
- 删除文件
触发条件:删除文件、reindex、truncate表等操作。
处理方案:等待max_standby_streaming_delay时间后,发送cancel消息取消冲突的查询。
- truncate
触发条件: delete大量记录之后,做vacuum回收,文件末尾的无用数据页truncate。
处理方案: 等待max_standby_streaming_delay时间后,发送CANCEL消息取消冲突的查询。
- drop database
处理方案:等待max_standby_streaming_delay时间后,发送cancel消息取消冲突的查询。
- drop tablespace
处理方案:等待max_standby_streaming_delay时间后,发送cancel消息取消冲突的查询。
- vacuum清理(仅在参数exrto_standby_read_opt开启下,会产生冲突)
处理方案:等待max_standby_streaming_delay时间后,发送cancel消息取消冲突的查询。
- reindex database
处理方案:等待max_standby_streaming_delay时间后,发送cancel消息取消冲突的查询。
打开备机读之后,因为需要维护历史page版本,所以会占用更多I/O。
特性增强
为了充分发挥极致RTO基于多核CPU架构对回放性能的优化效果,建议将GUC参数redo_bind_cpu_attr(该参数用于控制回放线程的绑核操作)设置为cpuorderbind 类型,例如'cpuorderbind:16-32'。绑核区间应与通过GUC参数thread_pool_attr设置的线程池绑核区间以及通过GUC参数wal_rec_writer_bind_cpu、walwriteraux_bind_cpu、wal_receiver_bind_cpu设置绑定的CPU核号错开,区间大小根据线程数要调整,建议设置为大于等于recovery_parallelism(实际回放线程个数) + 1。推荐将所有的回放线程绑定到一个NUMA组内,性能会更好。
特性约束
- 极致RTO采用了多个page redo线程并行加速回放进度。当备机回放追平主机,空载的情况下,单个page redo线程的CPU消耗大约在15%左右(实际值与具体硬件和参数配置相关),备机回放的总CPU消耗值 = 单个page redo线程的CPU消耗值 x page redo线程数。因为启动更多的线程,CPU和内存的消耗都会比并行回放、串行回放要多。
- 极致RTO只关注同步备机的RTO是否满足需求。极致RTO去掉了自带的流控,统一使用recovery_time_target参数来做流控控制。
- 本特性支持备机读,由于增加了对数据页面历史版本的读取,备机上的查询性能会低于主机上的查询性能,低于并行回放备机读的查询性能,但是查询阻塞回放的情况有所缓解。
- DDL日志的回放速度远远慢于页面修改日志的回放,频繁DDL可能导致主备时延增大。
- 当节点的I/O和CPU使用过高时(建议不超过70%),回放和备机读性能会有明显下降。
- meta erp场景:
硬件规格: Intel(R) Xeon(R) Gold 5220R CPU @ 2.20GHz,754G memory,nvme *2,10GE网卡*2
业务模型: 使用erp 场景实例表cst_std_item_cost_t定义(表的个数1-20,以性能最优为准),行宽0.7k左右(以性能最优值为准)。使用jmeter等压测工具执行insert语句,单事务行数<4096(以性能最优值为准),并发85左右(以性能最优值为准),ustore表,无DDL。
日志量:<=300MB/s
主备时延: <=1s
- 极致RTO备机读在以下4种情况下会取消冲突的查询:
- 当查询时间超出了参数standby_max_query_time。
- 触发了备机读文件的强制回收。
- 查询和truncate类型的日志回放有冲突。
- 当查询和回放有锁相关等冲突时,和并行回放备机读相同,取消查询由参数max_standby_streaming_delay控制。
依赖关系
无。