最近我偶然发现了一个优秀的 YouTube 视频,“Pinterest 是如何在只有 6 名工程师的情况下扩展到 1100 万用户”(https://www.youtube.com/watch?si=coeqLRKu5i1nnpbI&v=QRlP6BI1PFA&feature=youtu.be)以及以下参考文章,“Pinterest 的扩展之路 —— 从零到每月数十亿页面浏览量,用时两年”(https://highscalability.com/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a/)。我认为这两个资源都非常出色,值得大家去了解系统设计。本文将概括我在学习这些资源时发现的最重要的内容。
Pinterest 的进化路线图
Pinterest 的扩张之旅可以分为四个不同的阶段:
- 探索自我的时代:这个阶段以快速制作原型和不断变化的产品需求为特点,由一个小型工程团队管理。
- 实验时代:指数级的用户增长需要快速扩张,导致采纳了众多技术。然而,这导致了一个复杂且脆弱的系统。
- 成熟时期:这个阶段涉及有意识地简化他们的架构,专注于成熟、可扩展的技术,如 MySQL、Memcache 和 Redis。Pinterest 没有增加技术栈,而是把资金投入到令其运转良好的领域。
- 返归时代:通过搭建合适的架构,Pinterest 仅通过水平扩张就得以延续增长轨道,验证了其选择的正确性。
让我们看看为什么这些技术在残酷的重构清洗中仍然屹立不倒。
核心技术:可扩展性的构建基石
Pinterest 优先考虑可靠、易于理解和可轻松扩展以满足不断增长的用户群的技术。让我们深入了解这些技术:
- MySQL:一个健壮成熟的关系数据库管理系统,以其稳定性和广泛的用户群体而闻名。这确保了易维护、易排障和易招聘熟悉该技术的工程师。最重要的是,它是我最喜欢的 f-word:免费。
- 内存缓存(Memcache):这是一个简单、高性能的系统,用于缓存频繁访问的数据。Memcache 的简单性和可靠性使其非常适合卸载数据库读取。而且免费。
- Redis:一个可处理各种数据结构并提供持久性和复制灵活性的多功能数据存储。这使 Pinterest 能够根据数据敏感性定制持久化策略。正如您所猜测的,这也是免费的。
- 选择 Solr 是因为它可以快速使用。此外,团队"尝试了 Elastic Search,但在他们的规模下,它在处理大量小型文档和大量查询方面遇到了困难。"
聚类 vs 分片:如何扩展数据库
随着数据量的急剧增加,Pinterest 面临着一个关键选择:如何分发其数据库以应对工作负载?出现了两种主要方法,每种方法都有自己的优缺点。
什么是数据库集群?
数据库集群是将多个单独的数据库实例或服务器连接到您的系统的过程。在大多数常见的数据库集群中,多个数据库实例通常由一个名为主服务器的单一数据库服务器管理。在系统设计领域,实施这种设计可能是必要的,尤其是在大型系统(Web 或移动应用)中,因为单个数据库服务器无法处理所有客户请求。为了解决这个问题,将引入多个并行工作的数据库服务器的使用。
不言而喻,采用这种技术可为我们的系统带来众多好处,如处理更多用户和克服系统故障。这种实施的主要缺点之一是引入了额外的复杂性。为了处理额外的复杂性,应由一个更高级别的服务器管理多个数据库服务器,监控整个系统的数据流。
如上图所示,多个数据库服务器通过 SAN 设备连接在一起。SAN 是存储区域网络的缩写,是一种计算机网络设备,提供对集中化的块级数据存储的访问。SAN 主要用于从服务器访问数据存储设备,如磁盘阵列和磁带库,使这些设备在操作系统中显示为直接连接的存储。尽管您仍然可以构建自己的数据库集群,但最近,公司为客户提供第三方云数据库存储即服务。使用此类服务,客户可以节省维护和监控