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

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


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

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

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


分片只是数据库“水平分区”的另一个名称。你可能想搜索一下这个词,让它更清楚。

从维基百科:

Horizontal partitioning is a design principle whereby rows of a database table are held separately, rather than splitting by columns (as for normalization). Each partition forms part of a shard, which may in turn be located on a separate database server or physical location. The advantage is the number of rows in each table is reduced (this reduces index size, thus improves search performance). If the sharding is based on some real-world aspect of the data (e.g. European customers vs. American customers) then it may be possible to infer the appropriate shard membership easily and automatically, and query only the relevant shard.

关于分片的更多信息:

首先,每个数据库服务器都是相同的,具有相同的表结构。其次,在分片数据库中对数据记录进行逻辑分割。与分区数据库不同,每个完整的数据记录只存在于一个分片中(除非有备份/冗余镜像),所有CRUD操作都只在该数据库中执行。您可能不喜欢使用的术语,但这确实代表了一种将逻辑数据库组织成更小部分的不同方式。

更新:你不会打破MVC。确定存储数据的正确分片的工作将由数据访问层透明地完成。在这里,您必须根据用于对数据库进行分片的标准来确定正确的分片。(因为您必须根据应用程序的某些具体方面手动将数据库分片为一些不同的分片。)然后,在从数据库加载数据和将数据存储到数据库中时必须小心,以使用正确的分片。

也许这个Java代码的例子使它更清楚(它是关于Hibernate Shards项目的),这将如何在现实场景中工作。

为了解决“为什么分片”:它主要只适用于非常大规模的应用程序,有大量的数据。首先,它有助于最小化数据库查询的响应时间。其次,你可以使用更便宜的“低端”机器来存储数据,而不是一台大服务器,这可能已经不够了。


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

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

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


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

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

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

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


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

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


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

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

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

下图为视觉表现。


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

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.

同时,

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


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

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

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

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

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