这是系列文章的第一篇,介绍我们如何借助容器让服务器更易于扩展和管理,从而跟上业务需求的步伐。
关键元素是:
- Docker:容器技术,使应用更加便携和易于管理
- CoreOS:提供最小化的操作系统,便于流程规划和Docker容器的运行
Shopify是一个大型的Ruby on Rails应用程序,这些年底层做过大规模的扩展。我们的生产服务器扩容到使用1700个核以及6 TB内存,能支持每秒超过8000次的请求。
Docker备受瞩目,因为其能够将应用打包进便携的容器,从而实现版本控制和快速部署。
容器听上去很像虚拟机(virtual machine,VM),它有独立的文件系统、网络环境等等。但是容器又比虚拟机更加轻量,能够更高效地利用硬件资源。Docker容器不是像VM一样去模拟物理硬件的行为,而是允许多个应用程序安全地共享Linux宿主机器,通过:
- 内核命名空间使应用间相互隔离
- cgroups限制资源的上限并实现计费
- 多层文件系统减少容器的大小
Docker在开发和维护团队中迅速走红,主要是因为:
- 快速启动:容器可以快速启动和运行,只需要几秒时间。如果需要,可以利用容器构建的时间做一些其他耗时的操作。快速启动意味着快速部署。
- 超高利用率:容器最大限度地共享宿主机器(比如,单核机器),相比VM能更为有效地利用硬件资源。这意味着在同样的硬件配置上可以运行更多应用。
- 一致性:容器确保每个实例启动时是完全一致。
- 开发友好的工作流:容器由纯文本的Dockerfile构建,Dockerfile可以做版本控制从而帮助区分容器版本。另外,开发人员可以用很熟悉很像git的push/pull操作来发布容器。
- 运维友好的工作流:容器包含操作系统,因此,如果你需要安装一个package或者自定义的配置,开发人员就可以完成这项工作,而不需要推给运维人员。这是工作职责的重要改变:开发人员负责容器,运维人员则可以关注于提供可靠的硬件和网络。
最重要的容器特性是可以实现一机多用。做不同工作的容器可以在相同的硬件系统上和平共处。这使得数据中心真正成为普遍意义上的计算资源。比如:
- 可以很快很容易地增加应用服务器容器的数量,这意味着我们随时可以应对突然的流量尖峰。
- 可以轻松地拿出生产服务器的闲置资源去进行所需资源密集型的操作,比如数据分析。
听上去不可抗拒吧?我们也有同感,而且我们已经准备来分享我们的经验,如何将这些愿景变为生产级别的现实。我们不仅仅高谈阔论,我们还会在社区里分享尽可能多的代码。
这里有很多内容可以讲,我们将分期介绍:
- 容器化:如何以一种能让自以为是的开发团队满意的方式,将已有应用放到容器里?
- 管理诀窍:真实的应用包括很多API秘钥和数据库密码,这些都需要安全得保存(最好是能版本控制,并能在Heartbleed这样的事件再次发生的时候迅速把它们找出来)。我们在这里有不错的解决方案。
- 路由:怎样将容器连接到外部世界,并能和生产环境的基础架构(比如负载均衡器)完美合作?
- 监控:我们的容器化架构需要达到或者超越Shopify的99.97%的在线时长。维护系统时需要花费大量的工作在问题变得严重之前发现并解决它。在容器化的世界里解决这个问题需要和纯物理机环境不同的解决方案。调整已有的监控系统来监控新环境是保证Shopify稳定性的重要环节。
- 健壮性:优雅且可预见地抛错很难。我们在处理内存耗尽(out-of-memory),请求队列化和signal处理上的经验可以供大家参考。
- 部署:我们的系统构建在Chef和Ubuntu之上,现在计划更新为纯物理机上的CoreOS。之后会介绍我们如何部署节点使其能够运行容器,并且在全是容器的世界里实现高效监控。
敬请关注今后各个话题上更深入的探讨。
时间: 2024-10-11 06:21:51