使用Docker从Heroku迁移到AWS

DoorDash是一家按需提供快速物流服务的公司。最近,他们发现其基于Heroku的基础设施已经无法满足需求,于是便迁移到了Amazon Web Services。其间,Docker技术的引入为他们节省了大量的时间。近日,DoorDash官方博客发文介绍了迁移过程。

DoorDash最初选择Heroku是因为它简单方便。但随着流量增加,Heroku显现出以下几个方面的问题和局限:

  • 性能:Heroku服务器实例(又称为“dynos”)性能表现欠佳。每个dyno的CPU性能和内存资源均非常有限。即使在对Django应用进行了大量优化之后,他们仍然不得不增加许多dyno,这使他们觉得目前的基础设施不具备持续可扩展性。
  • 成本效益:Heroku dynos的计算资源非常昂贵,租用一个Heroku “2x” dyno(内存1GB)的费用可以租用一个Amazon c3.large EC2实例(内存3.75GB)。
  • 可靠性:Heroku部署API一到两周就会出现一次问题。
  • 控制:在Heroku环境中,无法对服务器进行细粒度的控制,比如,安装自定义软件时无法通过SSH登录服务器调试CPU或内存问题。

为了克服这些问题,他们选择了Amazon Web Services。Amazon EC2实例CPU内存配置丰富多样,允许以root权限访问,并且性价比更高,看上去是个理想的解决方案。但是,迁移工作量很大。为了自动化服务器配置过程,需要安装“配置管理”软件(Chef或Puppet),而且还需要学习相应的领域专属语言,编写脚本执行第三方依赖安装任务及配置服务器栈中的所有软件。之后,为了测试,还需要使用Vagrant建立一个本地开发环境。因此,他们希望有一种更简单的方式帮助他们完成这项工作。经过研究,他们选择了Docker,迁移计划变成了将运行Django应用的Docker容器部署到Amazon EC2实例上,这样就不需要将大量的时间花费在EC2主机配置上,从而将这种复杂性转移到了Docker容器环境中。迁移过程主要包含以下两个方面的工作:

  • 使用Dockerfile创建Docker镜像:与Chef或Puppet脚本相比,Dockerfile更容易编写和理解。对Django而言,这一部分主要是指出如何安装第三方Python依赖以及配置复杂的软件组件(如Web服务器或数据库连接池)。
  • 准备Docker环境:为了节省时间,他们决定使用AWS Opsworks,这是一个内置了Chef的服务,可以帮助他们管理EC2实例。虽然最终没能避免使用Chef,但由于绝大多数的系统配置工作都已经在创建Docker镜像时完成了,所以这里并没有很多工作要做。

下图是迁移完成后的代码部署流程:

使用Docker从Heroku迁移到AWS_第1张图片

两名DoorDash工程师用大约一个月的时间完成迁移,其中还包括学习Docker、AWS和Chef。新环境的性能提升了2倍多,DoorDash的平均API响应时间由220毫秒降到了100毫秒以下,后台任务执行时间也降低了一半。而且,所需服务器的数量也减少了一半,大大降低了托管成本。此外,由于有更多的控制权限,他们还安装了Nginx作为反向代理,提高Web API吞吐量。毋庸置疑,他们非常高兴迁移到AWS,而Docker是他们能够快速完成迁移的关键原因。

感谢郭蕾对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流。

你可能感兴趣的:(使用Docker从Heroku迁移到AWS)