在Mongo中,分片和复制有什么区别?

nic*_*ine 60 mongodb

复制似乎比分片简单得多,除非我错过了分片实际上试图实现的好处.它们都不提供水平缩放吗?

Ste*_*nie 84

在缩放MongoDB的上下文中:

  • 复制会创建数据的其他副本,并允许自动故障转移到另一个节点.如果您可以读取可能不是最新的数据,则复制可能有助于水平扩展读取.

  • 通过使用分片在多个服务器之间划分数据,分片允许数据写入的水平扩展.到是很重要的选择一个好的片键.例如,糟糕的分片键选择可能导致数据的"热点"仅写在单个分片上.

分片环境确实增加了复杂性,因为MongoDB现在必须管理分片之间的分发数据和请求 - 添加了额外的配置和路由过程来管理这些方面.

通常组合复制和分片以创建分片群集,其中每个分片都由副本集支持.

从客户端应用程序的角度来看,您还可以对复制/分片交互进行一些控制,尤其是:

  • @SergioTulentsev:谢谢,澄清"是"为"可以".理想情况下,您的分片*应该是副本集,因此存在一些冗余/故障转移.同样,副本集*应该*在多个服务器上运行(但从技术上讲,不必). (3认同)
  • 你可以澄清说:"在mongodb中,每个碎片都是一个复制品,或者你是一个白痴......" (3认同)
  • "在mongodb中,每个碎片都是一个副本集" - 这不是真的.您可以将单个服务器添加为分片. (2认同)

MrK*_*urt 36

复制是一种主要是传统的主/从设置,数据同步到备份成员,如果主要故障,其中一个可以取代它.这是一个相当简单的工具.它主要用于冗余,但您可以通过添加副本集成员来扩展读取.这有点复杂,但对某些应用程序效果很好.

通常,Sharding位于复制之上.MongoDB中的"Shards"只是副本集,前面有一个叫做"路由器"的东西.您的应用程序将连接到路由器,发出查询,并将决定将事物转发到哪个副本集(分片).它比单个副本集复杂得多,因为您需要处理路由器和配置服务器(这些服务器会跟踪存储在哪里的数据).

如果你想水平缩放Mongo,你就会分片.10gen喜欢调用路由器/配置服务器设置自动分片.你可以做一个更多的贫民窟形式的分片,你可以让应用程序决定写入哪个数据库.

  • 喜欢"更多贫民窟形式"这句话 (13认同)

小智 34

考虑到您的硬盘上有很棒的音乐收藏,您可以根据不同文件夹中的发行年份按逻辑顺序存储音乐.您担心如果驱动器发生故障,您的收集将会丢失.因此,您将获得一个新磁盘,并偶尔复制整个集合,保持相同的文件夹结构.

分片>>将音乐文件保存在不同的文件夹中

复制>>将您的集合同步到其他驱动器

  • 很好的解释。 (3认同)
  • Stackoverflow 需要更多这种风格的答案。 (3认同)

xam*_*mir 18

拆分

Sharding是一种在多个服务器之间拆分大型集合的技术.当我们分片时,我们部署多个mongod服务器.而在前面,mongos这是一个路由器.该应用程序与此路由器通信.然后该路由器与各种服务器进行通信mongod.应用程序和mongos通常位于同一服务器上.我们可以mongos在同一台机器上运行多个服务.还建议保留多个mongods(一起称为副本集)的集合,而不是mongod每个服务器上的一个单独.副本集使数据在几个不同的实例中保持同步,这样如果其中一个出现故障,我们就不会丢失任何数据.逻辑上,每个副本集可以被看作是一个分片.它对应用程序是透明的,MongoDB选择分片的方式是我们选择分片.

MongoDB分片

假设,对于student集合,我们将其stdt_id作为分片键,或者它可以是复合键.而mongos服务器,它是一个基于范围的系统.因此,基于stdt_id我们作为分片键发送的内容,它会将请求发送到正确的mongod实例.

那么,作为开发人员,我们需要真正了解什么呢?

  • insert 必须包含一个分片键,所以如果它是一个多分区的分片键,我们必须包含整个分片键
  • 我们要了解收集本身的分片键是什么
  • update,remove,find-如果mongos没有给出碎片关键-那么它不得不广播要求所有包括收集不同的碎片.
  • 对于update- 如果我们不指定整个分片键,我们必须使它成为多重更新,以便它知道它需要广播它


Say*_*ald 9

无论何时考虑分片或复制,都需要在编写器/更新操作的上下文中进行思考.如果您不需要扩展写入,那么复制(因为它相当简单)对您来说是一个不错的选择.

另一方面,如果您的工作负载主要是更新/写入,那么在某些时候您将遇到写入瓶颈.如果写入请求,Mongo会阻止其他写入请求.那些写请求阻塞直到第一个请求完成.如果要缩放此写入并希望并行化,则需要实现分片.


小智 5

只是为了把这个放在某个地方......

运行 mongo 的最基本方法是作为独立服务器。

  • 您编写配置(文件或 cli 选项)
  • 使用启动服务器mongod

对于这张照片,我没有包括“客户”。检查下一张。

独立的

  • 副本集是一组完全按照上述方式使用不同的配置文件进行初始化的服务器。
  • 为了链接它们,我们连接到其中之一,并初始化副本集模式。
  • 它们将相互镜像(在最常见的配置中)。该系统保证了数据的高可用性。

副本集的初始化在红色边框框中表示。

副本集

  • 分片并不是复制数据,而是对数据进行碎片化。
  • 每个数据片段称为块并进入不同的分片。分片 = 每个副本集。
  • “主”服务器,运行mongos而不是mongod. 这是一个用于客户端查询的路由器。

分片集群

显而易见:权衡是更复杂的架构。 新颖性:配置服务器(同样,不同的配置文件)。

还有更多内容需要补充,但除了文字之外,图片内容基本相同。


甚至 mongoDB 也建议在进行分片之前仔细研究您的案例。在水平缩放 (hs)之前至少进行一次垂直缩放 (vs) 可能是一个好主意。

vs 已完成硬件升级(CPU、RAM 等)。hs 需要更多的计算机(但可能是便宜的计算机)。