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

yahoo 网站 架构
(图片来源网络,侵删)

核心思想与设计哲学

Yahoo 早期架构的成功,主要基于以下几个核心思想:

  1. “农场”化部署:这是 Yahoo 架构最显著的特征,他们不购买昂贵的大型服务器(如 Sun E10000),而是使用大量廉价的、标准化的 x86 服务器(俗称“Cows”,牛),这种模式带来了巨大的成本优势、高可扩展性和容错性,一台服务器坏了,直接换一台新的即可,不影响整体服务。
  2. “杀手级应用”驱动:Yahoo 的每个核心业务(如邮箱、新闻、财经、雅虎通)都像一个独立的“杀手级应用”,每个应用都有自己独立的团队、服务器集群和数据库,形成了“联邦制”的架构。
  3. “足够好”原则:在早期,Yahoo 的架构追求的是“足够好”且“稳定可靠”,而不是追求最前沿的技术,他们大量使用成熟、开源的技术(如 FreeBSD, Apache, PHP/Perl),并在此基础上进行深度定制和优化。
  4. 拥抱开源,回馈社区:Yahoo 是开源技术的重度使用者和贡献者,他们将内部开发的优秀工具开源,最著名的例子就是 HadoopZooKeeper

经典架构分层(鼎盛时期)

我们可以将 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 的架构演进史,就是一部互联网技术的活化石。

  • 遗产

    1. Hadoop:彻底改变了大数据处理的格局,是 Yahoo 对全球技术界最伟大的贡献。
    2. Memcached:定义了 Web 应用缓存的标准,至今仍在广泛使用。
    3. “农场”化思想:证明了廉价、标准化的服务器集群在成本和可扩展性上优于昂贵的大型机,这一思想已成为现代数据中心和云计算的基石。
    4. 联邦制架构:在特定历史时期,它是一种有效管理大型、复杂业务组织的模式。
  • 启示

    1. 没有银弹:架构设计必须权衡利弊,并根据业务阶段和技术环境做出选择,没有一成不变的完美架构。
    2. 拥抱开源,回馈社区:Yahoo 通过开源 Hadoop 和 Memcached,不仅解决了自身问题,也建立了技术影响力,吸引了大量人才。
    3. 架构随业务而变:当业务规模和形态发生变化时,架构也必须随之演进,固守旧架构,最终会被时代淘汰。
    4. 文化与技术同等重要:从“联邦制”到“平台化”的转变,不仅是技术层面的变革,更是组织文化和开发流程的深刻变革。

Yahoo 的架构是其辉煌历史的见证,它既有“足够好”的务实智慧,也有拥抱开源、引领潮流的创新精神,尽管如今的 Yahoo 已不复当年之勇,但其架构演进过程中的经验和教训,至今仍对互联网从业者有着深刻的启发意义。