Answers:
分片只是数据库“水平分区”的另一个名称。您可能需要搜索该术语以使其更清楚。
从维基百科:
水平分区是一种设计原则,其中数据库表的行分别保存,而不是按列拆分(就规范化而言)。每个分区构成分片的一部分,而分片又可以位于单独的数据库服务器或物理位置上。优点是减少了每个表中的行数(这减小了索引大小,从而提高了搜索性能)。如果分片基于数据的某些实际方面(例如,欧洲客户与美国客户),则可以轻松,自动地推断适当的分片成员身份,并且仅查询相关的分片。
有关分片的更多信息:
首先,每个数据库服务器都是相同的,具有相同的表结构。其次,将数据记录在逻辑上拆分到分片数据库中。与分区数据库不同,每个完整的数据记录仅存在于一个分片中(除非有用于备份/冗余的镜像),而所有CRUD操作都仅在该数据库中执行。您可能不喜欢所使用的术语,但这确实代表了将逻辑数据库组织成较小部分的另一种方式。
更新:您不会破坏MVC。确定正确的数据存储碎片的工作将由您的数据访问层透明地完成。在那里,您将必须根据用于分片数据库的标准来确定正确的分片。(因为您必须根据应用程序的某些具体方面手动将数据库分片为一些不同的分片。)然后,在从数据库中加载数据或将数据存储到数据库中或将数据存储到数据库中时,必须使用正确的分片。
也许这个带有Java代码的示例使它在实际情况下如何工作更加清晰了(这与Hibernate Shards项目有关)。
要解决“ why sharding
”问题:它主要仅适用于具有大量数据的超大型应用程序。首先,它有助于最小化数据库查询的响应时间。其次,您可以使用更便宜的“低端”计算机来托管数据,而不是使用一台大型服务器来托管数据,而这可能不再足够了。
如果对本地位置受到严格限制的DBMS进行查询(例如,用户仅使用'where username = $ my_username'触发选择),则将所有以AM开头的用户名放在一台服务器上,并将所有来自NZ的用户名有意义在另一。这样,您就可以对某些查询进行线性缩放。
长话短说:分片基本上是将表分配到不同服务器上的过程,以平衡两个服务器上的负载。
当然,实际情况要复杂得多。:)
分片是水平(按行)数据库分区,而垂直(按列)数据库分区是Normalization。它将大型数据库分为较小,更快,更易于管理的部分,这些部分称为数据分片。它是一种实现分布式系统的机制。
为什么我们需要分布式系统?
您可以在此处阅读更多内容:分布式数据库的优势
分片如何帮助实现分布式系统?
您可以将搜索索引划分为N个分区,并将每个索引加载到单独的服务器上。如果查询一台服务器,将得到结果的1 / N。因此,为了获得完整的结果集,典型的分布式搜索系统使用聚合器,该聚合器将累积来自每个服务器的结果并将其合并。聚合器还将查询分发到每个服务器上。该聚合程序在大数据术语中称为MapReduce。换句话说,分布式系统=分片+ MapReduce(尽管也有其他事情)。
分片最初是由Google工程师创造的,您可以看到在Google App Engine上编写应用程序时分片使用非常频繁。由于查询可以使用的资源数量有严格的限制,并且查询本身也有严格的限制,因此不仅鼓励分片,而且架构几乎强制执行分片。
可以使用的另一个分片方式是减少对数据实体的争用。当构建可伸缩系统以监视那些经常写入的数据时,这一点尤其重要,因为它们始终是瓶颈。一个好的解决方案是分拆该特定实体并写入多副本,然后读取总数。GAE的“分片计数器”示例:http : //code.google.com/appengine/articles/sharding_counters.html
分片不仅仅是水平分区。根据维基百科的文章,
水平分区通常在模式和数据库服务器的单个实例中按行拆分一个或多个表。如果存在某种明显的,健壮的,隐式的方式来标识特定行将在哪个分区中找到,而无需首先搜索索引(例如经典),则可以通过减小索引大小(从而减少搜索工作量)来提供优势。 “ CustomersEast”和“ CustomersWest”表的示例,其邮政编码已经指示了将在何处找到它们。
分片不仅限于此:它以相同的方式对有问题的表进行分区,但可以跨模式的多个实例进行此操作。明显的优势是,现在可以将大型分区表的搜索负载分散在多个服务器(逻辑或物理)上,而不仅仅是同一逻辑服务器上的多个索引。
也,
在多个隔离的实例之间拆分碎片不仅需要简单的水平分区。如果查询数据库需要查询两个实例,而只是检索一个简单的维表,则效率的期望提高将丢失。因此,除了分区之外,分片还可以在服务器之间拆分大型可分区表,而较小的表则作为完整的单元进行复制