数据库分片与分区

我最近一直在阅读有关可伸缩架构的文章。在这种情况下,关于数据库不断出现的两个词是分片分区。我查了一下描述,但最后还是懵了。

stackoverflow的专家能帮我弄清楚基本的东西吗?

  • 分片分区之间的区别是什么?
  • “所有的分片数据库本质上都是分区的(在不同的节点上),但所有分区的数据库不一定都是分片的”是真的吗?
141429 次浏览

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

在这里,您可以跨(通常)多个实例或服务器复制模式,使用某种逻辑或标识符来知道要在哪个实例或服务器上查找数据。这种标识符通常被称为“碎片键”。

一种常见的无键逻辑是使用字母表来划分数据。A-D是实例1,E-G是实例2,等等。客户数据非常适合这样做,但是如果分区没有考虑到某些字母比其他字母更常见,那么在实例之间的大小表示就会有些错误。

另一种常用技术是使用键同步系统或逻辑,以确保跨实例的键是唯一的。

你可以研究的一个众所周知的例子是Instagram在早期是如何解决他们的划分问题的(见下面的链接)。他们开始在很少的服务器上进行分区,使用Postgres从一开始就划分数据。我相信是几千个逻辑碎片在那几个物理碎片上。在这里阅读他们2012年的精彩报道:Instagram工程- Sharding &id

看这里:http://www.quora.com/Whats-the-difference-between-sharding-and-partition

看来这回答了你的两个问题

水平分区通常是按行分割一个或多个表 在模式和数据库服务器的单个实例中。它可能 通过减少索引大小(从而减少搜索工作量)提供优势 只要有一些明显的,可靠的,隐含的方法来识别 在哪个表中可以找到特定的行,而不需要首先 检索索引,例如“CustomersEast”的经典示例。 以及“CustomersWest”表格,其中他们的邮政编码已经显示

分片不仅限于此:它将有问题的表分区 同样的方法,但是它跨越了潜在的多个实例 模式的。的搜索负载是明显的优势 大型分区表现在可以在多个服务器上拆分 (逻辑或物理),而不仅仅是同一逻辑上的多个索引 服务器。< / p >

来源:Wiki-Shard

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

来源:MongoDB

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

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

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

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

还有垂直分区 (VP),你可以将一个表分割成更小的不同部分。归一化还涉及到跨表的列分割,但是垂直分区不仅限于此,甚至在已经归一化的情况下还会对列进行分区。

https://en.wikipedia.org/wiki/Shard_(database_architecture)

我真的很喜欢Tony Baco在Quora上的回答,他让你从模式(而不是列和行)的角度思考。他说……

"水平分区",或sharding,是复制[复制]模式,然后根据一个分片键划分数据。

"垂直分区"涉及到对模式的划分(数据也随之划分)。

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

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

  1. 40万行(table1), 60万行(table2)

  2. 100万行&60列(表1)和100万行40列(表二)

    可能有很多这样的案例

这是一般分区

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

分片(特殊情况为水平分区),当分区跨越多个数据库实例时。如果一个数据库是分片的,这意味着根据定义它是分区的。

当谈论分区时,请不要使用术语复制或复制。复制是另一个概念,超出了本文的范围。 当我们谈论分区时,更好的说法是分割,当我们谈论分片时,更好的说法是分配。 在分区中(通常情况下,一般理解并非总是如此),大数据集表的行被划分为两个或多个不相连的(不共享任何行)组。您可以将每个组称为一个分区。这些组或所有分区仍然在一个rmb实例的控制下,这是完全合乎逻辑的。每个组的基可以是一个散列或范围等等。如果您在一个表中有十年的数据,那么您可以将每个年份的数据存储在一个单独的分区中,这可以通过基于一个非空列CREATE_DATE设置分区边界来实现。一旦您查询了db,那么如果您指定了一个在01-01-1999和31-12-2000之间的创建日期,那么只会命中两个分区,而且是顺序的。我在DB上做了类似的十亿多条记录,使用索引等,sql时间从30秒缩短到50毫秒。 分片是将每个分区托管在不同的节点/机器上。现在在分区/碎片内的搜索可以并行进行

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

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