数据库分片与分区

Posted

技术标签:

【中文标题】数据库分片与分区【英文标题】:Database sharding vs partitioning 【发布时间】:2014-01-13 07:38:46 【问题描述】:

我最近一直在阅读有关可扩展架构的文章。在这种情况下,关于数据库不断出现的两个词是 shardingpartitioning。我查了描述,但最终还是一头雾水。

*** 的专家能否帮助我正确理解基础知识?

分片分区有什么区别? '所有分片的数据库本质上都是分区的(在不同的节点上),但所有分区的数据库不一定都是分片',这是真的吗?

【问题讨论】:

digitalocean.com/community/tutorials/… 这可能会有所帮助。 【参考方案1】:

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

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

一种常见的无键逻辑是使用字母表来划分数据。 A-D 是实例 1,E-G 是实例 2,以此类推。客户数据非常适合这种情况,但如果分区没有考虑到某些字母比其他字母更常见,则跨实例的大小会有些错误。

另一种常见的技术是使用密钥同步系统或逻辑来确保跨实例的唯一密钥。

您可以研究的一个众所周知的例子是 Instagram 如何在早期解决他们的分区问题(请参阅下面的链接)。他们开始在很少的服务器上进行分区,从一开始就使用 Postgres 来划分数据。我相信那几个物理分片上有几千个逻辑分片。在此处阅读他们 2012 年的精彩文章:Instagram Engineering - Sharding & IDs

也可以在这里查看:http://www.quora.com/Whats-the-difference-between-sharding-and-partition

【讨论】:

分片是一种HP。不是惠普。 我认为水平分区只是意味着将表中的行拆分为几个子表(可能在同一个模式或数据库实例中)是正确的。虽然分片是水平分区,但将子表将表转换为单个数据库中的单独模式,或转换为单独机器上的单独数据库实例。还是不行?【参考方案2】:

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

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

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

Sharding是一种分区方式,如Horizo​​ntal Partitioning(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】:

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

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

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

来源:Wiki-Shard。

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

来源:MongoDB。

【讨论】:

【参考方案4】:

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

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

    100 万行 60 列(table1)和 100 万行 40 列(table2)

    这样的情况可能有多种

这是一般分区

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

【讨论】:

【参考方案5】:

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

【讨论】:

这完全有道理【参考方案6】:

分片水平分区的特殊情况下,当分区跨越多个数据库实例时。如果数据库是分片的,则意味着它是按定义分区的。

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于数据库分片与分区的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 分片与 Bigquery 分区

分片与分区的区别

分片分区复制的区别及实现(mongodbmysql)

Azure Cosmos DB 中托管的 MongoDB:分片与分区

Redis分片(分区)

分表分库与分区的区别及拆分策略