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

Posted

技术标签:

【中文标题】什么是分片,为什么它很重要?【英文标题】:What is sharding and why is it important? 【发布时间】:2010-11-02 20:10:47 【问题描述】:

我认为我理解分片是将您的切片数据(分片)放回一个易于处理的聚合中,这在上下文中是有意义的。它是否正确?

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

【问题讨论】:

这些网络研讨会之一会有帮助吗? vimeo.com/26742356slideshare.net/rightscale/…vimeo.com/32541189 【参考方案1】:

如果您要查询的 DBMS 的位置非常受限制(例如,用户只使用 'where username = $my_username' 触发选择),则将所有以 AM 开头的用户名放在一台服务器上是有意义的,并且全部来自新西兰。通过这种方式,您可以获得一些查询的接近线性缩放。

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

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

【讨论】:

所以分片会影响您存储的数据的设计......如果我不太明白,请见谅。 这不是水平分区吗?【参考方案2】:

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

来自Wikipedia:

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

更多关于分片的信息:

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

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

也许this example 与 Java 代码使它更清楚一些(这是关于 Hibernate Shards 项目),这将如何在现实世界的场景中工作。

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

【讨论】:

原谅我,但数据库不应该决定将数据存储在哪里。这会影响应用层上的代码吗? 我一直试图了解它与水平分区有何不同,您的答案中的链接有点证明没有区别。正如有人在 cmets 中对 Theo Schlossnagle 的帖子所说的那样,“......如果你来自传统的数据库文化,那么你在做水平分区,如果你来自 Web 文化,那就是‘分片’......” @andreister 从我读到的内容来看,分片在概念上是不同的,因为它是由跨多个逻辑或物理节点的水平扩展定义的(在我的理解 (mysql) 多个数据库的情况下,很可能位于在不同的逻辑硬件上)。水平分区是一个不太具体的术语,“分片”是其中的一个子集。再次以 mySQL 为例,mySQL 分区由单个数据库实例处理,该实例对应用程序 100% 透明。分片方法将涉及智能选择哪个实例的代理或应用程序。 根据***“每个单独的分区被称为一个分片或数据库分片。”这与答案中“每个分区构成分片的一部分”的文本有点不同。 您引用的 wiki 文章对这两个术语进行了细微区分。 水平分区通常在模式和数据库服务器的单个实例中按行拆分一个或多个表。 /***/ Sharding 超越了这一点:它以相同的方式对有问题的表进行分区,但它在可能的多个模式实例中执行此操作。 en.wikipedia.org/wiki/… 【参考方案3】:

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

当且仅当您的需求超出单个数据库服务器所能提供的服务范围时,分片才是一个问题。如果您拥有可分片的数据并且对可扩展性和性能有非常高的要求,那么它就是一个很好的工具。我猜想,在我从事软件专业的 12 年中,我遇到过一种可以从分片中受益的情况。这是一种适用性非常有限的先进技术。

此外,未来可能会变得有趣和令人兴奋,例如消除所有潜在性能限制的大型物体“云”,对吧? :)

【讨论】:

你能分享一下你需要分片的情况吗【参考方案4】:

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

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

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

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

【讨论】:

应用层仍然可以创建数据访问逻辑和业务规则的分离。这只是意味着您在“应用层”层中有额外的概念层。【参考方案5】:

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

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

【讨论】:

> - 不是真的。 Google 成立于 1998 年。scholar.google.com 查找 1980 年代的论文,例如“在复制的数据库系统中丢弃过时的信息”……CCA 开发的高可用复制数据 (SHARD) 系统……我记得听人说过谈论当时的分片。【参考方案6】:

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

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

提高可用性。 更容易扩展。 经济性:创建一个由小型计算机组成的网络具有单台大型计算机的能力,成本更低。

您可以在这里阅读更多内容:Advantages of Distributed database

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

您可以将搜索索引划分为 N 个分区,并将每个索引加载到单独的服务器上。如果您查询一台服务器,您将获得 1/Nth 的结果。因此,为了获得完整的结果集,典型的分布式搜索系统使用一个聚合器,它将从每个服务器收集结果并将它们组合起来。聚合器还将查询分发到每个服务器。这个聚合器程序在大数据术语中称为MapReduce。换句话说,分布式系统 = Sharding + MapReduce(虽然还有其他东西)。

下面的视觉表示。

【讨论】:

【参考方案7】:

分片不仅仅是水平分区。 根据wikipedia article,

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

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

还有,

跨多个隔离实例拆分分片需要超过 简单的水平分区。期望的效率提升 会丢失,如果查询数据库需要两个实例 查询,只是为了检索一个简单的维度表。超过 分区,分片因此将大型可分区表拆分为 服务器,而较小的表被复制为完整的单元

【讨论】:

以上是关于什么是分片,为什么它很重要?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP Location 标头中的完全限定 url。为啥它很重要?

啥是分片技术?

以太坊的“分片”是指啥?

以太坊的“分片”是指啥?

分片技术:如何解决区块链的性能问题?

官方文档-分片分配和集群路由