我只是对Sharding和复制它们的工作原理感到困惑。根据定义
复制:MongoDB中的副本集是一组维护相同数据集的mongod进程。
分片:分片是一种在多台机器上存储数据的方法。
根据我的理解,如果有75 GB的数据然后通过复制(3台服务器),它将在每台服务器上存储75GB数据意味着服务器1上75GB,服务器2上75GB和服务器3上75GB。 (纠正我,如果我错了)..并通过分片将其存储为服务器-1上的25GB数据,服务器-2上的25Gb数据和服务器-3上的25GB数据。(对吗?)......但后来我遇到了本教程中的这一行
Shards存储数据。提供高可用性和数据 一致性,在生产分片集群中,每个分片都是副本 设置
由于副本集的容量为75GB,但是碎片的容量为25GB,那么它们是如何相当的......这让我感到很困惑......我想我错过了一些很棒的东西。请帮助我。
答案 0 :(得分:27)
让我们试试这个比喻。您正在运行该库。
任何正在运行图书馆的人都会在图书馆中拥有图书。您将所有书籍存放在书架上。这很好,但你的图书馆变得非常好,你的对手想要烧它。因此,您决定在其他地方制作许多额外的货架。有一个最重要的架子,无论何时添加一些新书,您都可以快速将相同的书籍添加到其他书架。现在,如果竞争对手摧毁了一个架子 - 这不是问题,你只需打开另一个并将其与书籍一起复制即可。
这是复制(只需将库替换为应用程序,带有服务器的书架,带有文档的书籍,并且您的竞争对手只是服务器上的硬盘故障)。它只是制作了额外的数据副本,如果出现问题,它会自动选择另一个主数据库。
如果你
,这个概念可能会有所帮助看看另一个场景。没有竞争对手,所以你不想复制你的货架。但是现在你还有另外一个问题。你变得如此优秀以至于一个架子还不够。您决定在多个货架之间分发您的图书。您决定根据作者姓名在架子之间分发它们(这不是一个好主意,并在此处阅读如何select sharding key)。因此,所有以名称少于K开头的东西都会进入一个架子,一切就是K,而更多就是另一个架子。这是分片。
这个概念可以帮助您:
这里你部分正确。如果你有75Gb,那么在所有服务器上总和仍然会有75 Gb,但它不一定是平均分配的。
但是这里只有分片的问题。现在你的竞争对手出现了,他只是来到你的一个货架上烧了它。该架子上的所有数据都将丢失。所以你也希望复制每个分片。基本上是
的概念每个分片都是副本集
不是真的。但是如果要进行分片,则必须为每个分片创建一个复制。因为你拥有的碎片越多,至少有一个碎片的概率就越大。
答案 1 :(得分:4)
回答萨阿德的后续回答:
此外,您可以在同一台服务器上同时拥有分片和副本,不建议这样做。每个服务器在系统中应该只有一个角色。例如,如果您决定使用2个分片并将其复制3次,那么最终将有6台机器。
我知道这可能听起来太贵了,但你必须记住这是一个商品硬件,如果你提供的服务已经很好,你考虑高可用性而不适合一台机器,那么这就是一个相当便宜的代价(与专用的一台大机器相比)。
答案 2 :(得分:2)
我正在写这个答案,但实际上这是对@Salvador Sir的回答的问题。
就像你说的那样,在分片75 GB中,数据“可以”存储为服务器1上的25GB数据,服务器2上25GB,服务器3上25Gb。 (此分布取决于Sharding Key)...然后为了防止它丢失,我们还需要复制分片。所以这意味着现在每个服务器都包含它的分片以及其他服务器上存在的其他分片的复制。意思是Server-1将具有
1)它自己的碎片。
2)服务器-2上存在Shard的复制
3)服务器-3上存在Shard的复制
与Server-2和server-3相同。我是对的吗?..如果是这种情况,那么每个服务器再次拥有75GB的数据。是对还是错?
答案 3 :(得分:0)
因为我们想要制作3个分片并复制数据,所以以下是解决上述问题的方法。
r有shard和副本集然后在那种情况下该服务器的失败将导致副本集和碎片的丢失。
但是,您可以在同一台服务器上设置分片1和副本集(分片2和分片3的副本),但这不可取。
答案 4 :(得分:0)
分片就像分区数据。 假设您有大约3GB的数据,并且您定义了3个分片,因此每个分片可能需要1GB的数据(而且它真的取决于分片键) 为什么需要分片?从3GB中搜索特定数据比在1GB数据中搜索要复杂3倍。所以它几乎与分区类似。分片有助于快速访问数据。
现在来到Replica,让我们说你有相同的3GB数据没有任何复制(这意味着只存在一个数据副本)所以如果该机器或驱动器发生任何事情,你的数据就会消失。所以复制就可以解决这个问题,让我们说当你设置数据库时,你已经将你的Replication复制为3,这意味着相同的3GB数据可用3次(所以总大小可以是9GB除以每个3GB拷贝)。复制有助于故障转移。