数据库分片与分区
最近我一直在阅读可扩展架构。 在这种情况下,继续显示数据库的两个词是分片和分区 。 我searchsearch引擎,维基百科和计算器的描述,但仍然结束了困惑。
可以在stackoverflow的专家帮助我获得基本的权利?
- 分片和分区有什么区别?
- 是不是真的“所有分片数据库本质上是分区的(通过不同的节点),但是所有的分区数据库不一定是分片的 ?
分区更多地是在表或数据库之间划分数据的通用术语。 分片是一种特定types的分区,即水平分区。
在这里也可以看到: http : //www.quora.com/Whats-the-difference-between-sharding-and-partition
看起来像这回答你的问题:
水平分区通常在模式和数据库服务器的单个实例中按行分割一个或多个表。 它可以通过减less索引大小(以及因此search努力)来提供优点,只要有一些明显的,可靠的,隐含的方式来识别在哪个表中将find特定的行,而不首先需要search索引,例如经典“CustomersEast”和“CustomersWest”表格的示例,其中的邮政编码已经指明了它们的位置。
分片超出了这个范围:它以相同的方式划分有问题的表格,但是它在可能的多个模式实例上执行。 显而易见的优势是现在可以将大型分区表的search负载分散到多个服务器(逻辑或物理)上,而不仅仅是同一个逻辑服务器上的多个索引。
来源: Wiki-Shard 。
分片是在多台机器上存储数据logging的过程,也是MongoDB满足数据增长需求的方法。 随着数据量的增加,单个机器可能不足以存储数据,也不能提供可接受的读写吞吐量。 分片解决了水平缩放的问题。 通过分片,您可以添加更多机器来支持数据增长以及读写操作的需求。
来源: MongoDB 。
我也一直在潜心研究这个问题,尽pipe我是这个问题的参考,但是我没有收集到关键的事实,并且指出我想分享一下:
分区是将逻辑数据库或其组成元素划分为不同的独立部分。 数据库分区通常是为了可pipe理性,性能或可用性原因而完成的,就像负载平衡一样。
https://en.wikipedia.org/wiki/Partition_(database);
分片是一种分区,如水平分区 (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
何时分区表
以下是关于何时分区表的一些build议:
- 大于2 GB的表应始终被视为分区的候选对象。
- 包含历史数据的表格,其中将新数据添加到最新的分区中。 一个典型的例子是历史表,其中只有当前月份的数据是可更新的,其他11个月是只读的。
- 当表的内容需要分布在不同types的存储设备上时。
分区修剪
分区修剪是使用分区来提高性能的最简单也是最重要的手段。 分区修剪通常可以将查询性能提高几个数量级。 例如,假设应用程序包含一个订单表,其中包含订单的历史logging,并且此表已按周分区。 请求单周订单的查询只能访问Orders表的单个分区。 如果订单表具有2年的历史数据,则该查询将访问一个分区而不是104个分区。 仅仅因为分区修剪,这个查询可能执行速度提高了100倍。
分区策略
- 范围
- 哈希
- 名单
你可以阅读他们的文本,并可视化他们的图像,解释一切都很好。
最后,了解数据库是非常耗费资源的是非常重要的:
- 中央处理器
- 磁盘
- I / O
- 记忆
许多DBA将在同一台机器上进行分区,其中分区将共享所有资源,但是通过拆分数据和/或索引来改善磁盘和I / O。
而其他策略将采用“无共享”架构,其中碎片将驻留在独立且不同的计算单元(节点)上,具有100%的CPU,磁盘,I / O和内存本身。 提供它自己的优点和复杂性。