什么是分片,为什么如此重要?


196

我认为我理解分片是将切分后的数据(分片)放回到易于处理的聚合中,这在上下文中是有意义的。这样对吗?

更新:我想我在这里挣扎。我认为应用程序层应该没有业务来确定应将数据存储在何处。充其量应该是某种形式的分片客户端。两种回答都回答了重要的方面,但不是为什么。除了明显的性能提升之外,它还有什么含义?这些收益足以抵消对MVC的侵犯吗?分片在超大型应用程序中是否最重要,还是适用于较小规模的应用程序?


1
这些网络研讨会之一会有所帮助吗?vimeo.com/26742356 slideshare.net/rightscale/... vimeo.com/32541189

Answers:


193

分片只是数据库“水平分区”的另一个名称。您可能需要搜索该术语以使其更清楚。

维基百科

水平分区是一种设计原则,其中数据库表的行分别保存,而不是按列拆分(就规范化而言)。每个分区构成分片的一部分,而分片又可以位于单独的数据库服务器或物理位置上。优点是减少了每个表中的行数(这减小了索引大小,从而提高了搜索性能)。如果分片基于数据的某些实际方面(例如,欧洲客户与美国客户),则可以轻松,自动地推断适当的分片成员身份,并且仅查询相关的分片。

有关分片的更多信息:

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

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

也许这个带有Java代码的示例使它在实际情况下如何工作更加清晰了(这与Hibernate Shards项目有关)。

要解决“ why sharding”问题:它主要仅适用于具有大量数据的超大型应用程序。首先,它有助于最小化数据库查询的响应时间。其次,您可以使用更便宜的“低端”计算机来托管数据,而不是使用一台大型服务器来托管数据,而这可能不再足够了。


1
请原谅我,但数据库不应该确定存储数据的位置。这会影响应用程序层上的代码吗?
ojblass

6
长期以来,我一直试图了解它与水平分区的不同之处,并且您答案中的链接还可以证明没有区别。正如某人在对Theo Schlossnagle的帖子的评论中所说的:“ ...如果您来自传统的数据库文化,那么您在进行水平分区,如果您来自网络文化,那就是'
共享

@andreister从我正在阅读的内容来看,分片在概念上是不同的,它是通过跨多个逻辑或物理节点的水平缩放(在我的理解(mySQL)的情况下,多个数据库,很可能位于不同的逻辑硬件上)来定义的。水平分区是一个不太具体的术语,其中“着色”是其中的一个子集。再次以mySQL为例,mySQL分区由单个数据库实例处理,该实例对应用程序是100%透明的。分片方法涉及智能选择哪个实例的代理或应用程序。
NateDSaint 2012年

根据维基百科,“每个单独的分区都称为分片或数据库分片。” 这与答案中的文本有些不同,答案是“每个分区都是碎片的一部分”。
凯文·惠勒

您引用的Wiki文章在这两个术语之间做了些微区别。水平分区通常在模式和数据库服务器的单个实例中按行拆分一个或多个表。/ *** / 拆分不止于此:它划分以同样的方式有问题的表(一个或多个),但它在整个架构的潜在的多个实例执行此操作。 en.wikipedia.org/wiki/...
Peeter Kokk

38

如果对本地位置受到严格限制的DBMS进行查询(例如,用户仅使用'where username = $ my_username'触发选择),则将所有以AM开头的用户名放在一台服务器上,并将所有来自NZ的用户名有意义在另一。这样,您就可以对某些查询进行线性缩放。

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

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


因此,分片会影响您要存储的数据的设计...如果我不太了解,抱歉。
ojblass

这不是一个水平分区吗?
harunurhan

18

分片是水平(按)数据库分区,而垂直(按)数据库分区是Normalization。它将大型数据库分为较小,更快,更易于管理的部分,这些部分称为数据分片。它是一种实现分布式系统的机制。

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

  • 可用性增加。
  • 更容易扩展。
  • 经济性:利用一台大型计算机的功能来创建小型计算机网络的成本更低。

您可以在此处阅读更多内容:分布式数据库的优势

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

您可以将搜索索引划分为N个分区,并将每个索引加载到单独的服务器上。如果查询一台服务器,将得到结果的1 / N。因此,为了获得完整的结果集,典型的分布式搜索系统使用聚合器,该聚合器将累积来自每个服务器的结果并将其合并。聚合器还将查询分发到每个服务器上。该聚合程序在大数据术语中称为MapReduce。换句话说,分布式系统=分片+ MapReduce(尽管也有其他事情)。

下面的视觉表示。 分布式系统


7

分片在超大型应用程序中是否最重要,还是适用于较小规模的应用程序?

当且仅当您的需求超出了单个数据库服务器可以提供的服务时,分片才成为问题。如果您拥有可分割的数据,并且对扩展性和性能的要求高得令人难以置信,那么它就是一个膨胀工具。我想我在过去的12年中一直是一名软件专家,我遇到过一种可能会受益于分片的情况。这是一项先进技术,适用范围非常有限。

此外,未来可能会变得有趣而激动人心,就像消除了所有潜在性能限制的大型物体“云”一样,对吧?:)


你可以分享情况下,你需要分片
加甘Burde

4

分片最初是由Google工程师创造的,您可以看到在Google App Engine上编写应用程序时分片使用非常频繁。由于查询可以使用的资源数量有严格的限制,并且查询本身也有严格的限制,因此不仅鼓励分片,而且架构几乎强制执行分片。

可以使用的另一个分片方式是减少对数据实体的争用。当构建可伸缩系统以监视那些经常写入的数据时,这一点尤其重要,因为它们始终是瓶颈。一个好的解决方案是分拆该特定实体并写入多副本,然后读取总数。GAE的“分片计数器”示例:http : //code.google.com/appengine/articles/sharding_counters.html


7
<<共享最初是由Google工程师创造的>>-不是真的。Google成立于1998年。Scholar.google.com查找1980年代的论文,例如“在复制的数据库系统中丢弃过时的信息” ...在CCA开发的高可用复制数据系统(SHARD)...当时谈论分片。
Krazy Glew

3

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

水平分区通常在模式和数据库服务器的单个实例中按行拆分一个或多个表。如果存在某种明显的,健壮的,隐式的方式来标识特定行将在哪个分区中找到,而无需首先搜索索引(例如经典),则可以通过减小索引大小(从而减少搜索工作量)来提供优势。 “ CustomersEast”和“ CustomersWest”表的示例,其邮政编码已经指示了将在何处找到它们。

分片不仅限于此:它以相同的方式对有问题的表进行分区,但可以跨模式的多个实例进行此操作。明显的优势是,现在可以将大型分区表的搜索负载分散在多个服务器(逻辑或物理)上,而不仅仅是同一逻辑服务器上的多个索引。

也,

在多个隔离的实例之间拆分碎片不仅需要简单的水平分区。如果查询数据库需要查询两个实例,而只是检索一个简单的维表,则效率的期望提高将丢失。因此,除了分区之外,分片还可以在服务器之间拆分大型可分区表,而较小的表则作为完整的单元进行复制


1

我认为应用程序层应该没有业务来确定应将数据存储在何处

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

当您执行体系结构时,首先要承担责任和进行协作。一旦确定了功能架构,就必须平衡非功能力量。

如果这些非功能性因素之一是大规模的可伸缩性,则即使您的数据存储抽象现在泄漏到您的应用程序层中,您也必须调整体系结构以适应这种压力。


1
应用程序层仍然可以创建数据访问逻辑和业务规则的分离。这仅表示您在“应用程序层”层中还有其他概念层。
埃里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.