最近我一直在研究可扩展的架构。在这种情况下,涉及到数据库的两个词是分片(sharding)和分区(partitioning)。我查看了它们的描述,但仍然感到困惑。
请Stackoverflow的专家帮助我正确理解基础知识:
- 分片和分区之间有什么区别?
- “所有分片数据库本质上都是在不同节点上进行了分区,但并非所有分区数据库都必须是分片的。”这种说法是否正确?
最近我一直在研究可扩展的架构。在这种情况下,涉及到数据库的两个词是分片(sharding)和分区(partitioning)。我查看了它们的描述,但仍然感到困惑。
请Stackoverflow的专家帮助我正确理解基础知识:
划分是将数据在表格或数据库之间分割的通用术语。Sharding是水平划分中的一种具体类型。
在这里,你可以通过一些逻辑或标识符来跨多个实例或服务器复制架构,以知道要查找数据的实例或服务器。这种标识符通常称为“分片密钥”。
常用的无关键逻辑是使用字母表来划分数据。 A-D 是第 1 个实例,E-G 是第 2 个实例等。客户数据非常适合此项技术,但如果划分不考虑某些字母比其他字母更常用,则在实例之间其大小会有所不同。
另一种常见的技术是使用键同步系统或逻辑来确保跨实例的唯一键。
一个众所周知的例子是Instagram在早期如何解决其分区问题(请参见下面的链接)。他们开始将数据从一开始就分割到非常少的服务器上,使用Postgres进行划分。我相信那几个物理块上有数千个逻辑分片。阅读他们 2012 年的精彩文章:Instagram 工程 - Sharding & IDs
请参见此处:http://www.quora.com/Whats-the-difference-between-sharding-and-partition
我也一直在研究这个问题,虽然远非权威,但我已经收集了一些关键事实和要点,想分享一下:
分区是将逻辑数据库或其构成元素划分为不同的独立部分。通常通过数据库分区来进行可管理性、性能或可用性方面的处理,以实现负载均衡。
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
何时分区表
以下是一些应当考虑对表进行分区的建议:
分区剪枝
分区剪枝是使用分区的最简单和最重要的手段来提高性能。分区剪枝通常可以将查询性能提高数个数量级。例如,假设一个应用程序包含一个订单表,其中记录了历史订单,该表按周进行了分区。请求单个星期的订单的查询仅访问订单表的一个分区。如果订单表拥有两年的历史数据,则该查询将仅访问一个分区,而不是 104 个分区。这个查询可能会因为分区剪枝而执行得快100倍。
分区策略
您可以阅读它们的文本并可视化它们的图像,这些都很好地解释了它们。
最后,重要的是要理解数据库非常耗费资源:
许多 DBA 会在同一台机器上进行分区,其中分区将共享所有资源,但通过分割数据和/或索引提供磁盘和 I/O 改进。
其他策略将采用“共享无物”架构,其中分片将驻留在单独且不同的计算单元(节点)上,拥有100%的CPU、磁盘、I/O和内存。这样做提供了自己的一套优势和复杂性。
0.4百万行(table1),0.6百万行(table2)
一百万行和60列(table1)以及一百万行和40列(table2)
可能会有多种情况。
Sharding是水平分区的一种特殊情况,其中分区跨越多个数据库实例。如果数据库进行了分片,则意味着它被划分了。
水平分区在移动到另一个数据库实例*时,变成了一个数据库分片。
数据库实例可以在同一台机器上或另一台机器上。