docker in tencent

腾讯内部对Docker有着广泛的使用,其基于Yarn的代号为Gaia的调度平台可以同时兼容Docker和非Docker类型的应用,并提供高并发任务调度和资源管理,它具有高度可伸缩性和可靠性,能够支持MR等离线业务。

Gaia平台是腾讯数据平台部大数据平台的底层资源管理和调度系统,其上层业务包括离线、实时以及在线service服务,如Hadoop MR、Spark、Storm、Hive以及腾讯内部的Lhotse、Hermes、广点通等业务。最大单集群规模达8800台、并发资源池个数达2500个,服务于腾讯所有事业群。我们是2014年10月份正式上线Docker,之所以选择Docker,一方面是因为Gaia本来就一直在使用cgroups类型的容器,深知其在共享机器资源、灵活、轻量、易扩展、隔离等方面的重要意义。另一重要原因,是Gaia作为一个通用的云操作系统,适合所有类型的业务,但是各个业务的环境依赖是一个比较困扰用户的问题,因此我们引入Docker来解决,主要目的还是通过Docker来将Gaia云平台以更有效的方式呈献给各个业务。

我们使用的OS是腾讯内部的tlinux 1.2版本,最新版本正在tlinux2.0上测试,除了Docker,也使用了etcd用来做服务注册和服务发现。我们的集群都是同时兼容Docker应用和非Docker类型的应用的,MR等应用还是使用的cgroups类型的容器,其它服务使用的Docker容器,目前,大概有15000多常驻的Docker容器,还有大量业务接入测试中。由于我们原本就是使用的cgroups容器,所以换成Docker后,性能基本也无损耗,可以满足线上需求。

基于yarn的调度

自研调度器SFair,解决了调度器效率和扩展性问题。另外,腾讯的业务特性多样,因此我们引入了Docker,虽然Yarn支持不同的应用类型可以实现不同的AM(应用管理器),但是对于绝大多数应用来说,他们并不熟悉Yarn,实现一个支持容灾、可扩展的完善AM,困难较大,因此我们抽象了可以使用Docker的业务,对其进行封装,实现了统一的AM,并且对用户透明,而对用户提供的是另一套全新的基本的、易于理解的高级接口。同时,我们为Docker业务实现了统一的服务注册和发现机制,并也将其封装在了新接口中。另外,在资源管理方面,我们修改了内存管理机制,引入了磁盘和网络带宽管理。

优化Docker

对于Docker,我们主要做了三个方面的优化:首先是bug修复,比如Docker非0退出时rm不生效,对于bindmount为true时config path无法清除等bug。其次是优化Docker的资源管理策略,比如内存的Hardlimit的管理策略,不但使用户进程容易被kill,更加造成了资源的浪费,对用户估计自己业务的资源需求也非常高。Gaia引入了EMC(Elastic Memory Control)的弹性内存管理机制。最后一个方面是资源管理纬度,Docker在资源管理纬度方面只有CPU和内存两个维度,这对于共享的云环境下需要完善,也是目前相对于虚拟机不足的地方。Gaia引入磁盘容量管理,网络出入带宽控制以及磁盘IO的控制维护。其实不仅仅在Docker层做控制,还将会引进调度器,不但实现资源的隔离,还要实现资源的保证。

优化Registry

1,容量问题。开源的Registry是单机模式,其容量会受单个机器的限制。我们修改存储driver,取缔原有的mount方式,开发后端存储driver,直接使用HDFS,实现了存储的无限容量。


2,可靠性和可用性的问题。单机版本的Docker Registry,其可靠性和可用性都成了最大的问题,我们引入数据平台部的tPG系统,实现Registry server的无状态化,便于实现服务的高可用性。


3,性能问题。将单机版的Registry扩展成Registry集群,并实现在Registry server pool中的负载均衡,提升性能。


4,网络问题。解决了全国不同IDC的Gaia集群对Registry的访问,采取就近访问的原则,不产生跨IDC流量。


5,自动同步官方镜像。Docker提供的官方镜像中,有很多还是非常有价值的,而官方的Registry又在墙外,为此,我们自动同步docker的官方镜像到我们的私有仓库中。

服务发现

目前平台上的服务有Hermes、通用推荐、广点通、游戏云等服务,很多服务都需要多实例部署,因此跨主机部署非常普遍,而不同服务直接也经常会有调用的需求,主要是通过Gaia提供的服务注册和服务发现机制。具体地,NM(Yarn的一个组件)在启动Docker容器时,会将该Docker的真正地址,包括ip和所有的端口映射,都会通过etcd做自动的服务注册。对于Docker内部的服务,我们通过修改Docker源码,扩展了几个Gaia相关的环境变量,将IP以及端口映射传入。


服务的注册和发现本质上一种名字服务,因此不难理解为什么在创建应用的时候,让用户填一个应用 name的字段。而这种基于名字的服务是贯穿这个Gaia的过程的:在提交作业时,用户不需要指定Gaia master的地址,而是通过指定Gaia 集群的name即可;在获取应用的地址时,也是通过应用的名字获取;本质上port mapping也是一种名字,只不过是将用户原来expose的端口作为name,将实际端口作为value。至此,不难理解为什么name需要检查冲突。

网络管理

Gaia将网络和CPU、内存一样,作为一种资源维度纳入统一管理。业务在提交应用时指定自己的网络IO需求,我们使用TC(Traffic Control)+ c groups实现网络出带宽控制,通过修改内核,增加网络入带宽的控制。具体的控制目标有:


1,在某个cgroup网络繁忙时,能保证其设定配额不会被其他cgroup挤占;


2,在某个cgroup没有用满其配额时,其他cgroup可以自动使用其空闲的部分带宽;


3,在多个cgroup分享其他cgroup的空闲带宽时,优先级高的优先; 优先级相同时,配额大的占用多,配额小的占用少;


4,尽量减少为了流控而主动丢包。

腾讯大数据平台

Gaia是腾讯大数据平台服务调度的服务,而整个腾讯大数据平台则有很多不同的服务构成:TDW用来做批量的离线计算,TRC负责做流式的实时计算,TDBank则作为统一的数据采集入口,而底层的Gaia则负责整个集群的资源调度和管理

TDW: 腾讯分布式数据仓库。它支持百PB级数据的离线存储和计算,为业务提供海量、高效、稳定的大数据平台支撑和决策支持。目前,TDW集群总设备8400台,单集群最大规模5600台 ,总存储数据超过100PB,日均计算量超过5PB,日均Job数达到100万个。

TBank: 数据实时收集与分发平台。构建数据源和数据处理系统间的桥梁,将数据处理系统同数据源解耦,为离线计算TDW和在线计算TRC平台提供数据支持。

TRC: 腾讯实时计算平台。作为海量数据处理的另一利器,专门为对时间延敏感的业务提供海量数据实时处理服务。通过海量数据的实时采集、实时计算,实时感知外界变化,从事件发生、到感知变化、到输出计算结果,整个过程中秒级完成

Gaia: 统一资源调度平台。Gaia,希腊神话中的大地之神,是众神之母,取名寓意各种业务类型和计算框架都能植根于“大地”之上。它能够让应用开发者像使用一台超级计算机一样使用整个集群,极大地简化了开发者的资源管理逻辑。Gaia提供高并发任务调度和资源管理,实现集群资源共享,具有很高的可伸缩性和可靠性,它不仅支持MR等离线业务,还可以支持实时计算,甚至在线service业务。

参考资料

InfoQ1 InfoQ2

Related Articles

comments powered by Disqus