什么是分片,为什么它很重要?

我认为我明白将分片数据(碎片)放回一个容易处理在上下文中合理的聚合的分片。 它是否正确?

更新 :我想我在这里挣扎。 在我看来,应用层应该没有业务决定数据应该存储在哪里。 充其量,它应该是某种碎片客户端。 两个回答都回答了什么,但不是为什么这个重要的方面。 除了显而易见的性能收益之外,还有什么影响呢? 这些收益是否足以抵消MVC违规? 在非常大规模的应用中,分片是非常重要的,还是适用于规模较小的应用?

分片是数据库的“水平分区”的另一个名字。 您可能需要search该术语以使其更清晰。

维基百科 :

水平分区是一个devise原则,数据库表的行是分开保存的,而不是按列分割(正常化)。 每个分区构成分片的一部分,分片又可以位于单独的数据库服务器或物理位置上。 好处是减less了每个表中的行数(这减less了索引大小,从而提高了search性能)。 如果分片基于数据的某些真实世界(例如,欧洲客户与美国客户),则可以容易且自动地推断适当的分片成员资格,并且仅查询相关的分片。

关于分片的更多信息:

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

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

也许这个 Java代码的例子使得它更清晰一点(这是关于Hibernate Shards项目),这是如何在真实世界的情况下工作的。

为了解决“ why sharding ”:它主要只适用于大规模的应用程序,数据量很大。 首先,它有助于最小化数据库查询的响应时间。 其次,你可以使用更便宜的“低端”机器来托pipe你的数据,而不是一个大的服务器,这可能不足够了。

如果你有一个数据库pipe理系统(DBMS)的查询是非常有限的(例如,一个用户只用一个'where username = $ my_username'来触发select),那么把所有以AN开头的用户名放在一台服务器上,在另一。 通过这个,你可以近乎线性缩放一些查询。

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

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

Sharding最初是由谷歌工程师创造的,在Google App Engine上编写应用程序时,您会发现它使用得相当厉害。 由于查询可以使用的资源数量有严格的限制,而查询本身也有严格的限制,所以分片不仅受到鼓励,而且几乎被架构强制执行。

另一个可以使用的地方是减less对数据实体的争用。 当构build可扩展的系统来注意经常编写的那些数据,因为它们始终是瓶颈时,这一点尤其重要。 一个好的解决办法是将特定的实体分离出来并写入多重副本,然后读取总数。 这个“分片计数器与GAE的例子: http : //code.google.com/appengine/articles/sharding_counters.html

在非常大规模的应用中,分片是非常重要的,还是适用于规模较小的应用?

当且仅当您的需求超过单个数据库服务器可以提供的服务时,分片是一个问题。 如果您有可分片的数据,并且您具有令人难以置信的高可扩展性和性能要求,那么这是一个膨胀的工具。 我想,在我整个12年里,我一直是一名软件专业人员,我遇到了一个可以从分片中受益的情况。 这是一种适用性非常有限的先进技术。

另外,未来可能会像一个消除所有潜在性能限制的巨大对象“云”一样有趣和令人兴奋,对吗? 🙂

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

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

当你做你的架构,你开始负责任和合作。 一旦你确定了你的function架构,你就必须平衡非function性的力量。

如果这些非function性的力量之一具有巨大的可扩展性,那么即使这意味着您的数据存储抽象现在已经泄漏到您的应用程序层中,您也必须调整您的体系结构以迎合这种力量。