Mozilla 的 Web 运营工程师 Brandon Burton 透露,通过内部学到的简易扩展模式,Mozilla 将网站服务能力的规模从支撑数千用户扩展到支撑数亿用户。这些学到的经验教训包括缓存、对 Web 服务器的横向扩展、异步作业和数据库。在洛杉矶举行的DevOps 集会中, Brandon 展示了 Mozilla 对这些主题的见解。此外,他还分享了 Mozilla 对 DevOps 能力未来的技术规划,包括自服务部署、平台即服务(PaaS)和公有云的使用。以下是 Brandon 的演讲要点:
缓存:使网站能够高效运行的缓存主要有三种:内存数据缓存、本地资源缓存和全局资源缓存。内存数据缓存(例如针对会话状态的memcache )最适宜于存储那些本身是无状态协议一部分的HTTP 请求之间的状态。接下来是直接位于网站前方的本地资源缓存/ 代理,它能够存储图像及其他静态文件,使网络服务器不必处理相关的请求就能够快速检索,此类工具包括 Stingray 、 Varnish 和 Squid 。最后是全局资源缓存(例如,内容分发网络,简称 CDN),它的作用和之前介绍的本地资源缓存相似,但它会存储更贴近最终用户的缓存文件。此外,这些全局资源缓存(CDN)会根据每个用户的位置动态选择最佳网络路由。Brandon 介绍说 Mozilla 同时使用 Akamai 和 EdgeCast 作为他们的 CDN。
横向扩展 Web 服务器:Web 服务器的横向扩展可通过自动化工具释放和配置。所有的 Web 服务器都不会为自己或者其他的 Web 服务器将 HTTP 请求过程中有持久性要求的状态存储在本地,基本上“没有分享任何内容”。Web 服务器通过使用像 memcache 、 NFS 或 S3 这样的技术将它们的状态存储在自己的外部。因此,Web 服务器可以被释放或添加到池中,而不会对其他的 Web 服务器产生负面影响。自动化工具(例如 cfengine 、 Opscode Chef 或 Puppet )为网络服务器约定了一个众所周知的运转状态,可以被添加到待扩展的 Web 服务器池中。这些工具也可以管理全部网络服务器的更新。
异步作业:在使用网站的过程中,用户期待快速响应。异步处理用户的请求能够减少服务器计算资源的竞争,为最终用户的各个请求提供更好的响应。在某些情况下,用户请求了很复杂的任务,为了保持相似的性能,除了异步之外没有其他的合理方式能够处理。Brandon 声称,Mozilla 通过将诸如 Celery 和 RabbitMQ 等工具协同工作促进了任务的异步处理。
数据库:Mozilla 使用 multi-master MySQL 来提供高可用性,同时该 MySQL 的 slaves 用于提供数据的只读访问。此外,slaves 位于负载均衡器之后,这样读取请求的处理能够被分发到不同的服务器,以免某个服务器过载。 Fusion-IO 和 Kingston SSD 存储也有助于提升数据库的性能。Brandon 还强调了“优秀的 DBA”对 Mozilla 的重要性,他们维护之前提到的数据库系统。
Brandon 分享了 Mozilla 改进 DevOps 的未来计划。他们将会通过 Jenkins 构建自服务部署。Mozilla 将基于 ActiveState 的 Stackato 技术为其内部开发团队建设 PaaS。同时 Mozilla 也在努力扩展到 AWS 公有云上。
Brandon 将在今年 2 月在洛杉矶举行的 Scale11x 大会上针对这些内容给出更深入的技术分析。他还在帮助推动 hangops ,一个每周一度的 Google 聚会,在那里会就DevOps 话题进行时长一小时的讨论。主题包括文化、远程工作与运营工具。
查看英文原文: Learning to Scale Websites at Mozilla
感谢孙镜涛对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论