将数据存储划分为一组水平分区或分片。这可以提高存储和访问大量数据时的可扩展性。
数据存储可能会受到以下限制:
通过增加更多磁盘容量、处理能力、内存和网络连接来垂直扩展只是一个临时解决方案。
将数据存储划分为水平分区或分片。每个分片具有相同的架构,但拥有自己不同的数据子集。分片本身就是一个数据存储(它可以包含许多不同类型实体的数据),在充当存储节点的服务器上运行。
这种模式有以下好处:
将数据存储划分为分片时,决定哪些数据应放置在每个分片中。分片通常包含落在由数据的一个或多个属性确定的指定范围内的项目。
分片对数据进行物理组织。当应用程序存储和检索数据时,分片逻辑将应用程序定向到适当的分片。
为确保最佳性能和可伸缩性,以适合应用程序执行的查询类型的方式拆分数据非常重要。在许多情况下,分片方案不太可能完全匹配每个查询的要求。例如,在多租户系统中,应用程序可能需要使用租户 ID 检索租户数据,但它可能还需要根据租户的名称或位置等其他属性来查找此数据。要处理这些情况,请使用支持最常执行查询的分片键实现分片策略。
在选择分片键和决定如何跨分片分布数据时,通常使用三种策略。策略是:
查找策略。在此策略中,分片逻辑实现了一个映射,该映射使用分片键将数据请求路由到包含该数据的分片。在多租户应用程序中,租户的所有数据可能会一起存储在一个分片中,使用租户 ID 作为分片键。多个租户可能共享同一个分片,该图说明了基于租户 ID 分片租户数据。
分片键和物理存储之间的映射可以基于物理分片,其中每个分片键映射到一个物理分区。或者,用于重新平衡分片的更灵活的技术是虚拟分区,其中分片键映射到相同数量的虚拟分片,而虚拟分片又映射到更少的物理分区。
范围策略。该策略将相关项目组合在同一个分片中,并按分片键对它们进行排序——分片键是顺序的。它对于经常使用范围查询(返回给定范围内的分片键的一组数据项的查询)检索项目集的应用程序很有用。
例如,如果应用程序需要定期查找给定月份的所有订单,如果一个月的所有订单都以日期和时间顺序存储在同一分片中,则可以更快地检索此数据。如果每个订单都存储在不同的分片中,则必须通过执行大量点查询(返回单个数据项的查询)来单独获取它们。
下图说明了在分片中存储数据的顺序集(范围)。
哈希策略。此策略的目的是减少热点(接收不成比例负载的分片)的机会。它以在每个分片的大小和每个分片将遇到的平均负载之间实现平衡的方式在分片之间分配数据。分片逻辑基于数据的一个或多个属性的散列计算存储项目的分片。选择的散列函数应该在分片上均匀分布数据,可能通过在计算中引入一些随机元素。
下图说明了基于租户 ID 散列的租户数据分片。
要了解哈希策略相对于其他分片策略的优势,请考虑按顺序注册新租户的多租户应用程序如何将租户分配到数据存储中的分片。使用 Range 策略时,租户 1 到 n 的数据将全部存储在 shard A 中,租户 n+1 到 m 的数据将全部存储在 shard B 中,以此类推。如果最近注册的租户也是最活跃的,那么大部分数据活动将发生在少数分片中,这可能会导致热点。
三种分片策略具有以下优点和注意事项:
例如,如果同一区域的用户在同一个分片中,则可以根据本地负载和需求模式在每个时区安排更新。然而,这种策略并不能提供分片之间的最佳平衡。如果大部分活动是针对相邻的分片键,重新平衡分片很困难,并且可能无法解决负载不均的问题。
大多数常见的分片系统都实现了上述方法之一,但还应该考虑应用程序的业务需求及其数据使用模式。例如,在多租户应用程序中:
在决定如何实现此模式时,请考虑以下几点:
当数据存储可能需要扩展到单个存储节点可用的资源之外,或者通过减少数据存储中的争用来提高性能时,请使用此模式。
| 留言与评论(共有 0 条评论) “” |