
功能介绍及痛点


执行并发度小:为不影响存储节点其他任务,Compaction仅可使用少量存储节点资源以较少的并发在后台执行。
资源隔离性弱:即使在充分的资源隔离措施的前提下,Compaction的任务执行依然难免在业务高峰期影响查询与写入。
扩展弹性能力弱:不能独立为Compaction任务进行资源扩容,只能伴随存储节点扩容。
为了解决上面客户痛点问题,ADB MySQL推出了Compaction Service功能:将系统后台Compaction负载从存储节点解耦出来,由基于Region级别池化资源并自动弹性扩展的Compaction service承担这部分负载。
秒级弹性扩展能力:在业务流量增加突发大量写入时,可以秒级扩展Compaction资源,实现提升数倍任务并发。可以尽快的将实时数据转换为历史数据,即使存在写入洪峰也不会影响用户查询性能。
高负载隔离能力:系统后台Compaction在Compaction Service执行而不是在存储节点中执行,显著降低Compaction执行对用户读写业务的影响。
按量付费能力:根据Compaction数据量计费,不需要为Compaction负载保留常驻资源,无Compaction任务时无需付费。
下文将重点从技术的角度向大家介绍Compaction Service的整体实现。
技术架构


基于池化弹性资源池的共享服务:建设Region级别池化共享的Compaction Service,有一定的常驻资源保证高效率的任务执行,避免频繁重复的资源拉起和释放导致的低效率,同时通过一个Region多实例共享池化资源和弹性扩缩容降低服务成本。 多租户实例任务的隔离和调度:确保调度公平性,避免一个实例任务长期等待。 秒级自动弹性扩缩容:通过感知集群任务负载情况,自动执行秒级集群扩容和缩容,在任务堆积时通过扩容来避免任务长期等待,在任务数量少时通过缩容来降低服务成本。
调度Compaction Task到Compaction Service执行

▶︎ 执行:在ADB MySQL的存储引擎之上,我们实现了一套Storage SDK。借助这套Storage SDK, Compaction 任务可以脱离存储节点执行在Serverless的Compaction集群之上。Storage SDK核心包括两个模块:
读模块:可从存储节点或OSS中读取ADB MySQL自研格式存储与索引文件。
写模块:实现将读取数据进行加工做排序、构建Layout、构建索引等工作,并将处理结果写入到制定存储介质。
第一层调度在存储节点的Compaction Scheduler
第二层调度在Compaction Service的控制节点
多租户任务的隔离和调度
多租户下的任务资源分配和优先级调度,如分配一个实例合理的资源,以满足该实例任务运行需求;如确保调度公平性,避免实例任务长期等待排队。
多租户下的任务执行隔离,如避免多租户任务的执行上下文相互影响;如避免多任务之间资源竞争影响。

Controller维护全局状态,负责提交流控和任务调度。
Executor维护和汇报本地状态,负责任务执行和隔离。
多租户任务流控

对每个实例的可以提交执行的Compaction Task做流控是Compaction Service的自我保护机制,避免一个实例突然提交异常大量任务导致Compaction Service资源被一个实例耗尽,同时默认流控值可以保证实例正常Compaction Task执行需求。
▶︎ Compaction Service中最小资源分配单位是1个Slot:一个Executor支持8个Slot,一个Task占用一个Slot。
原则:以实例资源数量作为多租户资源分配依据。 策略:根据实例资源来分配实例可以运行Task的最大并发,默认并发为一个实例ACU数*0.375,这个数值是实例Compaction的执行并发数,可以满足实例正常Compaction Task执行需求。 执行:Compaction Service会对实例的Task提交数量做流控。
多租户任务调度

▶︎ 选择最优先的Task
多租户优先级调度:调度选出最高优先的一个实例
a. 原则:实际消耗集群资源占比 =(趋近于) 实例资源占比
租户内实例优先级调度:会按照Task提交时间顺序调度,因为Worker Compaction Schduler已经按照优先级顺序提交了Task。
▶︎ 选择最空闲的Executor
选择空闲Slot最多的executor节点。无空闲Slot的节点时会排队等待,等待其它task执行结束或集群自动扩容。
多租户任务隔离

▶︎ 每个Task有独立的互不干扰的执行上下文:Task元信息:如实例元数据信息、表元信息等。
Task执行信息:如控制是否使用SSD Disk作为临时缓存等。
Task执行过程中临时信息:如执行统计信息等。
▶︎ 限制每个Task所使用的资源:每个Executor可执行8个Task,每个Task可使用Executor的1/8资源。
默认限制最多使用1 Core Cpu和1/8 Memory。
默认不限制SSD Disk的使用,在SSD Disk使用率达到90%时,自动切换到不使用SSD Disk作为缓存的执行模式,保证任务正常运行。
默认不限制IO的使用,在IO资源使用率接近100%时,自动限制单个任务的IO资源使用,最低会降低到最小的1/8 IO资源。
秒级自动扩缩容

为了在任务堆积时快速扩容资源,我们采用了快速的扩容策略,可以在30s内完成40个Executor节点的扩容,平均一个节点耗时<1s。而为了避免误缩容导致任务堆积,我们采用了保守的缩容策略,会在缩容前等待5分钟,如果5分钟内仍无任务需要执行,才会执行缩容,同时缩容节点会等待正在运行任务执行结束,避免缩容节点导致任务执行中断导致资源浪费。
总结





点击了解 ADB Compaction Service功能





