导读:许多团队都使得他们的基础架构越来越复杂,YouTube团队却尽量保持简单的风格。正是凭借简单的技术哲学,才成就了YouTube在线视频王者的盛名。
如果你想构建一个可以承载日访问量40亿次的网站,YouTube有许多值得借鉴的地方。本文是YouTube的工程师Mike Solomon在PyCon(PyCon是Python开源社区的开发者年度盛会)上关于YouTube扩展性演讲的摘要,相信会对大家有所启发。
许多团队都使得他们的基础架构越来越复杂,YouTube团队却尽量保持简单的风格。他们使用Python作为主要开发语言,使用MySQL开源数据库,并一直使用Apache作为Web服务器。对一个如此庞大的站点而言,许多重要特性都源于点点滴滴的Python代码。
这并不意味着YouTube不追求创新,他们更追求一种技术哲学,而非炒作。究竟是什么成就了世界上最大的视频网站?敬请阅读。
惊人的数字
——日访问量40亿次
——每分钟上传60小时的视频
——超过3.5亿终端访问
——利润是2010年收入的双倍
——视频的数量上升了9个数量级,开发人员却只上升了2个数量级
——一百万行Python代码
软件架构
——Python:Python是YouTube的主要编程语言。
——Apache:YouTube一直使用Apache,每次HTTP请求都经由Apache。
——Linux:Linux是构建YouTube的基石,它有许多强大的工具,如strace何tcpdump。
——MySQL:MySQL有庞大的用户群。YouTube使用它的关系数据库特性,也使用它存储BLOB数据。
——Vitess:Vitess是由YouTube发起的一个开源项目,旨在打造高性能的MySQL前端。
——Zookeeper:分布式的锁服务器。
——Wiseguy:一个CGI Servlet容器。
——Spitfire:一个模板系统。
——Serialization formats:YouTube重写了BSON实现,速度提升了10-15倍。
关于扩展性的思考
以下虽然都不是什么新思想,但希望对你有所助益。
——分而治之是扩展性技术的灵魂。考虑以层次化的方式完成所有的工作。这也是数据分片的症结所在。要知道如何将数据分区,以及如何将已分区的数据进行关联。总而言之,保持简单与松散的耦合非常必要。
——充分利用Python的动态特性,构建易于扩展的软件架构。
——近似的正确性。要相信监控系统所报告的系统运行状态。如果问题没有出现,就认为一切良好。
——不一致的数据模型。例如,阅读评论的人和写评论的人对你刷新页面的动作会有不同的反应,但也不必完全基于事务处理进行系统设计,这会显得矫枉过正。我们依然需要不一致的数据模型。
——分布式系统的随机性。分布式系统就如同气象系统一样,对分布式系统进行调试会存在更多的随机性。例如,缓存过期。一般情况下,服务器会将流行的视频缓存24小时。如果一旦出现缓存同时过期的情况,服务器将同时开始缓存,荷载如闻惊雷!
——最快的函数调用就是不做任何调用。合理设计事务处理发生的间隔和次数。
——仔细观察API,并做到心中有数。如何定义输入、输出?所有的函数调用本质上都是围绕数据发生的,那在函数调用之后,又会发生什么?
——在Python中运用RPC重定向。程序员是代码的构建者,因此要做好约定。如果代码不幸失败了,还可以从RPC输出中追查原因。
——没有完美的组件。一个组件的运行周期可能持续1-6个月,具体多久,谁也说不清。随着时间的推移,我们会用Python和C重写一些东西,这证明你正在淘汰旧的组件,当你观察到一个新组件出现的时候,它诞生了。
——没有人了解整个系统的运作机制。因此,我们需要定义组件。视频转码和视频搜索截然不同,建立良好的数据规范非常重要。
——效率与扩展性并重。最有效率的是用C实现进程,但这样的方式缺乏扩展性。
——着眼于宏观层面、组件及其失败的原因。使用RPC是否明智?内联如何?进行分解研究,也许会发现不同之处。
——重视算法。与其绞尽脑汁用Python来实现高效的算法,不如用它做些更有实用价值的事。在这方面,C语言有它的优势。
——我们很少从事面向对象设计。我们使用了大量的名称空间,使用类来组织数据,但极少面向对象。
——我乐意用下面的词汇来形容我们的代码树:简单、实用、优雅、正交、可组合,这是我们的追求。
总结
YouTube解决问题的哲学只有一个词:简单。许多YouTube的产品最初只是源于一个简单的Python脚本。这正是应了我们的一句老话,不积跬步,无以至千里;不积小流,无以成江海。(张志平/编译)