12

我只是对它们如何工作的分片和复制感到困惑……根据定义

复制:MongoDB 中的副本集是一组维护相同数据集的 mongod 进程。

分片:分片是一种跨多台机器存储数据的方法。

根据我的理解,如果有 75 GB 的数据,然后通过复制(3 台服务器),它将在每台服务器上存储 75GB 数据,这意味着服务器 1 上 75GB,服务器 2 上 75GB 和服务器 3 上 75GB ..(纠正我如果我错了)..通过分片,它将在服务器 1 上存储为 25GB 数据,在服务器 2 上存储 25GB 数据,在服务器 3 上存储 25GB 数据。(对吗?)...但后来我遇到了这条线教程

分片存储数据。为了提供高可用性和数据一致性,在生产分片集群中,每个分片都是一个副本集

由于副本集为 75GB,但分片为 25GB,那么它们如何等效……这让我很困惑……我想我在这方面遗漏了一些很棒的东西。请帮助我。

4

5 回答 5

28

让我们试试这个类比。您正在运行库。

作为任何经营图书馆的人,你在图书馆里都有书。你把所有的书都放在书架上。这很好,但你的图书馆变得如此之好,以至于你的对手想要烧掉它。所以你决定在其他地方多做很多架子。有一个最重要的书架,每当您添加一些新书时,您都会快速将相同的书添加到其他书架。现在,如果竞争对手破坏了一个书架 - 这不是问题,您只需打开另一个书架并将其与书籍一起复制即可。

这是复制(只是用应用程序替换库,用服务器替换书架,用集合中的文档替换书,而您的竞争对手只是服务器上的硬盘故障)。它只是制作数据的额外副本,如果出现问题,它会自动选择另一个主节点。

这个概念可能会有所帮助,如果你

  • 想要扩展读取(但它们可能落后于主要读取)。
  • 做一些不接触主服务器的离线读取
  • 从特定区域的服务器为特定区域提供部分数据
  • 但复制背后的主要原因是数据可用性。所以你是对的:如果你有 75Gb 的数据并用 2 个辅助节点复制它 - 你将获得 75*3 Gb 的数据。

再看一个场景。没有竞争对手,所以你不想复制你的货架。但是现在你有另一个问题。你变得如此优秀以至于一个架子还不够。您决定在许多书架之间分发您的书籍。您决定根据作者姓名在书架之间分配它们(这不是一个好主意,请在此处阅读如何选择分片键)。因此,所有以名称小于 K 开头的东西都放在一个架子上,所有 K 和更多的东西都放在另一个架子上。这是分片

这个概念可以帮助你:

  • 分配工作负载
  • 能够保存比单个服务器更多的数据
  • 做 map-reduce 的事情
  • 在 ram 中存储更多数据以加快查询速度

在这里你是部分正确的。如果您有 75Gb,那么所有服务器上的总和仍然是 75Gb,但不一定平均分配。

但这里只有 sharding 存在问题。现在你的对手出现了,他刚刚来到你的一个架子前烧掉了它。该架子上的所有数据都将丢失。所以你也想复制每个分片。基本上是这样的概念

每个分片都是一个副本集

不是真的。但是如果你正在做分片,你必须为每个分片创建一个复制。因为你拥有的碎片越多,至少有一个死亡的可能性就越大。

于 2013-11-01T03:31:51.737 回答
4

回答 Saad 的后续回答:

您也可以在同一台服务器上同时拥有分片和副本,不推荐这样做。每个服务器在系统中都应该有一个角色。例如,如果您决定拥有 2 个分片并复制 3 次,您最终将拥有 6 台机器。

我知道这听起来可能太贵了,但是您必须记住,这是一种商品硬件,如果您提供的服务已经非常好,您会考虑高可用性并且不适合一台机器,那么这是一个相当便宜的付出的代价(与专用的大型机器相比)。

于 2013-11-03T04:52:17.567 回答
2

我正在写它作为答案,但实际上它是@Salvador Sir 的答案的问题。

就像你说的那样,在分片 75 GB 数据“可能”存储为服务器 1 上的 25 GB 数据、服务器 2 上的 25 GB 和服务器 3 上的 25 GB。(这个分布取决于 Sharding Key)......那么为了防止它丢失,我们还需要复制分片。所以这意味着现在每个服务器都包含它的分片以及其他服务器上存在的其他分片的复制..意味着 Server-1 将拥有

1)它自己的分片。

2) server-2 上的 Shard 复制

3) server-3 上的 Shard 复制

Server-2 和 server-3 也是如此。我是对的吗?..如果是这种情况,那么每台服务器再次拥有 75GB 的数据。对还是错?

于 2013-11-01T05:21:25.630 回答
0

由于我们要制作 3 个分片并复制数据,因此以下是上述问题的解决方案。

r 有分片和副本集,那么在这种情况下,该服务器的故障将导致副本集和分片丢失。

但是,您可以在同一台服务器上拥有分片 1 和副本集(分片 2 和分片 3 的副本),但这是不可取的。

于 2015-04-22T07:51:55.990 回答
0

分片就像数据的分区。假设您有大约 3GB 的数据,并且您定义了 3 个分片,所以每个分片可能需要 1GB 的数据(这实际上取决于分片键) 为什么需要分片?从 3GB 中搜索特定数据的复杂度是在 1GB 数据中搜索的 3 倍。所以它几乎类似于分区。分片有助于快速访问数据。

现在来到副本,假设您拥有相同的 3GB 数据而没有任何复制(这意味着只存在一个数据副本),因此如果该机器或驱动器发生任何事情,您的数据就会消失。所以复制来解决这个问题,假设当你设置数据库时,你给你的复制为 3,这意味着相同的 3GB 数据可用 3 次(所以总大小可以是 9GB 除以每个3GB 副本)。复制有助于故障转移。

于 2017-03-09T08:53:43.673 回答