我最近一直在阅读有关可伸缩架构的文章。在这种情况下,关于数据库不断出现的两个词是分片和分区。我查了一下描述,但最后还是懵了。
stackoverflow的专家能帮我弄清楚基本的东西吗?
分区是跨表或数据库划分数据的通用术语。分片是一种特定类型的分区,是所谓水平分区的一部分。
在这里,您可以跨(通常)多个实例或服务器复制模式,使用某种逻辑或标识符来知道要在哪个实例或服务器上查找数据。这种标识符通常被称为“碎片键”。
一种常见的无键逻辑是使用字母表来划分数据。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
何时对表进行分区
下面是一些关于何时划分表的建议:
分区修剪
分区修剪是使用分区提高性能的最简单也是最有效的方法。分区修剪通常可以将查询性能提高几个数量级。例如,假设应用程序包含一个Orders表,其中包含订单的历史记录,并且该表已按周划分。请求一周订单的查询将只访问orders表的单个分区。如果Orders表有2年的历史数据,那么该查询将访问一个分区,而不是104个分区。由于分区修剪,该查询的执行速度可能会提高100倍。
分区策略
你可以阅读他们的文字,想象他们的图像,这些图像很好地解释了一切。
最后,重要的是要理解数据库是极其资源密集型的:
许多DBA将在同一台机器上进行分区,这些分区将共享所有资源,但通过分割数据和/或索引来改进磁盘和I/O。
而其他策略将采用“无共享”架构,其中碎片将驻留在独立的计算单元(节点)上,拥有100%的CPU、磁盘、I/O和内存。提供它自己的一组优势和复杂性。
https://en.wikipedia.org/wiki/Shared_nothing_architecture
考虑数据库中有100万行和100列的表 在分区中,您可以将表分为2个或更多具有如下属性的表:
40万行(table1), 60万行(table2)
100万行&60列(表1)和100万行40列(表二)
可能有很多这样的案例
这是一般分区
但是分片仅指第一种情况,即我们以行为基础划分数据。如果我们将表划分为多个表,我们需要维护模式的多个类似副本,因为现在我们有多个表。
分片(特殊情况为水平分区),当分区跨越多个数据库实例时。如果一个数据库是分片的,这意味着根据定义它是分区的。
当水平分区移动到另一个数据库实例*时,水平分区将变成数据库分片。
数据库实例可以在同一台机器上,也可以在另一台机器上。