我想我理解的分片是把你切片的数据(碎片)放回一个容易处理的聚合,在上下文中是有意义的。这对吗?

更新:我想我在这里很挣扎。在我看来,应用层不应该决定数据应该存储在哪里。最好的情况下,它应该是某种碎片客户机。这两个回答都回答了是什么,而不是为什么它很重要。除了明显的性能提升,它还有什么含义?这些增益是否足以抵消MVC冲突?分片在大规模应用中是最重要的,还是适用于小规模应用?


当前回答

在我看来,应用层 应该没有业务决定吗 数据应该存储在哪里

这是一个很好的规则,但像大多数事情一样,并不总是正确的。

当你构建架构时,你从职责和协作开始。一旦确定了功能架构,就必须平衡非功能力量。

如果这些非功能性的力量之一是巨大的可伸缩性,那么您必须调整您的体系结构以适应这种力量,即使这意味着您的数据存储抽象现在泄漏到应用程序层。

其他回答

在我看来,应用层 应该没有业务决定吗 数据应该存储在哪里

这是一个很好的规则,但像大多数事情一样,并不总是正确的。

当你构建架构时,你从职责和协作开始。一旦确定了功能架构,就必须平衡非功能力量。

如果这些非功能性的力量之一是巨大的可伸缩性,那么您必须调整您的体系结构以适应这种力量,即使这意味着您的数据存储抽象现在泄漏到应用程序层。

切分是水平(按行)数据库分区,而不是垂直(按列)分区,后者是归一化。它将非常大的数据库分割成更小、更快、更容易管理的部分,称为数据碎片。它是一种实现分布式系统的机制。

为什么我们需要分布式系统?

availablity增加。 更容易扩展。 经济学:用一台大型计算机的能力创建一个小型计算机网络的成本更低。

你可以在这里阅读更多:分布式数据库的优势

分片如何帮助实现分布式系统?

You can partition a search index into N partitions and load each index on a separate server. If you query one server, you will get 1/Nth of the results. So to get complete result set, a typical distributed search system use an aggregator that will accumulate results from each server and combine them. An aggregator also distribute query onto each server. This aggregator program is called MapReduce in big data terminology. In other words, Distributed Systems = Sharding + MapReduce (Although there are other things too).

下图为视觉表现。

分片最初是由谷歌工程师创造的,你可以看到它在谷歌应用程序引擎上编写应用程序时被大量使用。由于查询可以使用的资源量有严格的限制,而且查询本身也有严格的限制,因此架构不仅鼓励而且几乎强制执行分片。

另一个可以使用分片的地方是减少数据实体上的争用。在构建可伸缩的系统时,特别重要的是要注意那些经常写入的数据,因为它们总是瓶颈。一个好的解决方案是分割特定的实体并写入多个副本,然后读取总数。这个“分片计数器wrt GAE”的示例:http://code.google.com/appengine/articles/sharding_counters.html

分片不仅仅是水平分区。 根据维基百科的文章,

Horizontal partitioning splits one or more tables by row, usually within a single instance of a schema and a database server. It may offer an advantage by reducing index size (and thus search effort) provided that there is some obvious, robust, implicit way to identify in which partition a particular row will be found, without first needing to search the index, e.g., the classic example of the 'CustomersEast' and 'CustomersWest' tables, where their zip code already indicates where they will be found. Sharding goes beyond this: it partitions the problematic table(s) in the same way, but it does this across potentially multiple instances of the schema. The obvious advantage would be that search load for the large partitioned table can now be split across multiple servers (logical or physical), not just multiple indexes on the same logical server.

同时,

在多个独立实例之间分割碎片需要比 简单的水平分区。期望的效率提高 会丢失,如果查询数据库需要两个实例 查询,只是为了检索一个简单的维度表。除了 分区,分片因此分割大的可分区表 服务器,而较小的表被复制为完整的单元

如果你对一个位置受限的DBMS进行查询(比如,用户只触发'where username = $my_username'),那么将所有以a - m开头的用户名放在一台服务器上,将所有以N-Z开头的用户名放在另一台服务器上是有意义的。通过这种方法,您可以获得一些查询的线性扩展。

长话短说:分片基本上是将表分配到不同服务器上的过程,以便平等地平衡两者的负载。

当然,现实情况要复杂得多。:)