豌豆荚质量总监分享:从自建机房到云计算的演进之路

阅读数:3081 2014 年 8 月 13 日

话题:云计算语言 & 开发架构文化 & 方法

以下内容整理自 InfoQ 中文站跟豌豆荚质量总监高磊的一次采访对话。

豌豆荚作为创新工场的首批孵化项目之一,从 2009 年 12 月发展至今,用户量已经增长至 4.1 亿。豌豆荚的主要业务在国内,帮助用户在手机上发现、获取和消费应用、游戏、视频、电子书、壁纸等娱乐内容,在东南亚地区等海外市场也做了类似的业务探索。

这样一个快速增长的系统,对 IT 的底层支持也是一个相当大的挑战。本文将介绍豌豆荚在 IT 基础架构、工具、流程方面做过的一些事,在不同需求之间如何平衡,团队职责的划分,以及遇到的一些挑战。

受访者简介

高磊,2012 年 4 月加入豌豆荚,现任豌豆荚质量总监,负责豌豆荚的工程生产力部门(Engineering Productivity,EP)。长期关注QA 这个话题,对流程、开发技术、自动化测试、敏捷、持续集成、运维、代码库、生产力工具等方向均有所涉猎。

基础设施的建设与增长

豌豆荚诞生于 2009 年 12 月,机房部署是从 2010 年年初开始。那时候因为还没有成熟的云服务可用,所以选择了自建机房的方案。到目前为止,我们已经在全国各地尤其是北京、天津地区建立了多个节点。

从对基础设施资源使用的情况来看,我们的主要业务对带宽和 CDN 资源用量会比较高;而从单一业务来看,各类数据挖掘和分析对服务器资源的占用是最大的。豌豆荚从创建一开始就是数据驱动的业务,有很强的用户行为导向,因此数据挖掘的工作量非常多。

数据挖掘主要是基于 Hadoop 集群。豌豆荚有一个数据挖掘团队专门做产品研发(主要是面向内部),而我们这个团队则提供硬件资源和底层的 Hive、HBase 等基础设施的支撑和维护。整体的数据量、计算量一直都在增长,一开始的几年增长极快,最近几年稍微慢一些,也有每年几倍的增长。

差不多在 2011 年左右,我们开始尝试做海外版的豌豆荚 Snappea。当时评估过在海外自建机房的可行性,在考察过各个地方不同位置、不同 IDC、不同运营商的选项之后,我们发现即使在进展顺利的情况下,也至少需要两三个月才能建成,这个时间成本太高。如果不自建,那就只有公有云这一个选择,正好当时我们很多工程师都自己用过亚马逊的 AWS,出于时间、知识门槛、成本的考量,就决定在海外使用 AWS 作为我们的基础支撑。

团队

EP 团队的目标很明确:在主要产品的完整生命周期内,实现一流的效率、质量和服务稳定性;至于具体用什么技术或者方法,则并不做限制。一开始我们团队比较关注流程、开发工具等方面,现在我们对 CI、代码库、自动化测试、运维、基础设施建设等各个方面都做了很多工作,有时候工程师要引入一些新的基础设施相关的技术或框架,我们也会进行 review 它们是不是靠谱,总的目标就是让产品从开始开发到线上生产环境运行这整条路径下,其稳定性和质量都有所保证。

现在整个团队的全职工程师有不到三十人,其中运维团队有十个人,而且他们也都会承担开发任务(我们叫做 SRE,网站可靠性工程师),运维过程中需要什么工具、支持系统,都是由他们自己开发。运维团队的主要工作都在维护我们自建的机房系统上,AWS 上面现在平均投入的维护人力差不多只有三分之一个人。这一方面是因为 AWS 的维护成本确实低,另一方面也是因为我们在 AWS 上面的规模还不是太大。

从代码库到生产环境

我们的产品发布流程还是相对成形的。不同的产品线有不同的发布频率,比较稳定的在一周两次,有些比较早期的项目可能一天一次,没有太大的压力。

产品下一个 release 要发布哪些 feature、发布周期设置成多久间隔,主要是由产品经理和设计师来决定,工程师实现需求。到了发布日期截止之前,从代码库的主干拉一支发布分支出来做 feature freeze 和最后的验收测试,到发布分支上只能做 bug 修复,不再接受新的 feature。

有的产品线有统一的测试机制,有的产品线则主要靠工程师自己做测试。无论是哪种测试模式,在进入 CI 做集成之前和之后都会统一进行静态检查和已有的单元测试用例,然后才上到 staging 环境。从 staging 环境开始就属于运维负责的领域了,我们的 staging 没有真实的流量,但是环境跟线上是一模一样的,可以说是一直处在最新版本的服务,然后 staging 再跟线上环境同步代码。

这一套自动发布、部署的流程虽然也不是很完善,比如持续集成的检查点还不够多,单元测试率还比较低,不过还算跑的不错。现在 AWS 上也是同样的一套部署过程,当时适配起来也很快,大概做了一个星期就跑上去了。

监控

我们的监控系统要实现的目的无非是两个:实时的报警,以及可以追溯的历史数据,其他都是衍生的功能。跟大部分互联网公司一样,我们一开始做监控也都是用开源软件搭起来的,不过开源的监控软件现在越来越不能满足我们的需求。

这里面有两个挑战:

  1. 性能问题
  2. 数据采集的定制化问题

数据采集的定制化主要是涉及到一些业务数据的采集,通用的开源软件也还是要做适配,需要自己去写实现,这个其实还好。性能问题是一个更加严重的问题,这个问题来自于三个方面:越来越多的机器、越来越多的采集项、越来越高的采集频率。

以前我们监控,可能 5 分钟抓一次数据就行;现在我们希望做到秒级的采集。监控系统需要有实时分析日志的能力,而到机器数量增长到千台以上之后,要做秒级的采集和分析,无论是数据收集的速度还是数据分析的速度都会遇到瓶颈。

所以现在我们正在自己重写一套监控的系统,专门针对我们自建的机房体系,包括对多机房架构的支持、与资产系统的对接等等。而 AWS 上我们直接使用了其 CloudWatch 监控功能,目前来讲完全够用了。

一些挑战

因为业务跟数据密切相关,而我们部门承担了给数据分析团队提供基础设施的责任。

业务对数据报告的需求一般有两类:

1、定制化的、定期的数据指标报告

此类报告有按天的、按周的、按月的或者按小时的,一般都是比较常规的监测指标,持续监控、持续分析,中间数据保留完整,需要的计算量和存储量容易预测。这种报告需求比较容易满足。

2、按需出报告

此类需求经常是针对之前没有中间数据的监测值,之前并不知道需要针对此类数值做分析,现在忽然发现需要了,业务部门会要求一次性分析过去半年到一年跟该数据相关的趋势。此类报告往往很耗时,有时候我们做估算,一年的数据分析完毕需要用多长时间,结果可能是用我们现在的计算资源,可能要分析一个月才能产出他想要的报告,但这是无法满足业务需求的。

要提高分析速度,最直接的做法就是投入更多的计算资源——放在我们自建的机房就是扩容,如果用公有云就是起更多的实例。一方面扩容是要做的,另一方面现在 AWS 进入国内,我们也在考察使用 AWS 来做这种任务的可能性。

实际上我们用了 AWS 以来,也逐渐发现我们之前系统设计的并不是那么好。比如我们在海外的数据分析,原本是想用 EMR 的,但是发现我们现在这套东西搬过去不好直接用,只好基于 EC2 来做这个事情。为什么呢?因为 AWS 的理念是让不同的组件做不同的事,比如 EC2 只做计算,数据持久化存储最好都放在 S3;但是我们的系统一开始设计并没有考虑这些,数据都存在本地计算节点上,如果要重构,需要投入的时间还是挺多的。

包括 scaling 这件事也是,现在我们基本没有用到 scaling,因为我们的应用上下游之间的依赖关系太重,所以对 scaling 机制支持的不好。这些都是需要努力的方向。一个比较好的事情是,我们豌豆荚的工程师都是比较有情怀的,对重构这件事情比较支持。当然,这里面有投入成本和产出的考量,我们首先要满足的还是业务需求,解决业务问题,至于重构的工作,会随着我们在 AWS 上的业务规模更大而变得优先级更高。

最后想分享的是,EC2 的 reserved instance 如果用好了,能够比 on demand 模式节省很多。我们一开始不知道 AWS 除了 on demand 之外还有 reserved instance、spot instance 这些玩法,最近才刚知道。Reserved instance 非常适合 Web Service 使用,临时性数据分析用 spot instance 则比较合适。