何时使用水平分区,何时使用数据库分片?

8
我正在阅读维基百科上的这篇文章:http://en.wikipedia.org/wiki/Shard_(database_architecture),试图找到这两种技术之间的主要区别。以下是我找到的内容:
水平分区将一个或多个表按行拆分,通常在模式和数据库服务器的单个实例内。它可能通过减少索引大小(从而减少搜索工作量)提供优势,前提是有一些明显、稳健、隐含的方法来识别特定行将在哪个表中找到,而不需要首先搜索索引,例如“CustomersEast”和“CustomersWest”表的经典示例,在这个例子中,他们的邮政编码已经指出了他们将被找到的位置。
分片超越了这一点: 它以相同的方式对问题表进行分区,但是它在模式的多个实例之间执行此操作。明显的优点是,大型分区表的搜索负载现在可以分散到多个服务器(逻辑或物理),而不仅仅是在同一逻辑服务器上的多个索引。
据我所知,水平分区更适用于单实例(单节点环境),而分片用于多节点/多数据中心环境。这正确吗?还是有不同的使用场景?
额外问题: 对于一个具有数百万行的巨大表(约4-5列的简单模式),如何提高对该表的读写性能最好?

巨大的表格不是数百万行。现在,巨大的表格至少有500亿行。如果不了解数据和查询模式,就不能选择单一的最佳技术来提高读写性能。任何声称告诉你如何做到这一点的人都将面临一个尴尬的问题,即两个相同“大小”的数据库性能差异巨大。 - Andrew Wolfe
2个回答

11
您是正确的,水平分区(例如在MySQL和PostgreSQL中支持)将表拆分为单个服务器内的多个部分。这可以提高性能,因为数据和索引可以分布在许多磁盘卷上,从而改善I/O。通常使用键范围来完成此操作。
数据库分片将数据分布在多个服务器上,而不仅仅是在单个服务器内进行分区。在这种情况下,您可以使用分片键对数据进行分区,通常使用某种哈希算法。您可以在此处获得有关此主题的白皮书(由我们公司提供,不针对任何产品,解释该技术):http://www.codefutures.com/database-sharding-white-paper/ DBMS单服务器分区的优点在于设置和管理相对简单。缺点是最终受限于单个服务器的功能。特别是在涉及大量写入争用、数据库锁定和复杂查询时会出现这种情况。
数据库分片需要更多的工作,但具有完全可扩展的共享无内容方法的优势。
明显的指标表明需要数据库分片是单个服务器无法跟上写入量时。如果您有许多重要查询,这也可能需要这种类型的解决方案。
话虽如此,如果您谈论的是有4-5列的数百万行,并且您的读取可以进行良好的索引以实现快速访问,则很难确定是否需要实施这两个选项。当涉及到拥有亿万行和数千用户时,数据库可扩展性至关重要。
我正在处理有关数据库可扩展性的信息网站:www.bigdatascalability.com。它包括链接到各种文章,并将随时间添加新内容。

0

你对分区和分片的区别有正确的认识。我建议你阅读我在这个主题上写的一篇文章:Scale Up, Partitioning, Scale Out

另外一个好的文章可以在这里找到:“MySQL Partitioning: A Stopgap Measure”(免责声明:我为ScaleBase工作)。

分区可以解决一些大小挑战和从表中读取的问题,但是分片才是真正解决大型数据库的所有方面,包括读写、并发和维护数据库实例(备份、复制等)以及其他方面的唯一方法。

虽然现代数据库(通常是NoSQL数据库)如MongoDB可以直接提供此功能,在MySQL中,它曾经是“去分片自己”的议程...... ScaleBase是一个完整的扩展解决方案制造商,如果您愿意,可以称之为“自动分片机器”。ScaleBase分析您的数据和SQL流,将数据分割成DB节点,路由命令并在运行时聚合结果 - 所以您不必自己做!

希望这有所帮助!

Doron


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接