【华为云MySQL技术专栏】TaurusDB限流并行恢复机制
1.背景介绍
限流并行是TaurusDB备份恢复模块中的一个特性,可以在不影响业务的前提下通过加大数据恢复并行度来实现数据的高效恢复。先简单了解下备份恢复模块:
备份恢复模块主要包含备份和恢复两大功能。
-
备份有全量备份及增量备份,主要通过日常定时完成或者用户按需触发,将数据备份至远端的OBS服务器中。
-
恢复也有全量恢复及PITR(Point-In-Time Recovery)恢复,主要适用于数据库实例异常、数据误删等异常场景,以及新实例创建等运维场景,在恢复时将备份的数据从远端OBS服务器拉取下来,还原到目标数据库实例中。
评估一个数据库系统备份恢复模块的重要指标,是备份时长和恢复时长——备份时长代表了整个备份所需的时间,较短的备份时长通常会减少对系统性能的影响。恢复时长则指从启动恢复到对外可提供服务所需的时间,较短的恢复时长则意味着较短的业务中断时间,恢复流程包括了实例创建、全量恢复、PITR恢复、实例启动等阶段。
TaurusDB因采用存算分离架构,可支持的数据容量更大,也因此在“全量恢复”阶段的耗时也相对较长。为了加快数据恢复的速度,TaurusDB引入了限流并行特性,以此来缩短恢复过程的整体耗时。本文将详细阐述该特性的工作原理。
2.原理介绍
TaurusDB基于存算分离架构,数据主要存储在不同的slice中(slice是DFV中一种逻辑存储单元),而这些slice又分布在不同的DFV host环境中。
备份时,backup_manager(即备份工具)会下发ishardctrl命令(ishardctrl是备份工具与其agent之间的命令交互机制)至各个DFV host,由DFV host将相关的slice备份至OBS服务器上;而恢复时,backup_manager会下发命令至各个DFV host,DFV host再将OBS服务器上的数据导入到对应的slice中。.
图 1备份恢复交互关系
在恢复过程中,各个DFV host是独立进行的,相互间无依赖。TaurusDB为了提升恢复的性能:
1.引入了并行机制,对恢复流程采用并行策略,通过加大并行力度,充分利用整个存储系统资源对恢复流程进行加速;
2.由于不同的业务实例可能会共享同一套存储池资源,加大并行力度会占用更多的资源,进而影响其他实例的业务性能,因此需要充分准确地评估对现有业务的影响并自动调整并行力度,确保不影响正在运行的关键业务,对此,TaurusDB引入了限流反压措施。
3.实现解析
3.1 并行
首先介绍一下并行机制的实现方法。由于备份恢复流程涉及到实例侧和存储侧,两侧都对并行机制做了处理,所以这里分别进行介绍:
3.1.1 实例侧
恢复流程由backup_manager触发,涉及到多个DFV host中的多个slice节点。backup_manager从OBS获取元数据,解析出slice的列表后,使用了一个线程池机制来实现多slice并行恢复,同时通过参数配置了线程池的上限,从整体上控制单个实例的最大并行数。
图 2实例侧线程池并行恢复
3.1.2 存储侧
存储侧是以slice为粒度来进行并行恢复,并使用了DFV上slicestore的线程池机制,这样每个DFV host节点上都有一套线程池,通过线程池来实现单个DFV host节点中的恢复任务并行化。
backup_agent会处理backup_manager下发的ishardctrl命令,并根据命令的种类和执行耗时情况,将命令划分成了三种类别:
-
短命令
-
备份长命令
-
恢复长命令
slicestore对应性地给这三种命令分别分配了一个线程池,线程池的初始规格如下:
由于短命令的执行耗时很短,所以线程池规格比较小;而备份基本以定时任务方式在业务低峰期执行,为了防止影响业务,也控制了线程池的规模;而对最紧急的恢复任务,则给予了最大的线程池规格。
backup_manager在下发的命令的时候会带上命令类别信息。存储侧收到命令后,会先交给轻量级线程池处理(这里也是并行处理,但是不属于本文中的限流并行特性范围),轻量级线程获取到命令类型后,封装成一个独立任务,然后提交到任务列表中等待处理。slicestore线程池调度时,再将任务简单解析后,放入到对应的线程池中进行处理:
图 3存储侧线程池并行恢复
3.2 限流
限流机制是通过控制同时并行的任务数来实现的,其关键是流控检测时机、指标和门限的设置。
为了限流更精准,TaurusDB按流程在三个地方做了限流:
1,backup_manager在下发备份恢复命令前,如果发现对应DFV host已限流,则不再下发恢复命令,后续迁移到其他节点上执行。
2,将备份恢复任务加入到slicestore的线程池前,如果发现本节点限流,则不再执行恢复任务。
3,恢复任务执行过程中,如果发现本节点限流,则不再执行恢复任务。
图 4限流检测时机
检测的时候会判断限流指标是否达到指定门限,如果超过门限,则进行限流。
说明:除了检测指标外,在加入到slicestore线程池前,会额外根据任务等待时间来决策是否丢弃,防止出现因任务拥塞导致的命令来不及处理。
目前的限流判定主要依据2个指标:
1,线程池资源
这个指标门限值是一个动态变化值,会根据当前的读时延的情况,进行阶梯型的调整。如果线程池资源不足,则触发流控。
2,盘的读时延指标
统计业务的IO和备份恢复的IO在总IO中的比重,然后加权计算出一个盘读时延的指标门限值。如果实际时延超过了门限值,则触发流控。
图5限流检测流程
所有指标的计算都是定时执行的,有一个专门的后台线程进行相关统计分析。
由于恢复时机比较随机,业务差异及变化可能比较大,所以指标门限也需要动态调整。在备份恢复场景中,会出现大量的备份恢复IO操作,为了更加精准地判定限流情况,线程指标门限值和IO读时延指标门限值均会实时调整。
线程指标门限计算方法:
为确保线程资源充足又不浪费,TaurusDB对恢复线程数指标的门限值,设置了一个初始值(以下称为idle值)和上限值,并通过周期检测,在【idle值~上限值】的范围内来调整实际门限值:
1,判断当前是否有恢复任务执行,如果没有,门限值每轮周期减一,直到降为idle值。
2,如果有恢复任务执行,则判断IO读时延的情况,对比不同级别的时延门限值,进行不同程度的调整:
a) 如果读时延小于第一级时延门限且有恢复任务执行,说明压力很小,每轮周期门限值按阶梯值1、2、3、4加大。
b) 如果读时延大于第一级且小于第二级时延门限且有恢复任务执行,说明压力较小,每轮周期门限值加1。
c) 如果读时延大于第二级且小于第三级时延门限且有恢复任务执行,说明压力一般,每轮周期门限值不变。
d) 如果读时延大于第三级时延门限且有恢复任务执行,说明压力较大,每轮周期门限值根据当前实际线程数,按特定的比例进行减小。
IO读时延指标门限计算方法:
IO读时延门限 =(备份恢复IO计数* 备份盘读时延门限 + 非备份恢复IO计数 * 平均盘读时延门限) / 总IO计数
4.典型场景测试对比
为验证限流并行特性的效果,对引入该特性前后的全量恢复时长进行了测试比对,结果显示全量恢复时长有明显缩短:
图 6限流并行效果
注:1,数据量:备份数据包总大小为1T,备份在华为OBS上;数据模型:共1000张表,每张表有500W条记录;2,测试数据的绝对值与环境有关,不同规格实例、负载、时间段、带宽等,采样数据会存在差异。
5.总结
TaurusDB的限流并行特性通过精准的限流控制策略,在不影响其他正常业务的前提下,大幅度提升了数据恢复的性能,减少了用户的业务故障等待时间,且后续还可以进一步地细化调度策略,充分利用存储资源的集群特点,结合带宽、IO等资源统计情况,更高效地利用低负载节点进行恢复,从而更进一步地减少恢复耗时。
- 点赞
- 收藏
- 关注作者
评论(0)