slot deposit pulsa slot mahjong slot gacor slot gacor slot gacor resmi slot gacor 2025 slot gacor terpercaya slot gacor 2025 slot gacor hari ini slot gacor hari ini slot gacor hari ini
YouTube 仅用 9 名工程师就能支持每天 1 亿次视频观看的 11 个原因
17611538698
webmaster@21cto.com

YouTube 仅用 9 名工程师就能支持每天 1 亿次视频观看的 11 个原因

架构 0 1618 2023-11-24 11:13:44

图片

2005 年 2 月, 美国加利福尼亚州。全球知名的在线支付服务公司PayPal已经走过 6 年零 2 个月的时间,3 名早期员工Steve chen、Chad Hurley 和 Jawed Karim 就像发现了互联网世界的流量密码一样,开始寻找属于他们的机会。 

最后,他们希望建立一个分享视频的平台。后来这个在车库里诞生的平台,就是大名鼎鼎的YouTube。

 

最初,他们的财力有限,只能通过信用卡债务和基础设施借款为 YouTube 筹集资金。但财务上的紧张,也倒逼着他们打造出一套出色的可扩展性技术。

 

第二年,他们平台的视频日播放量就达到了 1 亿。更令人出乎意料的是,他们只用了 9 名工程师就做到了这一点。 

 

YouTube 是如何做到的?下面为大家一一揭开当年的设计要点。

 

一、神奇飞轮

 

他们采用一种“飞轮”的方法去收集和分析系统数据,以便于可扩展性的实现。他们的工作流程是一个不断循环的过程:识别瓶颈→修复瓶颈→喝水→睡觉。这种方法好处在于避免了对高端硬件的需求(不用大规模部署),降低了硬件成本。

 

图片

可扩展性循环(Scalability loop) 

 

二、看似无聊、却大巧不工的技术栈

 

他们让技术堆栈保持简单,并使用经过验证的技术。他们的技术堆栈绝对让你想象不到:

 

图片

YouTube 技术栈

 

MySQL 存储元数据:视频标题、标签、描述和用户数据。因为修复 MySQL 中的问题很容易。 

 

由Lighttpd Web 服务器提供视频服务。 

 

使用Linux作为操作系统。他们使用 Linux 工具来检查下列系统行为:strace、ssh、rsync、vmstat 和 tcpdump。 

 

应用程序服务器上的 Python。因为它提供了许多可重用的库,而且他们不想重新发明轮子。换句话说,Python 允许快速灵活的开发。根据他们的测量,Python 从来都不是瓶颈。值得注意的是,他们使用 Python 到 C 的编译器和 C 语言扩展来运行 CPU 密集型任务。

 

三、保持简单

 

他们认为软件架构是可扩展性的根源。他们没有盲目追求“流行语”去扩大规模。因此,他们保持架构简单——使代码审查更容易。这使他们能够快速重新架构以满足不断变化的需求。例如,他们从约会网站转向视频共享网站。

 

此外,他们还保持网络路径简单。因为网络设备具有可扩展性限制。

 

图片

硬件成本

 

他们还使用了商品硬件。它使他们能够减少功耗和维护费用,并保持较低的成本。

 

此外,他们使规模感知代码与应用程序开发相对独立。

 

四、选择你的主战场

 

他们将许多不重要的问题给外包出去了。因为他们想专注于重要的事情。他们没有时间或资源来构建自己的基础设施来提供流行视频。于是,他们把热门视频放到了第三方CDN上。好处:

 

  • 低延迟。由于用户的网络跳数较少 ;

  • 高性能。因为它提供的是内存中的视频; 

  • 高可用性。因为自动复制。

 

他们从同地数据中心提供受欢迎度稍低些的视频。并采用软件RAID,通过多磁盘并行访问来提高性能。还调整了他们的服务器以防止缓存抖动。

 

他们将基础设施保留在同一地点的数据中心,有两点原因。其一,可以轻松调整服务器以满足其需求。其二,方便自己的合同谈判。

 

图片

选择你的主战场;外包问题以释放资源

 

每个视频有 4 个缩略图。因此,他们在服务小对象时面临着问题:大量磁盘查找和文件系统限制。因此,他们将缩略图放入 BigTable 中 。它是一种分布式数据存储,具有许多优点:通过对文件进行聚类来避免小文件问题、提高性能、多级缓存低延迟、易于配置。

 

他们还伪造数据以防止昂贵的交易费用。例如,他们伪造视频观看次数并异步更新计数器。当今近似正确性的一种流行技术是:布隆过滤器,它是一种概率数据结构。

 

五、可扩展性三大支柱

 

YouTube 依赖可扩展性的三大支柱:无状态、复制和分区。

 

图片

可扩展性的 3 个支柱

 

他们保持网络服务器无状态(stateless),并通过复制进行扩展。

 

他们复制replicated数据库服务器以实现读取可扩展性和高可用性。并对副本之间的流量进行负载平衡。但这种方法引起了问题:复制滞后和写入可扩展性问题。

 

图片

复制与分区

 

因此,他们对数据库进行了分区,以提高写入可扩展性、缓存局部性和性能。partitioned它还将硬件成本降低了 30%。

 

此外,他们还研究了数据访问模式来确定分区级别。例如,他们研究了流行的查询、连接和事务一致性,并选择用户作为分区级别。

 

六、扎实的工程团队

 

知识丰富的团队是可扩展性的重要资产。

 

图片

跨学科团队

 

他们保持较小的团队规模t以改善沟通:仅 9 名工程师。他们的团队非常擅长跨学科技能。

 

七、不要重复自己的话

 

他们使用缓存cache来防止重复昂贵的操作。它使他们能够扩展浏览量。

 

图片

多级缓存可扩展

 

他们还在多个级别实现了缓存 - 并且减少了延迟。

 

八、排序:重要的指标要优先

 

图片

对重要流量进行排名;二八原则(帕累托原则)

 

他们将视频观看流量优先,排在其他所有流量之上。因此,他们为视频观看流量保留了专用资源集群。这一点提供了高可用性。

 

九、防止“雷群”

 

如果许多并发客户端查询服务器,就会出现雷群问题。它会降低性能。

 

图片

雷群(The Thundering Herd)问题

 

他们使用抖动来防止雷群问题。例如,他们为流行视频的缓存过期添加了抖动。

 

十、打持久战

 

他们专注于宏观层面的事物:算法和可扩展性。他们进行了快速的黑客攻击,以赢得更多时间来构建长期解决方案。例如,使用 Python 消除不良 API 以防止短期问题。

 

图片

冒险与回报

 

他们容忍组件中的缺陷。当遇到瓶颈时:他们要么重写组件,要么删除它。

 

他们用效率换取可扩展性。有四个例子:

 

  • 他们选择了 Python 而不是 C; 

  • 他们在组件之间保持清晰的界限以进行横向扩展。和容忍的延迟;

  • 他们优化了软件,使其足够快。但并不痴迷于机器效率; 

  • 他们根据带宽可用性从服务器位置提供视频。并且不基于延迟。

 

十一、适应性进化

 

他们调整了系统以满足他们的需求。例子:

 

  • 关键组件使用RPC而不是 HTTP REST,这提高了性能; 

  • 自定义BSON作为数据序列化格式。它提供了高性能;

  • 应用程序某些部分的最终一致性以实现可扩展性。例如,用户评论中的“读你所写”的一致性模型 ;

  • 学习 Python 是为了防止常见的陷阱。当然,还有分析需求的原因;

  • 定制开源软件;

  • 优化数据库查询; 

  • 使非关键实时任务异步。

 

图片

编码原则

 

他们没有浪费时间编写代码来限制人们。相反,采用了出色的工程实践- 编码约定来改进其代码结构。

 

后记


2006 年 11 月,谷歌以 16.5亿美元的价格收购了 YouTube,并把它当做一个子公司来运营。时至今日,它依然是视频分享市场的领导者,每天有 50 亿次视频浏览量。
 
据《福布斯》报道,YouTube 创始人的净资产超过 1 亿美元。YouTube创立仅 20 个月便成视频搜寻界的龙头,可谓是缔造了一个硅谷之奇迹。


作者:钟小杰

参考资料

https://newsletter.systemdesign.one/p/youtube-scalability

评论