数据库扩展
数据库扩展有两种主要方法:垂直扩展和水平扩展。
垂直扩展
也称为纵向扩展,是通过向现有机器添加更多的性能(CPU、RAM、DISK等)来进行扩展。有一些功能强大的数据库服务器。根据亚马逊关系数据库服务(RDS)[12],你可以获得一台具有24 TB RAM的数据库服务器。这种强大的数据库服务器可以存储和处理大量的数据。例如,2013年的stackoverflow.com每月有超过1000万的独立访问者,但它只有1个主数据库[13]。然而,垂直扩展也存在一些严重的缺点:
- 你可以为数据库服务器添加更多的CPU、RAM等,但存在硬件限制。如果你有大量的用户,单个服务器是不够的。
- 单点故障的风险增加。
- 垂直扩展的总体成本较高。强大的服务器更加昂贵。
水平扩展
也称为分片,是添加更多服务器的做法。图1-20比较了垂直扩展和水平扩展。
分片将大型数据库分割成更小、更易管理的部分,称为分片。每个分片共享相同的模式,尽管每个分片上的实际数据是唯一的。
图1-21展示了分片数据库的示例。用户数据根据用户ID分配到数据库服务器上。每当你访问数据时,都会使用散列函数来找到相应的分片。在我们的示例中,user_id % 4被用作散列函数。如果结果等于0,则使用分片0来存储和获取数据。如果结果等于1,则使用分片1。其他分片的逻辑也是相同的。
图1-22展示了分片数据库中的用户表。
在实施分片策略时,最重要的因素是选择分片键。分片键(也称为分区键)由一个或多个列组成,用于确定数据的分布方式。如图1-22所示,“user_id”是分片键。分片键允许你通过将数据库查询路由到正确的数据库来高效地检索和修改数据。在选择分片键时,最重要的一个标准是选择一个能够均匀分布数据的键。
分片是扩展数据库的一种很好的技术,但远非完美的解决方案。它给系统引入了复杂性和新的挑战:
重新分片数据:当1)单个分片由于快速增长而无法再容纳更多数据时,需要重新分片数据。2)某些分片可能由于不均匀的数据分布而更快地耗尽分片。当分片耗尽时,需要更新分片函数并移动数据。一种常用的解决此问题的技术是一致性哈希,将在第5章中讨论。
热点键问题:也称为明星问题。对特定分片的过度访问可能导致服务器超载。想象一下,Katy Perry、Justin Bieber和Lady Gaga的数据都最终存储在同一个分片上。对于社交应用来说,该分片将被读操作淹没。为了解决这个问题,我们可能需要为每个名人分配一个分片。甚至每个分片可能还需要进一步分区。
连接和去规范化:一旦数据库被分片到多个服务器上,执行跨数据库分片的连接操作就变得困难。一个常见的解决方法是对数据库进行去规范化,以便可以在单个表中执行查询。
在图1-23中,我们对数据库进行分片以支持快速增长的数据流量。与此同时,一些非关系型功能被移到NoSQL数据存储中,以减轻数据库负载。这是一篇涵盖了NoSQL许多使用案例的文章[14]。