让我们试试这个类比。您正在运行库。
作为任何经营图书馆的人,你在图书馆里都有书。你把所有的书都放在书架上。这很好,但你的图书馆变得如此之好,以至于你的对手想要烧掉它。所以你决定在其他地方多做很多架子。有一个最重要的书架,每当您添加一些新书时,您都会快速将相同的书添加到其他书架。现在,如果竞争对手破坏了一个书架 - 这不是问题,您只需打开另一个书架并将其与书籍一起复制即可。
这是复制(只是用应用程序替换库,用服务器替换书架,用集合中的文档替换书,而您的竞争对手只是服务器上的硬盘故障)。它只是制作数据的额外副本,如果出现问题,它会自动选择另一个主节点。
这个概念可能会有所帮助,如果你
- 想要扩展读取(但它们可能落后于主要读取)。
- 做一些不接触主服务器的离线读取
- 从特定区域的服务器为特定区域提供部分数据
- 但复制背后的主要原因是数据可用性。所以你是对的:如果你有 75Gb 的数据并用 2 个辅助节点复制它 - 你将获得 75*3 Gb 的数据。
再看一个场景。没有竞争对手,所以你不想复制你的货架。但是现在你有另一个问题。你变得如此优秀以至于一个架子还不够。您决定在许多书架之间分发您的书籍。您决定根据作者姓名在书架之间分配它们(这不是一个好主意,请在此处阅读如何选择分片键)。因此,所有以名称小于 K 开头的东西都放在一个架子上,所有 K 和更多的东西都放在另一个架子上。这是分片。
这个概念可以帮助你:
- 分配工作负载
- 能够保存比单个服务器更多的数据
- 做 map-reduce 的事情
- 在 ram 中存储更多数据以加快查询速度
在这里你是部分正确的。如果您有 75Gb,那么所有服务器上的总和仍然是 75Gb,但不一定平均分配。
但这里只有 sharding 存在问题。现在你的对手出现了,他刚刚来到你的一个架子前烧掉了它。该架子上的所有数据都将丢失。所以你也想复制每个分片。基本上是这样的概念
每个分片都是一个副本集
不是真的。但是如果你正在做分片,你必须为每个分片创建一个复制。因为你拥有的碎片越多,至少有一个死亡的可能性就越大。