数据库分片

数据库分片是一种通过将数据库分解为更小、更易于管理的部分来扩展数据库的策略。

什么是数据库分片?

数据库分片是一种通过将数据库分解为更小、更易于管理的部分(或“分片”)来扩展数据库的策略。每个分片都是一个独立的数据库,存储在不同的服务器上,并且仅包含总数据的一部分。这允许横向扩展,因为可以在需要时在新服务器上添加更多分片。

分片是基于分片键完成的,分片键决定了数据如何在分片之间分布。数据库分片的目标是提高大型数据库的性能、可扩展性和可管理性。

数据库分片有哪些好处?

可扩展性和性能

分片数据库的主要好处和目的是提高数据库的可扩展性和性能。随着用户和应用程序流量随时间增长,分片数据库更容易横向扩展。

可靠性和可用性

通过分片数据库,您可以在不同机器上的多个分片中拥有数据的多个实例。这意味着即使一个分片发生故障,用户仍然可以获取他们的数据,因为您的应用程序可以从活动分片中获取数据。这可以防止应用程序中的单点故障。

地理分布

数据库可以基于地理区域进行分片,这通过确保用户的数据从更靠近他们的数据库提供服务来减少用户的延迟。另一个好处是为了符合法规,一些国家(如欧洲国家)出于隐私原因要求数据保留在用户所在的国家/地区内。通过实施地理分片,更容易遵守这些法规。

数据库分片有哪些挑战?

管理复杂性

数据库分片的主要挑战是,对单体数据库进行分片的过程本身就是一个挑战。一旦完成,在处理跨分片的数据完整性方面,您的架构将存在额外的管理开销。

潜在的延迟问题

在查询需要存储在多个分片而不是单个机器上的数据的情况下,延迟可能成为一个因素。这不仅会降低性能,而且如果在一个分片中保存数据的硬件在查询期间发生故障,可能会导致故障。

分片不均衡

有许多不同的策略可用于选择分片键来分解您的数据,但没有一个是完美的。分片的一个常见问题是,当一个特定的分片保存的数据比其他分片更频繁地被访问时。这会导致“热点”,该分片由于处理比其他分片更多的流量而可能导致性能问题。这可以通过重新分片您的数据或设计数据库以使分片可以根据流量在机器之间独立扩展来解决。

成本增加

分片将导致更高的基础设施成本,因为您需要创建每个分片的副本以维护可用性以及数据的持久性。您还很可能需要投入更多资金聘请工程师来监控和维护分片数据库的更复杂架构。

数据库分片类型

范围分片

范围分片涉及将数据库划分为行,并将它们分布在不同的分片中。每个分片都保存不同的数据,但具有相同的模式。例如,ID 为 1-1000 的客户可能在一个分片上,而 ID 为 1001-2000 的客户在另一个分片上。

哈希分片

这种类型的分片使用分片键(可以是数据库中的任何列)来确定数据的存储位置。键通过哈希函数运行,结果值确定分片。这种方法可以均匀地分布数据,但重新洗牌分片可能具有挑战性。

地理分片

如前所述,地理分片是指您按某种程度的地理位置分解数据。这可以在国家、城市或其他级别完成,具体取决于您的用例。

垂直分片

垂直分片的工作方式类似于范围分片,但它分解的是数据库的列而不是行。每个分片都有数据子集和不同的模式。例如,一个分片可能存储用户个人资料信息,而另一个分片存储他们的交易历史。

数据库分片有哪些替代方案?

数据库分片有很多替代方案,一般来说,由于涉及的复杂性,分片只应作为扩展数据库的最后手段。

垂直扩展

分片的最简单替代方案是尽可能长时间地升级数据库运行所在的硬件。这意味着更快的 CPU、更多 RAM 和更大的磁盘。单台机器的物理限制是存在的,与在商品服务器上进行横向扩展相比,垂直扩展最终会变得更加昂贵。拥有单个大型服务器也会为您的应用程序创建单点故障。

反规范化

您可以通过反规范化数据来提高读取性能,以便相同的数据将位于多个表中,从而减少对昂贵的连接操作的需求。

缓存

扩展数据库读取性能的另一种方法是使用 Redis 之类的东西实现缓存层。缓存位于数据库的前面,并将经常访问的数据存储在内存中,以便快速返回数据,而无需请求访问数据库。缓存的一个潜在问题是,如果用户更新了某些内容,而缓存仍然存储着旧数据,则数据可能会变得陈旧。

只读副本

与上面列出的扩展读取性能相比,扩展写入通常是扩展数据库最困难的部分,选项更少。一种选择是创建数据库的只读副本,这些副本处理所有数据查询,以便主数据库硬件仅用于处理写入请求。只读副本的一个潜在问题是它们可能会返回陈旧的数据,因为它们必须等待接收来自主数据库的更新数据。

预写式日志

扩展写入的另一种方法是在写入操作提交到数据库之前记录它们。这有助于扩展,因为数据库不必在收到写入请求后立即执行。这样做的缺点再次是用户不会像他们期望的那样快地看到他们对数据库的更改得到反映

常见问题解答

分片和分区有什么区别?

数据库分片是指将数据库划分为称为“分片”的较小部分,并将它们分布在单独的数据库服务器上。每个分片都保存一部分数据并独立运行。这是一种横向扩展形式,因为您可以添加更多服务器来处理更多数据。分片主要用于提高性能和支持更大的数据库,但它引入了显著的复杂性。

分区是将数据库划分为同一数据库系统内(通常在同一服务器上)更小、更易于管理的部分。分区可以基于行或哈希等标准。分区可以提高性能和可管理性,但由于您没有跨多个服务器分布数据,因此无法提供与分片相同的可扩展性。

简而言之,分片是一种分区,但关键区别在于分片涉及单独的数据库服务器,以增加复杂性为代价提供卓越的可扩展性。

掌控您的运营,并将存储成本降低 90%

免费开始 运行概念验证

无需信用卡。

quote-shape

相关资源


DBU logo

免费 InfluxDB 培训

通过免费的自主学习和讲师指导的培训,快速开始您的 InfluxDB 之旅。

dbu-illustration