数据库分片与分区

时间:2013-12-25 09:54:26

标签: mysql sharding database-partitioning

我最近一直在阅读有关可扩展架构的文章。在这种情况下,继续显示wrt数据库的两个词是 sharding partitioning 。我搜索了关于搜索引擎,维基百科和stackoverflow的描述,但仍然最终感到困惑。

stackoverflow的专家能否帮助我掌握基础知识?

  • 分片分区之间有什么区别?
  • 所有分片数据库是否实际上是分区的(在不同的节点上),但所有分区数据库都不一定是分片的
  • 这是真的吗?

8 个答案:

答案 0 :(得分:73)

分区更像是在表或数据库之间划分数据的通用术语。分片是一种特定类型的分区,即水平分区。

另见:http://www.quora.com/Whats-the-difference-between-sharding-and-partition

答案 1 :(得分:31)

看起来这样可以回答你的问题:

  

水平分区通常按行拆分一个或多个表   在模式和数据库服务器的单个实例中。有可能   通过减少索引大小(以及搜索工作量)提供优势   只要有一些明显的,强大的,隐含的识别方法   在哪个表中将找到特定的行,而不需要   搜索索引,例如'CustomersEast'的经典示例   和'CustomersWest'表,他们的邮政编码已经表明了   他们将被发现的地方。

     

Sharding超越了这个:它将有问题的表分区为   以同样的方式,但它可能跨多个实例   架构。显而易见的优点是搜索负载   现在,可以跨多个服务器拆分大型分区表   (逻辑或物理),而不仅仅是同一逻辑上的多个索引   服务器

来源:Wiki-Shard

  

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

来源:MongoDB

答案 2 :(得分:26)

我也一直在探讨这个问题,虽然我到目前为止已经提到了这个问题,但我收集的一些重要事实和我想分享的要点:

分区是逻辑数据库或其组成元素划分为不同的独立部分。数据库分区通常是出于可管理性,性能或可用性原因而进行的,与负载平衡相同。

https://en.wikipedia.org/wiki/Partition_(database)

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

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

https://en.wikipedia.org/wiki/Shard_(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倍。

分区策略

  • 范围
  • 哈希
  • 列表

您可以阅读他们的文字并想象他们的图像,这些图片可以很好地解释所有内容。

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

  • CPU
  • 磁盘
  • I / O
  • 内存

许多DBA将在同一台机器上进行分区,其中分区将共享所有资源,但通过拆分数据和/或索引来提供磁盘和I / O的改进。

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

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

    可能会有类似的情况

这是常规分区

但是共享仅是指第一种情况,即我们要基于行划分数据。如果将表分为多个表,则需要维护多个相似的模式副本,因为现在我们有多个表。

答案 5 :(得分:0)

共享(在水平分区的特殊情况下),即分区跨越多个数据库实例。如果对数据库进行分片,则意味着已按定义对数据库进行了分区。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

共享是mongo db的专用术语,可以归因于一般性的分区。