【问题标题】:Difference between Sharding And Replication on MongoDBMongoDB 上分片和复制的区别
【发布时间】:2013-11-12 06:07:39
【问题描述】:

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

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

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

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

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

由于副本集为 75GB,但分片为 25GB,那么它们如何等效...这让我很困惑...我想我错过了一些很棒的东西。请帮帮我。

【问题讨论】:

    标签: mongodb replication sharding


    【解决方案1】:

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

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

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

    这个概念可能对你有所帮助

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

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

    这个概念可能对你有所帮助:

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

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

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

    每个分片都是一个副本集

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

    【讨论】:

    • 哇...先生..太好了...多么清晰的解释,它消除了我的大部分困惑,但又造成了更多的困惑...我在下面写。请看一下。
    • @Salvador Dali,很好的答案。非常感谢。这是否意味着所有节点将始终具有 __almost 相同数量的 __ 存储,因为它们都包含相同数量的数据。并且每个集合将具有相同的复制因子等效数量的副本集? stackoverflow.com/questions/64601659/…
    【解决方案2】:

    回答 Saad 的后续回答:

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

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

    【讨论】:

    • 我完全明白了你的解释......非常感谢您的详细回复。
    【解决方案3】:

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

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

    1) 它自己的分片。

    2) 服务器 2 上的 Shard 复制

    3) 服务器 3 上的 Shard 复制

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-16
          • 1970-01-01
          • 2011-01-09
          • 1970-01-01
          • 2019-03-26
          • 2012-07-19
          • 2021-08-21
          • 1970-01-01
          • 2017-08-29
          相关资源
          最近更新 更多