多租户是云服务的重要属性。通过集群级别调度云服务实例,亦或是机器级别调度来自不同云服务实例的请求,云服务既要保证整个集群的物理资源都得到高效的利用,同时也要保证每个租户都能达到预期的性能指标。
1.多租户与QoS的必要性
云作为一种通用资源,为各行各业提供了强大的计算与存储能力,避免了用户自建基础设施、自行维护各类服务等所带来的开销。云服务通过负载均衡、隔离及QoS等技术,以及有限的物理资源服务了海量的用户。同时,从单个用户的视角看来,其性能与独占物理资源时的相比,没有明显的差异。
为了保证多租户场景下,单个用户可以获得与独占资源时相同的体验,云服务需要综合利用负载均衡、请求优先级调度、实例隔离等多项技术,让用户流量恰当地分布在整个集群中。另外,处理多个云服务实例请求的单个服务节点,需要公平地处理来自所有云服务实例的请求,避免请求饥饿及大负载实例对小负载实例的影响,保证每个云服务实例都能够达到其相应的服务等级。
2.多租户与QoS的一般技术
多租户与QoS的一般技术包含两个维度:一是集群维度,一是节点维度。
从集群维度来讲,云服务需要使用最少的资源来服务最多的云服务实例。云服务会通过动态负载均衡技术,将若干云服务实例调度到同一服务节点上,保证此服务节点不过载,且能够满足运行在其上的云服务实例的负载。云服务实例的压力是动态变化的,当某些云服务实例压力变大,导致某一个服务节点过载时,云服务的负载均衡器需要及时识别出来,并将部分压力迁移到闲置的服务节点上。如果服务节点不足,需要对整个集群进行扩容。在进行调度时,除了尽量均衡地分散压力,还需要限制某个用户的所有云服务实例或者单个云服务实例的若干分区的分布,以保证某个服务节点异常时,受影响的用户数尽可能少。从节点维度来讲,多租户的核心是保障每个租户的服务质量,使其延时和吞吐不受其他租户负载的影响。
总体而言,多租户系统需要具有保护底层资源的能力,同时,保证租户的公平性和服务质量的优先级。而这其中,便涉及资源保护、公平调度和优先级调度三个问题。
(1)资源保护
资源一般有两个属性。
· 容量:指底层资源提供的最大能力,例如NVMeSSD可以提供100万次的IOPS和2Gbps的数据吞吐量。当达到资源的容量上限时,资源的访问延时会加长,性能变差。
· 并发度:指资源支持的若干并发度。当提交的并发请求超过系统所能承受的上限时,也会导致资源的访问延时加长。
资源保护也是从对以上两个属性的限制入手的:限制容量即以一个非常小的时间片来限制IOPS;限制并发度即通过限制资源上的请求数的方式来达到保护资源的目的。
限制容量一方面可以保护底层资源,另一方面也可以显示限制租户的配额,从而明确地衡量与限制某个租户的资源占用。然而,当底层资源由于种种原因出现性能抖动时,如果多租户系统无法及时感知并阻断新请求的提交,那么等待使用资源的请求会持续堆积,导致整个系统出现雪崩现象。
限制并发度可以很好地处理底层资源的性能抖动。同时,为了限制租户的配额,还需要额外添加一层应用层的容量限流。
(2)公平调度
给定若干租户的任务后,调度决定了何时执行某一条请求,公平意味着不同租户的请求可以以相同的概率得到执行,从而达到所有租户平均排队时间最短、平均延时最小的目标。
为了解耦请求的接收与处理,一般请求被接收后,会被插入一个任务队列中,等待业务模块去执行。单个共享的任务队列和多租户是矛盾的,当所有租户的请求在一个任务队列中排队时,很难将一个租户的负载与其他租户的负载隔离,为了达成“所有租户延时最坏只与租户数T线性相关,与其他租户负载无关”的目的,多租户系统需要为每个租户提供一个自己的任务队列,这是公平调度的基础。
在请求被插入任务队列中后,调度器会以特定的策略来将队列中的任务提交到业务模块执行,如FIFO、Round Robin、Priority等典型策略。通过多任务队列,以及恰当的调度策略,单个服务节点上的不同租户的请求可以得到公平的调度与执行,从而给予单个租户独占系统的假象。
(3)优先级调度
在进行调度请求时,第一目标是公平调度。然而,某些租户具有一些特殊属性,如延时敏感、业务重要性高等。对于此类租户,多租户系统在调度时会给予资源倾斜,以保证他们延时更短,或者在资源被用满时,优先保证他们的服务质量。
3.文件存储的多租户实践
不同租户间的负载情况千差万别,同一租户低峰时段与高峰时段之间的压力差异也十分巨大。同时,文件操作是不等质的,不同类型请求对服务资源的消耗显著不同,例如,获取单个文件的属性与将一个文件重命名到另外一个目录下,这两者的开销相差极大。为了高效服务各式负载与各类请求,文件存储实现了集群负载均衡,同时引入了节点QoS机制。
(1)集群负载均衡
为了充分使用集群能力,文件存储通过一个集群负载均衡器来对元数据节点进行负载均衡。当检测到某个元数据节点过载时,负载均衡器会负责将过载节点上的部分实例迁出,保证单个元数据节点上的所有文件系统实例都能够获取足够的资源来完成请求处理。
(2)节点QoS机制
文件存储单个元数据节点上采用了如下图所示的架构进行多租户的QoS控制,具体说明如下:
· 外部接口层:QoS对外提供提交任务(Submit Task)接口。租户请求进入Qos系统时,系统为每个租户维护一个任务队列(Task Queue),任务请求进入对应队列的尾部。
· 调度层:对若干任务队列进行调度,保证每个租户可以公平地使用底层的共享物理资源。对于特殊租户,调度层会给予一定优先级进行优先调度。
· 资源保护层:资源保护层封装底层的共享物理资源,通过对并发度的控制来主动控制下发到底层资源的流量。当底层资源空闲时,主动从调度层获取任务来执行。
文件存储元数据节点架构
在这样的架构设计下,首先,将请求按照租户粒度抽象成多个队列,每个租户维护自己的请求队列,避免单个租户打爆系统资源队列引起的毛刺;其次,通过调度层对租户任务队列进行调度,将请求的任务队列控制在QoS系统内,实现租户的公平调度,避免因底层的共享物理资源排队过深而导致延时和优先级无法得到保证的情况发生;再次,控制单个租户任务队列对底层的共享物理资源的占用,避免单个租户用尽底层的共享物理资源;最后,通过资源保护层控制请求下发,避免在底层的共享物理资源性能退化时,因请求无限堆积而引发系统崩溃。