我最近一直在阅读有关可伸缩体系结构的文章。在这种情况下,与数据库有关的两个词不断出现:分片和分区。我查阅了说明,但仍然感到困惑。
stackoverflow的专家可以帮助我掌握基础知识吗?
- 分片和分区有什么区别?
- 是“所有分片数据库本质上都是分区的(在不同的节点上),但不一定所有分片的数据库都必须分片”吗?
我最近一直在阅读有关可伸缩体系结构的文章。在这种情况下,与数据库有关的两个词不断出现:分片和分区。我查阅了说明,但仍然感到困惑。
stackoverflow的专家可以帮助我掌握基础知识吗?
Answers:
分区是用于跨表或数据库划分数据的通用术语。分片是一种特定的分区类型,是水平分区的一部分。
在这里,您使用某种逻辑或标识符(通常)在多个实例或服务器之间复制架构,以了解要在哪个实例或服务器中查找数据。这种标识符通常称为“分片密钥”。
常见的无键逻辑是使用字母来划分数据。AD是实例1,EG是实例2,以此类推。客户数据非常适合此情况,但是如果分区没有考虑到某些字母比其他字母更常见,那么在各个实例中大小会被错误地表示。
另一种常见的技术是使用密钥同步系统或逻辑,以确保实例之间具有唯一的密钥。
您可以研究的一个著名示例是Instagram在早期如何解决其分区(请参阅下面的链接)。他们开始使用很少的服务器进行分区,使用Postgres从一开始就划分数据。我相信在那几个物理碎片上只有数千个逻辑碎片。在此处阅读他们2012年的精彩文章:Instagram Engineering-分片和ID
也请参见此处:http : //www.quora.com/Whats-the-difference-between-sharding-and-partition
看起来这可以回答您的两个问题:
水平分区通常在模式和数据库服务器的单个实例中按行拆分一个或多个表。如果存在某种明显的,健壮的,隐式的方式来标识将在哪个表中找到特定行而无需首先搜索索引(例如经典索引),则可以通过减小索引大小(从而减少搜索工作量)来提供优势。 “ CustomersEast”和“ CustomersWest”表的示例,其邮政编码已经指示了将在何处找到它们。
分片不仅限于此:它以相同的方式对有问题的表进行分区,但可以跨模式的多个实例进行此操作。明显的优势是,现在可以将大型分区表的搜索负载分散在多个服务器(逻辑或物理)上,而不仅仅是同一逻辑服务器上的多个索引。
资料来源:Wiki-Shard。
分片是跨多台机器存储数据记录的过程,是MongoDB满足数据增长需求的方法。随着数据大小的增加,单台机器可能不足以存储数据,也无法提供可接受的读写吞吐量。分片解决了水平缩放的问题。通过分片,您可以添加更多计算机来支持数据增长和读取和写入操作的需求。
资料来源:MongoDB。
我也一直在研究这个问题,尽管到目前为止,我一直是这个问题的参考,但我收集了一些关键事实,并希望分享一些要点:
甲分区是一个逻辑数据库或它的组成元件分成不同的部分独立的一个部门。通常出于可管理性,性能或可用性方面的原因以及负载平衡的原因对数据库进行分区。
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
何时对表进行分区
以下是有关何时对表进行分区的一些建议:
分区修剪
分区修剪是使用分区提高性能的最简单也是最重要的方法。分区修剪通常可以将查询性能提高几个数量级。例如,假设一个应用程序包含一个Orders表,该表包含订单的历史记录,并且该表已按周进行了分区。查询一周订单的查询只能访问Orders表的单个分区。如果Orders表具有2年的历史数据,则此查询将访问一个分区而不是104个分区。仅由于分区修剪,该查询的执行速度可能会提高100倍。
分区策略
您可以阅读他们的文本并形象化他们的图像,从而很好地解释了所有内容。
最后,重要的是要了解数据库非常耗费资源:
许多DBA将在同一台计算机上进行分区,这些分区将共享所有资源,但通过拆分数据和/或索引来改善磁盘和I / O。
其他策略将采用“无共享”架构,其中分片将驻留在单独且不同的计算单元(节点)上,而CPU,磁盘,I / O和内存本身占100%。提供自己的优点和复杂性。
在谈论分区时,请勿使用术语复制或复制。复制是一个不同的概念,不在本页面的讨论范围之内。当我们谈论分区时,更好的词就是划分,而当我们谈论分片时,更好的词就是分配。在分区中(通常并且通常不总是这样),大数据集表的行分为两个或多个不相交的(不共享任何行)组。您可以将每个组称为一个分区。这些组或所有分区均受一次RDMB实例的控制,这是合乎逻辑的。每个组的基础可以是哈希或范围等。如果表中有十年的数据,则可以将一年中的每个数据存储在单独的分区中,这可以通过基于非空列CREATE_DATE。一旦查询了数据库,则如果您在01-01-1999到31-12-2000之间指定了创建日期,则将仅命中两个分区,并且该分区将是连续的。我在数据库上做了十亿条以上的记录,并且使用索引等将sql时间从30秒缩短到50毫秒。分片是将每个分区托管在不同的节点/计算机上。现在,可以在分区/碎片内部并行搜索。