分布式系统迁移Docker云案例分享

前言

“只要站在风口,猪也能飞起来”,这碗心灵鸡汤不知道激励了多少英雄豪杰踏上寻风口之路。而现如今,Docker这阵龙卷风呼啸来袭,更让众人生起迎风而上、直冲云霄的欲望。为了找到这风口,腾讯数据平台部开始全面拥抱Docker,基于多年的大数据集群管理经验,倾力打造DockerOnGaia云平台(简称Gaia云),并动员将数平自身的核心系统全面接入Gaia云。

Lhotse系统作为先锋部队,经过一段时间的改造-验证-灰度,目前现网已经完全接入、稳定运营。本文旨在分享Lhotse接入Gaia云的一些实践经验,抛砖引玉,期待更多的系统加入队伍,一起在Docker云中探索前行。

背景介绍

Lhotse是一个大数据任务调度系统,从架构上看是典型的Master-Agent分布式架构,如下图所示,作为调度核心的Base统筹分配任务,交由对应类型的Runner执行:

到目前为止,Lhotse线上支持68种Runner,分别对应68种不同的任务类型,集群总机器数将近200台。面对这种复杂多样的系统环境,Lhotse接入Gaia云的核心诉求是自动化,通过自动化来降低系统管理复杂度、提高运维效率。自动化运维可以总结为两点:

机器操作取代人工操作——将复杂枯燥的工作(比如资源分配、程序部署)交给云平台处理。

通用实现取代重复实现——云平台将一些通用性的基础工作(比如进程监控、自动拉起)抽象成标准化服务,不必重复造轮子。

除了自动化之外,Gaia云带来的另一个核心点是透明化。它在应用的不同阶段有不同的含义:

在应用部署阶段,指的是机器集群的透明化。集群规模、机器分布、机器规格等因素对用户来说都是透明的,成群的服务器被Gaia封装成了一台超级计算机。

在应用运行阶段,指的是实例状态/资源使用/历史事件/系统日志的透明化。通过Gaia封装的API或者web portal,应用的一切运行动态尽在掌握,透明公开。

下面我们将分别从部署、调度、容错、灰度升级、扩缩容及服务发现六个纬度,来讨论Gaia云如何为Lhotse带来自动化与透明化。

部署

Lhotse部署遇到的最大难点在于,每个类型的Runner所依赖的运行环境都有差异。例如,Pig Runner需要机器上预装PigClient、Hadoop,而Compute Runner需要预装PLC。极端的情况是,68种Runner对应68种不同的运行环境,要在200台机器里交叉部署,并且保证各个运行环境完整一致、相互不受影响,这对运维来说是极大的挑战。

对症下药,Gaia云给我们开出Docker这一药方,带来了如下功效:

现在,Lhotse的部署流程已经完全Docker化:我们将每个Base/Runner及其运行环境build成一个Docker镜像,push到Gaia云的Registry;每次启动Base/Runner容器时,,Gaia自动从Registry pull最新的镜像。整个部署过程如下图所示:

调度

有了自动化部署,我们可以方便地将Base/Runner发布到集群的任意机器。但接下来的问题是,选择哪台机器在什么时候运行哪个程序——这是调度要解决的问题。

以前,Lhotse集群的调度都是人工静态处理,资源分配粒度只能到机器级别。这导致调度工作量大,资源利用率却不高。如下两图分别展示了各个Runner机器的CPU与内存利用率(横坐标表示Runner类型编号,纵坐标表示利用率数值):

现在,得益于Gaia云强大的调度能力,Lhotse已经告别了人工资源分配的时代,完全实现调度的自动化。Gaia的调度能力主要体现在两个方面:

资源分配粒度精细到CPU与内存级别。Lhotse可以根据每个Runner的资源需求来设定具体的CPU个数、内存值。目前,Gaia正在规划支持磁盘、网络带宽等其他资源,实现更精细化的调度。

集群公平地与其他租户共享(租户可以是不同的系统,也可以是同一个系统内的不同模块)。目前,Lhotse与Hermes系统共享集群,如下图所示,在Gaia中通过树形队列来抽象租户层次:Lhotse与Hermes作为顶级租户,根据它们不同的资源需求(Lhotse偏向CPU密集,Hermes偏向memory密集)按比例瓜分集群资源。在Lhotse租户内部,Base租户与Runner租户根据同样的调配逻辑来瓜分Lhotse的资源。这种层级化的多租户资源调配,既实现了资源的最大化利用,也保证了资源共享的公平性、可控性。

容错

如前文所言,Lhotse的Runner多达68种,任何一个Runner出错,都有可能影响大批的调度任务。因此,对于每个Runner的监控及出错处理至关重要。

以前,Lhotse通过自定义脚本来监控Runner进程,在发现错误的情况下自动重启或拉起。这种方式存在两点弊端:一是监控脚本本身也需要维护;二是只能做本机重启,无法跨机重试,对于机器挂掉的情况无能为力。

现在,借助Gaia云的自动容错机制,Lhotse从单机容错上升为集群容错,主要体现在两个层面:

自动重试,包括本地重试和跨机重试。Gaia云对于机器宕机、进程异常退出、OutOfMemory等异常都可以做到自动重试告警,且重试次数可以自行设定,本地重试优先于跨机重试。对于有本地上下文信息的Runner,可以设定较高的本地重试次数,以尽量保证效率。

自动屏蔽,即黑名单机制。当机器失败达到预设的次数,将被推上黑名单,在一定的时间内对调度屏蔽,以尽量降低出错的影响,且对业务来说是透明的。

灰度升级当花儿枯萎的时候,就是它生命终结的时候,

分布式系统迁移Docker云案例分享

相关文章:

你感兴趣的文章:

标签云: