数据库分片与分区


166

我最近一直在阅读有关可伸缩体系结构的文章。在这种情况下,与数据库有关的两个词不断出现:分片分区。我查阅了说明,但仍然感到困惑。

stackoverflow的专家可以帮助我掌握基础知识吗?

  • 分片分区有什么区别?
  • “所有分片数据库本质上都是分区的(在不同的节点上),但不一定所有分片的数据库都必须分片”吗?

Answers:


130

分区是用于跨表或数据库划分数据的通用术语。分片是一种特定的分区类型,是水平分区的一部分。

在这里,您使用某种逻辑或标识符(通常)在多个实例或服务器之间复制架构,以了解要在哪个实例或服务器中查找数据。这种标识符通常称为“分片密钥”。

常见的无键逻辑是使用字母来划分数据。AD是实例1,EG是实例2,以此类推。客户数据非常适合此情况,但是如果分区没有考虑到某些字母比其他字母更常见,那么在各个实例中大小会被错误地表示。

另一种常见的技术是使用密钥同步系统或逻辑,以确保实例之间具有唯一的密钥。

您可以研究的一个著名示例是Instagram在早期如何解决其分区(请参阅下面的链接)。他们开始使用很少的服务器进行分区,使用Postgres从一开始就划分数据。我相信在那几个物理碎片上只有数千个逻辑碎片。在此处阅读他们2012年的精彩文章:Instagram Engineering-分片和ID

也请参见此处:http : //www.quora.com/Whats-the-difference-between-sharding-and-partition


16
分片是HP的一种。不是惠普。
2013年

1
我是否认为水平分区只是意味着将表中的行拆分为几个子表(可能在同一模式或数据库实例中)。分片是水平分区时,将子表放入单个数据库中的单独模式中,或放入单独计算机上的单独数据库实例中。或不?
乔纳森·哈特利

48

看起来这可以回答您的两个问题:

水平分区通常在模式和数据库服务器的单个实例中按行拆分一个或多个表。如果存在某种明显的,健壮的,隐式的方式来标识将在哪个表中找到特定行而无需首先搜索索引(例如经典索引),则可以通过减小索引大小(从而减少搜索工作量)来提供优势。 “ CustomersEast”和“ CustomersWest”表的示例,其邮政编码已经指示了将在何处找到它们。

分片不仅限于此:它以相同的方式对有问题的表进行分区,但可以跨模式的多个实例进行此操作。明显的优势是,现在可以将大型分区表的搜索负载分散在多个服务器(逻辑或物理)上,而不仅仅是同一逻辑服务器上的多个索引。

资料来源:Wiki-Shard

分片是跨多台机器存储数据记录的过程,是MongoDB满足数据增长需求的方法。随着数据大小的增加,单台机器可能不足以存储数据,也无法提供可接受的读写吞吐量。分片解决了水平缩放的问题。通过分片,您可以添加更多计算机来支持数据增长和读取和写入操作的需求。

资料来源:MongoDB


41

我也一直在研究这个问题,尽管到目前为止,我一直是这个问题的参考,但我收集了一些关键事实,并希望分享一些要点:

分区是一个逻辑数据库或它的组成元件分成不同的部分独立的一个部门。通常出于可管理性,性能或可用性方面的原因以及负载平衡的原因对数据库进行分区

https://zh.wikipedia.org/wiki/分区_(数据库)

分片是一种分区类型,例如水平分区(HP)

还有垂直分区(VP),您可以将表拆分为较小的不同部分。规范化还涉及跨表的列拆分,但是垂直分区超出了该范围,即使已经进行了规范化,也可以对列进行分区。

https://zh.wikipedia.org/wiki/碎片(database_architecture)

我真的很喜欢Tony Baco在Quora上的回答,他使您根据模式(而不是列和行)进行思考。他说...

水平分区 ”或“分片”是复制[复制]模式,然后根据分片键对数据进行划分。

垂直分区 ”涉及到划分模式(数据随行而行)。

https://www.quora.com/Whats-the-difference-between-sharding-DB-tables-and-partitioning-them

Oracle的数据库分区指南有一些不错的数字。我已经复制了这篇文章的一些摘录。

https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm

何时对表进行分区

以下是有关何时对表进行分区的一些建议:

  • 大于2 GB的表应始终视为分区的候选对象。
  • 包含历史数据的表,其中将新数据添加到最新分区中。一个典型的示例是一个历史表,其中只有当月的数据是可更新的,而其他11个月是只读的。
  • 当表的内容需要分布在不同类型的存储设备上时。

分区修剪

分区修剪是使用分区提高性能的最简单也是最重要的方法。分区修剪通常可以将查询性能提高几个数量级。例如,假设一个应用程序包含一个Orders表,该表包含订单的历史记录,并且该表已按周进行了分区。查询一周订单的查询只能访问Orders表的单个分区。如果Orders表具有2年的历史数据,则此查询将访问一个分区而不是104个分区。仅由于分区修剪,该查询的执行速度可能会提高100倍。

分区策略

  • 范围
  • 杂凑
  • 清单

您可以阅读他们的文本并形象化他们的图像,从而很好地解释了所有内容。

最后,重要的是要了解数据库非常耗费资源:

  • 中央处理器
  • 磁碟
  • 输入/输出
  • 记忆

许多DBA将在同一台计算机上进行分区,这些分区将共享所有资源,但通过拆分数据和/或索引来改善磁盘和I / O。

其他策略将采用“无共享”架构,其中分片将驻留在单独且不同的计算单元(节点)上,而CPU,磁盘,I / O和内存本身占100%。提供自己的优点和复杂性。

https://zh.wikipedia.org/wiki/Shared_nothing_architecture


““水平分区”或分片是复制(复制)模式,然后基于分片键对数据进行划分。” -这是重言式的。
8bitjunkie

因此,有一个镜子,它是零散的,因此是词源。
mckenzm

5

考虑数据库中具有100万行和100列的表,在分区中,您可以将表分为2个或多个具有以下属性的表:

  1. 40万行(表1),60万行(表2)

  2. 一百万行60列(表1)和一百万行40列(表2)

    可能有多种情况

这是常规分区

但是,分片是指第一种情况下只有当我们将行的基础上的数据。如果将表分为多个表,则需要维护多个相似的模式副本,因为现在有多个表。


1

拆分中的一个特例水平分区,当跨越多个数据库实例分区跨度。如果对数据库进行分片,则意味着它已按定义分区。


1

在谈论分区时,请勿使用术语复制或复制。复制是一个不同的概念,不在本页面的讨论范围之内。当我们谈论分区时,更好的词就是划分,而当我们谈论分片时,更好的词就是分配。在分区中(通常并且通常不总是这样),大数据集表的行分为两个或多个不相交的(不共享任何行)组。您可以将每个组称为一个分区。这些组或所有分区均受一次RDMB实例的控制,这是合乎逻辑的。每个组的基础可以是哈希或范围等。如果表中有十年的数据,则可以将一年中的每个数据存储在单独的分区中,这可以通过基于非空列CREATE_DATE。一旦查询了数据库,则如果您在01-01-1999到31-12-2000之间指定了创建日期,则将仅命中两个分区,并且该分区将是连续的。我在数据库上做了十亿条以上的记录,并且使用索引等将sql时间从30秒缩短到50毫秒。分片是将每个分区托管在不同的节点/计算机上。现在,可以在分区/碎片内部并行搜索。


0

当移动到另一个数据库实例时,水平分区 *成为数据库碎片

数据库实例可以在同一台计算机上,也可以在另一台计算机上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.