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

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


当前回答

很抱歉在这里没有详细介绍,但这两篇文章是我所找到的关于分片和如何实现该模式的不同策略的最好的文章。

https://learn.microsoft.com/en-us/azure/architecture/patterns/sharding

将数据存储划分为水平分区或碎片。每一个碎片 具有相同的模式,但保存自己不同的数据子集。一个 Shard本身就是一个数据存储(它可以包含用于 许多不同类型的实体),运行在服务器上充当 存储节点。

https://www.mongodb.com/features/database-sharding-explained

分片是一种缩放形式,称为水平缩放或 向外扩展,引入其他节点来分担负载。 水平扩展允许几乎无限的可伸缩性来处理大型 数据和繁重的工作负载。相反,垂直缩放指的是 增加单机或单机服务器的能力 更强大的CPU,更大的RAM,或更大的存储容量。

其他回答

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

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

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

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

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

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

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).

下图为视觉表现。

很抱歉在这里没有详细介绍,但这两篇文章是我所找到的关于分片和如何实现该模式的不同策略的最好的文章。

https://learn.microsoft.com/en-us/azure/architecture/patterns/sharding

将数据存储划分为水平分区或碎片。每一个碎片 具有相同的模式,但保存自己不同的数据子集。一个 Shard本身就是一个数据存储(它可以包含用于 许多不同类型的实体),运行在服务器上充当 存储节点。

https://www.mongodb.com/features/database-sharding-explained

分片是一种缩放形式,称为水平缩放或 向外扩展,引入其他节点来分担负载。 水平扩展允许几乎无限的可伸缩性来处理大型 数据和繁重的工作负载。相反,垂直缩放指的是 增加单机或单机服务器的能力 更强大的CPU,更大的RAM,或更大的存储容量。

分片在非常中最重要吗 大规模的应用 适用于规模较小的公司?

当且仅当您的需求扩展超过单个数据库服务器所能提供的服务时,就需要考虑切分。如果你有可分片的数据,并且有难以置信的高可伸缩性和性能要求,这是一个很好的工具。我猜在我12年的软件专业生涯中,我遇到过一种可以从分片中受益的情况。这是一种先进的技术,但适用性非常有限。

此外,未来可能会有一些有趣和令人兴奋的东西,比如一个巨大的物体“云”,它消除了所有潜在的性能限制,对吧?:)

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

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