我最近一直在阅读有关可扩展体系结构的文章。在这种情况下,关于数据库不断出现的两个词是分片和分区。我查了一下描述,但还是弄糊涂了。
stackoverflow的专家能帮我做好基础知识吗?
- 分片和分区之间有什么区别
- ‘所有分片数据库本质上都是分区的(在不同的节点上),但所有分区的数据库不一定都是分片的’,这是真的吗
分区更像是在表或数据库之间划分数据的通用术语。Sharding是一种特定类型的分区,是所谓水平分区的一部分。
在这里,您可以跨(通常)多个实例或服务器复制模式,使用某种逻辑或标识符来知道要查找数据的实例或服务器。这种标识符通常被称为"碎片密钥"。
一种常见的无键逻辑是使用字母表来划分数据。A-D是实例1,E-G是实例2等。客户数据非常适合这一点,但如果分区没有考虑到某些字母比其他字母更常见,则在实例之间的大小会有所失真。
另一种常见的技术是使用密钥同步系统或逻辑来确保跨实例的唯一密钥。
你可以研究的一个众所周知的例子是Instagram在早期是如何解决分区的(见下面的链接)。他们最初在很少的服务器上进行分区,从一开始就使用Postgres来划分数据。我相信在那几个物理碎片上有几千个逻辑碎片。在这里阅读他们2012年的精彩文章:Instagram Engineering-Sharding&ID
请参阅此处:http://www.quora.com/Whats-the-difference-between-sharding-and-partition
我也一直在深入研究这个问题,尽管到目前为止我是这个问题的参考者,但我收集到的一些关键事实和我想分享的要点:
分区是将逻辑数据库或其组成元素划分为不同的独立部分。数据库分区通常是出于可管理性、性能或可用性的原因,如负载平衡。
https://en.wikipedia.org/wiki/Partition_(数据库)
碎片是一种分区,例如水平分区(HP)
还有垂直分区(VP),用于将表拆分为更小的不同部分。规范化还包括在表之间拆分列,但垂直分区超出了这一范围,即使已经规范化,也会对列进行分区。
https://en.wikipedia.org/wiki/Shard_(数据库_体系结构)
我真的很喜欢Tony Baco在Quora上的回答,他让你从模式(而不是列和行)的角度思考。他说。。。
">水平分区"或sharding是复制[复制]模式,然后根据shard键划分数据。
">垂直分区"涉及到对架构的划分(数据也随之进行)。
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
看起来这回答了您的两个问题:
水平分区通常按行拆分一个或多个表在模式和数据库服务器的单个实例中。它可能通过减少索引大小(从而减少搜索工作量)提供优势只要有一些明显的、稳健的、隐含的方法来识别在哪个表中可以找到特定的行,而无需首先搜索索引,例如"CustomersLast"的经典示例和"CustomersWest"表,其邮政编码已指示在哪里可以找到它们。
Sharding超越了这一点:它将有问题的表划分为同样的方式,但它在潜在的多个实例中执行此操作架构的。明显的优点是大型分区表现在可以跨多个服务器进行拆分(逻辑或物理),而不仅仅是同一逻辑上的多个索引服务器
来源:维基碎片。
Sharding是跨多个存储数据记录的过程机器,是MongoDB满足数据需求的方法发育随着数据大小的增加,单个机器可能不会足以存储数据,也不足以提供可接受的读写吞吐量Sharding解决了水平缩放的问题。具有分片,您可以添加更多的机器来支持数据增长和需求读取和写入操作。
来源:MongoDB。
考虑数据库中有100万行和100列的表在分区中,您可以将表划分为2个或多个具有以下属性的表:
-
40万行(表1),60万行(图2)
-
100万行&60列(表1)和100万行&40列(表2)
可能有多种类似的情况
这是一般分区
但是Sharding仅指第一种情况,即我们根据行划分数据。如果我们将表划分为多个表,我们需要维护模式的多个相似副本,因为现在我们有多个表。
当谈到分区时,请不要使用术语"复制"或"复制"。复制是一个不同的概念,超出了本页的范围。当我们谈论分区时,更好的词是divide,当我们谈论分片时,最好的词是distribute。在分区中(通常和一般理解中并不总是),大型数据集表的行被划分为两个或多个不相交(不共享任何行)的组。您可以将每个组称为分区。这些组或所有分区仍由一个RDMB实例控制,这是合乎逻辑的。每个组的基可以是散列或范围等。如果表中有十年的数据,则可以将该年的每个数据存储在一个单独的分区中,这可以通过在非空列CREATE_DATE的基础上设置分区边界来实现。查询数据库后,如果指定的创建日期在1999年1月1日至2000年12月31日之间,则只会命中两个分区,并且是连续的。我在DB上做了类似的处理,处理了十亿条以上的记录,使用索引等,sql时间从30秒变为50毫秒。Sharding是指将每个分区托管在不同的节点/机器上。现在,在分区/碎片内部进行搜索可以并行进行。
共享在水平分区的特殊情况下,当分区跨越多个数据库实例时。如果数据库是分片的,这意味着它是按定义分区的。
当移动到另一个数据库实例*时,水平分区将成为数据库碎片。
数据库实例可以在同一台计算机上,也可以在其他计算机上。