作者:Grey
原文地址:
数据库的扩展有两种方法:垂直扩展和水平扩展。
垂直扩展是通过提高现有机器的硬件配置(CPU、硬盘、内存等)来进行扩展。比如,如果使用的是亚马逊的 RDS ,可以得到一个超大内存的数据库服务器,所以在一台数据库服务器,就可以实现存储和处理大量的数据。但是垂直扩展也有一些严重的缺点。
-
虽然可以在数据库服务器上增加更多的 CPU、内存等,但是有硬件的限制,如果用户数量巨大,一台服务器是不够的。
-
单点故障的风险更大。
-
垂直扩展的总体成本很高。如果要配置一个强大的服务器,费用是很高的。
垂直扩展的示例图如下
横向扩展,就是将大型数据库分离成更小、更容易管理的部分,横向扩展也被称为分片,是增加更多服务器来承载更高的访问需求,每个分片共享相同的模式,尽管每个分片上的实际数据对分片来说是独一无二的。
横向扩展的示例图如下
以用户ID的例子来说,用户数据是根据用户ID分配到数据库服务器的。任何时候你访问数据,都会使用一个哈希函数来寻找相应的分片,比如,可以使用取模方式来定位具体的服务器分片,利用用户ID % 4 以后的结果定位到具体的服务器。如果结果等于0,分片区0就被用来存储和获取该用户ID数据。如果结果等于1,则使用分片1。这个逻辑也适用于其他分片。
实施分片策略时要考虑的最重要因素是分片键的选择。分片键(称为分区键)由一列或多列组成,决定数据的分配方式。上例中,用户ID就是分片键。分片键允许你通过将数据库查询路由到正确的数据库来有效地检索和修改数据。在选择分片密钥时,最重要的标准之一是选择一个能够均匀分布数据的密钥。分片是扩展数据库的技术,但它同时也不是完美的,它为系统引入了复杂性。分片会遇到如下几个问题
问题1,重分数据
-
由于数据的快速增长,单个分片不能再容纳更多的数据时,就需要重分数据。
-
由于数据分布不均,某些分片可能比其他分片更快地经历分片耗尽。当分片耗尽发生时,需要更新分片功能并移动数据。可以利用一致性哈希来解决这个问题
问题2:热点密钥问题
即对一个特定分片的过度访问可能会导致服务器过载。为了解决这个问题,我们可能需要为每个热点密钥分配一个分片。每个分片甚至可能需要进一步划分。
问题3:分片的连接问题
一旦一个数据库在多个服务器上被分片,就很难在数据库分片间进行连接操作。一个常见的解决方法是对数据库进行去规范化,这样就可以在一个表中进行查询,将数据库分片,以支持快速增长的数据流量。同时,也可以把系统中的非关系型的功能被转移 NoSQL 数据存储,以减少数据库的负载。