需要强调的是,Yahoo 作为一家拥有近30年历史的互联网巨头,其架构并非一蹴而就,而是随着业务需求、技术潮流和公司战略不断演进的,我们讨论的架构是其在鼎盛时期(大约 2000s - 2010s 中期)的典型架构,以及它为应对挑战而进行的现代化演进。

(图片来源网络,侵删)
核心思想与设计哲学
Yahoo 早期架构的成功,主要基于以下几个核心思想:
- “农场”化部署:这是 Yahoo 架构最显著的特征,他们不购买昂贵的大型服务器(如 Sun E10000),而是使用大量廉价的、标准化的 x86 服务器(俗称“Cows”,牛),这种模式带来了巨大的成本优势、高可扩展性和容错性,一台服务器坏了,直接换一台新的即可,不影响整体服务。
- “杀手级应用”驱动:Yahoo 的每个核心业务(如邮箱、新闻、财经、雅虎通)都像一个独立的“杀手级应用”,每个应用都有自己独立的团队、服务器集群和数据库,形成了“联邦制”的架构。
- “足够好”原则:在早期,Yahoo 的架构追求的是“足够好”且“稳定可靠”,而不是追求最前沿的技术,他们大量使用成熟、开源的技术(如 FreeBSD, Apache, PHP/Perl),并在此基础上进行深度定制和优化。
- 拥抱开源,回馈社区:Yahoo 是开源技术的重度使用者和贡献者,他们将内部开发的优秀工具开源,最著名的例子就是 Hadoop 和 ZooKeeper。
经典架构分层(鼎盛时期)
我们可以将 Yahoo 的经典网站架构分为几个逻辑层次:
用户接入与前端层
这是用户直接接触的部分,目标是高效、稳定地将用户请求导向后端。
- 全球分布式数据中心:Yahoo 在全球部署了多个大型数据中心(如美国加州、台湾等),用户的请求会被 DNS 路由到地理位置最近的数据中心,以减少延迟。
- 负载均衡:
- 硬件负载均衡器:在早期,使用 F5 BIG-IP 等硬件设备进行第一层负载均衡,处理海量并发连接。
- 软件负载均衡:在数据中心内部,使用自研或开源的软件(如 LVS, HAProxy)将流量分发到后端的应用服务器集群。
- 内容分发网络:Yahoo 拥有自己的 CDN,用于缓存静态内容(图片、CSS、JS、视频等),这使得全球用户可以快速从最近的边缘节点获取内容,减轻了源站的压力。
- 反向代理:使用 Squid 或 Nginx 等作为反向代理,进一步缓存动态内容,并提供安全防护。
应用层
这是业务逻辑的核心,由成百上千个独立的应用集群组成。
- 无状态应用服务器:应用服务器通常是无状态的,这意味着任何一台服务器都可以处理任何用户的请求,这为水平扩展提供了极大的便利,如果某台服务器压力过大,就增加一台;如果它坏了,流量会自动被导向其他健康的机器。
- 技术栈:
- Web 服务器:早期以 Apache 为主,后来也使用 Nginx。
- 编程语言:大量使用 PHP 和 Perl,因为它们开发快速,适合快速迭代,对于性能要求高的部分,可能会使用 C++ 或 Java。
- 开发框架:内部有自研的 PHP 框架和模板引擎,用于标准化开发流程。
- 联邦制架构:邮箱、新闻、财经等业务线是完全独立的,它们有各自的:
- 应用团队
- 服务器集群
- 数据库集群
- 运维团队 这种模式的优点是团队自治、责任清晰,缺点是资源无法高效共享,形成了“数据孤岛”。
数据存储层
这是最复杂和最具挑战性的部分,因为数据是状态化的,难以扩展。
- 关系型数据库 - MySQL:
- Yahoo 是全球最早大规模使用 MySQL 的公司之一,并对其进行了大量深度改造,以应对海量数据和超高并发的读写需求。
- 主从复制:为了读取扩展和高可用,MySQL 普遍采用“一主多从”的架构,写操作走主库,读操作可以分散到多个从库。
- 分库分表:当单表数据量过大时,会进行水平拆分(Sharding),用户数据可能按用户 ID 的哈希值分散到不同的数据库集群中,这是解决数据规模瓶颈的关键技术。
- NoSQL 数据库 - HBase:
随着 Hadoop 生态的成熟,Yahoo 内部大量使用 HBase 作为分布式、面向列的 NoSQL 数据库,它适用于存储海量稀疏数据,如用户行为日志、社交图谱等。
- 缓存系统:
- Memcached:这是 Yahoo 对互联网世界的另一大贡献,他们发明并广泛使用了 Memcached 来缓存数据库查询结果、页面片段等,极大地减轻了数据库的压力,提升了网站响应速度,Memcached 的分布式架构和简单的协议设计使其成为当时 Web 缓存的事实标准。
- 分布式文件系统 - HDFS:
作为 Hadoop 的核心组件,HDFS 是 Yahoo 存储海量非结构化数据(如日志、爬取的网页、原始数据)的基石,它提供了高容错性和高吞吐量的数据存储能力。
基础设施与运维层
这是支撑整个架构运行的基石。
- 自动化运维:开发了大量的内部工具,用于自动化服务器部署、配置管理、监控和告警。
- 监控与告警:使用 Nagios、Ganglia 等工具对集群的健康状况、性能指标进行实时监控,并设置告警机制。
- 统一认证与授权:Yahoo Passport (后来的 Yahoo! ID) 是一个统一的用户认证系统,用户可以用一个账号登录所有 Yahoo 服务。
面临的挑战与架构演进
随着时间的推移,经典架构逐渐暴露出问题,并开始向现代化演进。
主要挑战
- “数据孤岛”与资源浪费:联邦制架构导致各个业务线重复建设,资源利用率低下,无法形成合力。
- 扩展性瓶颈:虽然应用层可以水平扩展,但数据库层(尤其是 MySQL 的分库分表)的扩展变得非常复杂和昂贵。
- 技术债:大量老旧的代码库和技术栈难以维护,限制了新功能的快速迭代。
- 云计算的冲击:AWS 等云平台的崛起,提供了按需付费、弹性伸缩的 IaaS 服务,对 Yahoo 的“自建农场”模式构成了巨大挑战。
架构演进方向
为了应对挑战,Yahoo 开始了一系列现代化的转型:
- 拥抱云计算:Yahoo 是最早一批“上云”的巨头之一,他们将部分业务迁移到 AWS 上,利用云的弹性和全球基础设施来降低成本和加速创新。
- 平台化与微服务:
- 统一技术栈:推动内部技术栈的标准化,鼓励更多业务使用 Java 和更现代的框架。
- 构建 PaaS 平台:内部开发了类似 Cloud Foundry 的 PaaS 平台,让开发者可以像使用云服务一样,轻松部署和管理自己的应用,而无需关心底层基础设施。
- 向微服务演进:虽然这个过程非常漫长且艰难,但趋势是打破原有的“联邦制”,将庞大的单体应用拆分为更小、更独立的微服务,每个微服务可以独立开发、部署和扩展,提高了系统的灵活性和韧性。
- 数据整合与现代化:
- 统一数据仓库:构建企业级的数据仓库(如基于 Hadoop/Spark),打破数据孤岛,进行统一的数据分析和挖掘。
- 引入 NoSQL 新贵:除了 HBase,也开始尝试使用 Cassandra、MongoDB 等新一代 NoSQL 数据库来应对特定的业务场景。
- DevOps 与 CI/CD:大力推行 DevOps 文化,建立自动化的持续集成和持续部署流水线,以缩短开发周期,提高发布频率和质量。
Yahoo 架构的遗产与启示
Yahoo 的架构演进史,就是一部互联网技术的活化石。
-
遗产:
- Hadoop:彻底改变了大数据处理的格局,是 Yahoo 对全球技术界最伟大的贡献。
- Memcached:定义了 Web 应用缓存的标准,至今仍在广泛使用。
- “农场”化思想:证明了廉价、标准化的服务器集群在成本和可扩展性上优于昂贵的大型机,这一思想已成为现代数据中心和云计算的基石。
- 联邦制架构:在特定历史时期,它是一种有效管理大型、复杂业务组织的模式。
-
启示:
- 没有银弹:架构设计必须权衡利弊,并根据业务阶段和技术环境做出选择,没有一成不变的完美架构。
- 拥抱开源,回馈社区:Yahoo 通过开源 Hadoop 和 Memcached,不仅解决了自身问题,也建立了技术影响力,吸引了大量人才。
- 架构随业务而变:当业务规模和形态发生变化时,架构也必须随之演进,固守旧架构,最终会被时代淘汰。
- 文化与技术同等重要:从“联邦制”到“平台化”的转变,不仅是技术层面的变革,更是组织文化和开发流程的深刻变革。
Yahoo 的架构是其辉煌历史的见证,它既有“足够好”的务实智慧,也有拥抱开源、引领潮流的创新精神,尽管如今的 Yahoo 已不复当年之勇,但其架构演进过程中的经验和教训,至今仍对互联网从业者有着深刻的启发意义。
