hippo是目前阿里搜索主要的调度系统,hippo是一套分布式调度系统。与YARN和K8s的目的相同,都是提供为集群资源调度服务。
hippo架构
hippo是典型的master-slave架构,这与YARN类似,多个master通过zookeeper选主做failover和调度结果的持久化,master上主要是根据业务需求和资源供给进行资源预估,匹配算法和合理资源分配,资源分配的结果通过心跳发向各个slave作为资源目标,App master获取资源分配结果后向slave发送业务worker相关描述目标,slave以不断趋向目标的方式异步执行并自动进行Qos调控。themis进行资源管控,hippoweb可视化展示,hippoPE运维升级。
hippo业务和资源接入
hippo通过API-server,libCarbon和SDK三种方式提供业务接入,SDK是最老的接入方式。目前主流方式是通过API-server。如Yarn实现必要的协议对接,基于libCarbon(Hippo二层调度库)的Drogo管控平台接入相对简单的一维服务(如搜索应用searchweb)和suez-ops管控平台接入较为复杂的多维服务(如多行多列淘宝,天猫搜索引擎)。Hippo支持自身和业务的镜像化、容器化和服务化,系统服务如DP2(数据分发),Amon(指标收集)等基于二层carbon服务通过Pod模式(类似k8s的POD)组织部署。hippo on host是最早支持的对接乌力吉的资源接入方式,得益于hippo自身镜像化、容器化,hippo on host仅两个月半月便对接联调成功。
hippo资源分配协议
hippo是目标驱动、异步执行、最终一致、面向业务的分布式调度系统。实现了如offline协议,不强制回收,保证最小服务数渐进更新、单点故障failover等服务保障。基本的业务流程是App client向hippo master提交App描述,设置App master的资源需求目标,hippo master根据app master资源目标异步执行,在资源分配后启动app master(2-3),app master再向hippo master发送申请app worker资源的目标(4),hippo master根据app worker资源目标异步执行进行资源分配,app master根据返回的已分配资源向对应的hippo slave发送启动app worker请求目标,hippo slave再拉起app master(5-6)。
hippo重要特性
hippo镜像化容器运行
hippo的master和slave实现了镜像化和容器化运行,具备了快速部署和渐进升级的能力。
资源隔离
hippo slave上目前主要使用内核提供的cgroup子系统如blkio,cpu,cpuset,memory,net_cls和特定内核接口实现了对cpu/memory/Disk/network等不同层次和维度的资源隔离。
资源预估
hippo master上的一个插件管理的资源预估模块,通过对slave上返回的心跳信息中的每个slot的cpu/memory使用情况汇总,进行了相对简单的app+role级别的资源评估,资源预估的结果将作为资源超卖的主要依据之一,从而引入了类似resource guaranteed和resource limit的概念,也将影响资源弹性。
资源超卖
hippo slave将单机划分成在线和离线两个cgroup大组,在线空闲资源超卖给离线,以及离线之间资源超卖。在线负载低时,离线可以借用在线空闲资源,在线负载上升时,借出去资源要回来,也就是完全动态自主不断调整。目前主要做了CPU和memory两个维度的超卖。CPU维度主要是基于水位控制的思想,因为超线程以及其他资源的争抢的影响,水位超过一定限制CPU能力时开始非线性增长,在设置的安全水位下,可以将在线的闲置CPU资源卖给离线使用,并有最小使用量保证,防止调度饿死宕机。memory本身是非弹性资源,超卖策略上相对弹性资源CPU会保守一些,借用的闲置资源在某个阈值后借用比例会降低,memory如果不能在约定时间内释放出来将综合考虑优先级,运行时间,memory使用比例等因素选择某个离线进行用户态kill。hippo slave上每轮调度会计算离线任务的保底resource guaranteed和上限resource limit资源并以文件方式通知对应的slot,以便slot对应的业务做出决策。高峰期CPU和memory在离线分配百分比115%左右。
POD
类似于k8s的任务编排方式POD,在容器化环境中建立一个面向应用的逻辑主机模型,它可以包含一个或多个紧密联系的容器,多个容器共享slot资源,比如PID,IPC等。相比原生的容器接口,POD通过提供更高层次的抽象,简化了应用的部署和管理,hippo上的一些系统服务已经使用这种模式部署。
YARN on Hippo
通过yarn on hippo,实现了yarn这样的框架平台任务在hippo上调度,打开了离线任务的巧克力盒子。离线Topia(离线运维平台)通过hippo-api-server对接hippo,向hippo申请资源,根据返回的分配结果在相应的hippo slave上启动NM容器。这些NM组成了YARN的一个online partition,和离线自己的offline partition被yarn统一管理。这样离线任务就可以被调度到在线集群的NM上运行。通过上述资源隔离、预估、超卖等,并在保证在线业务质量的前提下,将闲置资源超卖给yarn,从而可以通过在线集群承接运行在yarn上的任务,在大促场景,可以借用离线的机器部署在线任务,从而实现在线和离线之间的资源流转。