最初的亿级用户系统设计方法【后篇】:RDB的横向扩展、适用的数据库选择,以及高级概念

这篇文章是通过著作者Anh Dang先生的授权,翻译并刊登了「如何设计一个可扩展到一亿用户的系统」(发布于2021年6月28日)的日文版本。

设计可以支持最初一亿用户规模的系统【后续部分】。

开阔思维,谨慎行动,迅速学习

为了跟上新技术的发展,我希望这篇文章能够在一年内持续更新。
最新更新日期:2021年6月28日

照片由 Unsplash 上的 Kirill Sh 提供。

最初

设计能够支持数亿用户的系统并非易事。对于软件架构师来说,这始终是一项巨大挑战(但是,如果你看了我的文章,从今天开始就会变得容易起来?)。

本文提及的话题如下所示。

【前編】
– 从最简单的开始:一体化解决方案
– 可伸缩技术:横向扩展和纵向扩展

【后篇】
– 关于关系型数据库的扩展:主从复制、主主复制、联邦、分片、非规范化、SQL优化
– 应使用的数据库:NoSQL还是SQL
– 高级概念:缓存、CDN、地理DNS等

今天不会涉及诸如容错性、可靠性、高可用性等高性能计算的常见术语。

冷静下来,现在开始吧!

这次是后篇。前篇在这里。

关于关系型数据库的扩展性

只需一个选项,将以下内容用中文进行转述:
在简单的系统中,可以使用Oracle或MySQL等关系型数据库管理系统(RDBMS)来存储数据项目。然而,关系型数据库系统在特别需要扩展性的情况下会面临一些挑战。

在关系型数据库的扩展中,存在许多方法,包括主从复制、主主复制、联合、分片、非规范化、SQL调优等。

    • レプリケーション:通常、同じデータの複数のコピーを異なるマシンに保存する技術を指す。

 

    • フェデレーション(または機能分割):データベースを機能ごとに分割する。

 

    • シャーディング:分割に関連するデータベースアーキテクチャパターン。データのさまざまな部分を複数のサーバーに配置し、複数のユーザーがデータセットのさまざまな部分にアクセスする。

 

    • 非正規化:コストのかかる結合を回避するため、複数テーブルにデータを書き込むことで、書き込みパフォーマンスを犠牲にする代わりに読み取りパフォーマンスを向上させようとする。

SQLチューニング

主从复制

使用主从复制技术,可以将一个数据库服务器(Master)的数据复制到一个或多个其他数据库服务器(Slave),如下图所示。

对于Master的所有更新

    • クライアントはMasterに接続してデータを更新する。

 

    データは、すべてのデータがサーバー間で一貫性を持つまでSlaveに波及する。

实际上,这里还存在一些瓶颈。

    • Masterサーバーが何らかの理由でダウンした場合、データはSlave経由で利用できるが、新たな書き込みはできない。

 

    SlaveをMasterに昇格させるには、追加のアルゴリズムを必要とする。

仅使用一个服务器来处理更新请求的解决方案如下。

    • 同期ソリューション:データを変更するトランザクションは、すべてのサーバーに受け入れられるまでコミットされないため(分散トランザクション)、フェイルオーバー時にデータが失われることはない。

 

    非同期ソリューション:コミット→遅延→クラスター内の他のサーバーに伝搬されるため、フェイルオーバー時にデータ更新が失われる可能性がある。

如果同期解决方案太慢,请记住切换到异步解决方案。

主-主复制

每个数据库服务器都可以作为主服务器工作,即使存在其他主服务器。在某一时刻,确保所有主服务器同步并保持正确的最新数据。

所有的节点都可以读取和写入所有的数据

主-主复制的优点如下。

    • 1つのMasterに障害が発生しても、他のデータベースサーバーは正常に動作し、不足分を補うことができる。データベースサーバーがオンラインに戻ると、レプリケーションを使用して回復する。

 

    • Masterは複数の物理サイトに配置できるため、ネットワーク全体に分散できる。

 

    Masterは更新の処理能力により制限される。

联邦

联邦(或功能分割)可将数据库按功能进行分割。例如,使用论坛、用户和产品三个数据库代替一个巨大的数据库,可以减少对每个数据库的读写流量,从而降低复制延迟。

数据分布功能通过联邦体系实现。

当数据库变小时,能够容纳在内存中的数据增加,缓存的局部性增强,从而增加缓存的命中次数。如果没有中央的主节点来序列化写入操作,则可以并行写入,从而提高吞吐量。

分片

Sharding(也称为数据分割)是一种将大型数据库分割成多个小部分的技术,使每个数据库只能管理数据的子集。

在理想情况下,多个用户连接到每个数据库节点。可以提高系统的管理性、性能、可用性和负载均衡能力。

    • 各ユーザーは1つのサーバーとだけ通信するため、そのサーバーから迅速な応答を取得する。

 

    サーバー間で適切に負荷分散される。例えば、5つのサーバーがある場合、各サーバーは負荷の20%を処理するだけで済む。

实际上,有许多方法可以将数据库分割成多个小部分。

水平切割

这种方法将多个行分割到多个表中。例如,如果要将用户的个人资料存储在表中,可以将ID小于1000的用户存储在一个表中,将ID在1001至2000之间的用户存储在另一个表中。

将多行数据存储到多个表格中

垂直划分

在这种情况下,我们将数据进行分割,将与特定功能相关的表存储在每个服务器上。例如,在构建类似Instagram的系统时,我们需要保存用户、用户上传的照片和用户关注的其他用户的数据,我们可以将用户的个人资料信息存储在第一个数据库服务器上,将好友列表存储在第二个服务器上,将照片存储在第三个服务器上。

将数据分割,并将与特定功能相关的表格存储在各个服务器上。

基于目录的分割

对于这个问题,疎散耦合的方法是识别当前的分割计划,并创建一个保持每个实体映射及其存储在数据库分片中的查找服务。

注意してください,この方法は、データストアが1つのストレージノードで利用可能なリソースを超えてスケーリングする必要がある場合や、データストアでの競合を減らしパフォーマンスを向上させる必要がある場合に使用できる。ただし、シャーディング技術には以下のような一般的な問題があるということを留意してください。

    • データベース結合は、よりコストがかかり、場合によっては実行不可能になる。

 

    • シャーディングは、データベースの参照整合性を損なう可能性がある。

 

    • データベーススキーマの変更は、非常にコストがかかる可能性がある。

 

    データ分散が均一ではなく、シャーディングに大きな負荷がかかる。

非规范化

非规范化的目的在于通过牺牲写入性能来提高读取性能。它将冗余的数据副本写入多个表中,从而避免了耗时的关联操作。

通过联邦和分片等技术进行数据分散后,对数据中心间的连接进行管理会变得更加复杂。通过非规范化,或许可以避免对这种复杂连接的需求。

在大多数系统中,读取操作可能会远远超过写入操作的比例,通常为100:1或者1000:1。读取操作导致复杂的数据库连接,需要耗费大量的磁盘操作时间,可能非常昂贵。

PostgreSQL和Oracle等某些RDBMS支持存储冗余信息,并进行维护冗余副本的一致性的物化视图。

Facebook的Ryan Mack先生在一篇名为”Building Timeline: Scaling up to hold your life story⁶ by using the power of Denormalization(构建时间线:通过非标准化的力量进行规模扩展,以持有您的人生故事⁶)”的精彩文章中,谈论了许多时间线实施的案例。

应该使用的数据库

在数据库领域中,存在着两种主要的解决方案,即SQL和NoSQL。无论是构建方式,存储信息的类型,还是存储方式都有所不同。

SQL(Structured Query Language)- 结构化查询语言

关系型数据库将数据存储在行和列中。每一行包含了有关一个实体的所有信息,每一列包含了所有的独立数据点。

最受欢迎的关系型数据库包括MySQL、Oracle、MS SQL Server、SQLite、Postgres和MariaDB等。

NoSQL非关系型数据库

通常被称为非关系型数据库。一般被分成主要的五类(键值型、图型、列型、文档型、Blob型)。

键值型数据库

数据将存储在键值对数组中。键是与值相关联的属性名称。

一些知名的键值型数据库包括Redis、Voldemort、Dynamo等。

文档型数据库

数据被存储在文档中,而不是表的行或列中,并且这些文档会被分组到集合中。每个文档可以具有完全不同的结构。

在文档数据库中,有CouchDB和MongoDB等选择。

广泛列式数据库

在列式数据库中,有一种称为列族的行容器,代替了”表”的角色。与关系型数据库不同的是,不需要预先了解所有的列,也不需要每行具有相同数量的列。

列式数据库非常适合分析大规模数据集。著名的列式数据库包括Cassandra和HBase等。

图数据库

这是一个用于存储能够最好地表示关系的数据的数据库。数据以图形结构存储,包括节点(实体)、属性(实体信息)和连线(实体之间的连接)。

在图形数据库中,有Neo4J和InfiniteGraph等选项。

Blob型数据库

Blob型类似于文件的键值类型,并可通过Amazon S3、Windows Azure Blob Storage、Google Cloud Storage、Rackspace Cloud Files、OpenStack Swift等API进行访问。

选择应使用的数据库

在数据库技术方面,没有万能的解决方案。因此,许多企业根据需求选择使用SQL数据库和NoSQL数据库。

请看以下的指南!

应该使用的数据库

将Web层进行水平扩展

由於數據層已經進行了擴展,現在需要對Web層進行擴展。為此,需要將用戶會話(狀態)數據存儲到關係型數據庫或NoSQL數據庫中,並將其從Web層轉移。這稱為無狀態架構。

无国籍系统是简单的。

请不要使用有状态的架构。如果实现了状态,将限制可扩展性,降低可用性,并增加成本,因此应尽可能选择无状态的架构。

在这种情况下,负载均衡器可以选择任何服务器以实现最佳请求处理,从而达到最大效率。

高级概念

现金贷款

负载均衡可以帮助在不断增长的服务器之间进行水平扩展,但使用缓存可以大大有效利用现有资源,并在下一个请求中提供更快速的数据。

如果数据不在缓存中,从数据库中获取数据并保存到缓存,然后读取。

通过向服务器添加缓存,可以避免直接从服务器读取网络页面和数据,从而减少响应时间和服务器负载。这将提高应用程序的可扩展性。

现金贷款可以应用于各种层次,包括数据库层、Web服务器层、网络层等。

内容分发网络(CDN)

CDN服务器保存着内容(如图片、网页等)的缓存副本,并从最近的位置提供。

当使用CDN时,数据可以在最近的位置获取,从而缩短用户页面的加载时间。而且,由于内容被存储在多个地点,这也提高了内容的可用性。

当使用CDN时,数据将从最近的位置获取,从而缩短用户的页面读取时间。

CDN服务器会检查缓存内容,并向Web服务器发送请求,以根据需要进行更新。通常情况下,缓存的内容包括HTML页面、图片、JavaScript文件、CSS文件等静态内容。

全球化

当应用程序全球化时,可以拥有和运营数据中心在世界各地,并使产品保持全天候、全年无休地运行。接收的请求将基于GeoDNS路由到”最佳”数据中心。

应用程序的全球化

GeoDNS是一种根据客户端所在地将域名解析为IP地址的DNS服务。连接来自亚洲的客户端可能会获得与连接来自欧洲的客户端不同的IP地址。

总结

通过重复应用这些技术,可以轻松地将系统扩展到超过一亿用户(包括无状态架构、负载均衡器的使用、最大程度地利用缓存数据、支持多个数据中心、在CDN中托管静态资产、通过分片扩展数据层等方法)。

缩放是一种重复的过程。

下一个应该讨论的主题是什么?

改善可扩展性和性能的方法有很多。

    • シャーディングとレプリケーションの技術の組み合わせ

 

    • ロングポーリング対Websocket対サーバー送信イベント

 

    • インデックスとプロキシ

 

    • SQLチューニング

 

    エラスティックコンピューティング

很简单,对吧?

书目

[1] https://httpd.apache.org
[2] http://tomcat.apache.org
[3] https://www.oracle.com/database/
[4] https://www.mysql.com
[5] https://en.wikipedia.org/wiki/Domain_Name_System
[6] https://www.facebook.com/note.php?note_id=10150468255628920

[1] https://httpd.apache.org
[2] http://tomcat.apache.org
[3] https://www.oracle.com/database/
[4] https://www.mysql.com
[5] https://en.wikipedia.org/wiki/Domain_Name_System
[6] https://www.facebook.com/note.php?note_id=10150468255628920

合作翻译

這篇文章能夠在以下人士的協助下公開發布,再次衷心感謝他們的合作。

原作者:Anh Dang(http://junryo.xyz)
原文:如何设计一个能够应对首个一亿用户的系统
感谢您让我们分享您的知识!

选择责任:@gracen
翻译责任:@gracen
审计责任:-
公开责任:@gracen

我們期待收到您的意見和反饋。

请问您对本次的文章有什么看法呢?
– 您希望读到这种类型的文章吗?
– 有哪些地方您觉得很好?
– 或者您认为我们可以做得更好吗?
等等,我们诚挚地征求您的真实意见。
您给予的反馈将对我们未来的文章质量提升有所帮助,敬请随意
在评论区分享您的想法。我们也在推特接受意见反馈。
期待收到大家的留言。

广告
将在 10 秒后关闭
bannerAds