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

时间:2012-07-20 00:31:01

标签: mongodb

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

8 个答案:

答案 0 :(得分:79)

在缩放MongoDB的上下文中:

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

  • sharding 允许通过使用分片键在多个服务器之间对数据进行分区来水平扩展数据写入。这对choose a good shard key很重要。例如,糟糕的分片键选择可能导致数据的“热点”仅写在单个分片上。

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

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

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

答案 1 :(得分:33)

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

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

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

答案 2 :(得分:27)

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

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

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

答案 3 :(得分:16)

拆分

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

MongoDB sharding

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

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

  • insert必须包含分片键,因此如果它是多部分分片键,则必须包含整个分片键
  • 我们要了解收集本身的分片键是什么
  • 对于updateremovefind - 如果mongos没有给出分片密钥 - 那么它必须将请求广播到所有不同的碎片都涵盖了这个系列。
  • 对于update - 如果我们不指定整个分片键,我们必须使其成为多重更新,以便它知道它需要广播它

答案 4 :(得分:7)

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

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

答案 5 :(得分:0)

复制和分片均可(单独或一起)用于MongoDB安装的水平扩展。

共享是MongoDB的用于满足数据增长需求的解决方案。分片可将数据记录存储在多个服务器上,以提高读写查询的吞吐量,特别是对于非常大的数据集。 分片群集中的任何服务器都可以响应读取或写入操作,从而大大加快了查询响应。

复制是MongoDB的解决方案,用于为MongoDB安装提供稳定性,备份和灾难恢复。此过程跨多个服务器复制并同步副本数据集。如果一台服务器脱机,这可以防止停机。

任何辅助服务器都可以响应读取查询,但是只有主服务器将执行写操作。然后,写入操作的结果将传播到辅助服务器。

方案1:容错 在这种情况下,用户将在MongoDB安装中存储计费数据。这些数据对于用户的业务而言是至关重要的,即使服务器崩溃或脱机也需要24/7全天候可用。

MongoDB复制是对此用户的最佳解决方案。通过复制,整个数据集将在多个服务器上进行镜像。如果服务器发生故障或脱机,则群集中的其他服务器将接管。

方案2:高性能 在这种情况下,用户正在运行一个从MongoDB数据库运行的社交网站。随着社交网络的发展,MongoDB数据集也随之增长。用户看到查询时间和页面负载增加到可接受的程度。用户的MongoDB安装获得重大的性能提升至关重要。

设置分片的MongoDB集群是此用户的最佳解决方案。分片群集将分解用户的数据集并将其一部分存储在单独的辅助服务器上。每个辅助服务器都可以响应其部分数据的读写查询,这大大增加了安装的响应时间

答案 6 :(得分:0)

MongoDB Atlas是数据库中的一项服务。它支持三个主要的云提供商,例如Azure,AWS和GCP。在云环境中,我们通常谈论高可用性和可伸缩性。在Atlas中,“集群”可以是副本集或分片集群。 这两个解决了我们云环境的高可用性和可伸缩性功能。

通常,群集是用于完成特定任务的一组服务器。因此,分片群集用于在多台计算机之间存储数据,以满足数据增长的需求。随着数据大小的增加,单台计算机可能不足以存储数据,也无法提供可接受的读写吞吐量。分片群集支持底层云环境的水平可伸缩性。

MongoDB中的副本集是一组维护相同数据集的mongod进程。副本集提供冗余和高可用性,并且是所有生产部署的基础。在副本中,一个节点是接收所有写操作的主节点。所有其他实例,例如第二实例,都将应用来自第一实例的操作,以便它们具有相同的数据集。副本集主要关注数据的可用性。

请检查documentation

谢谢。

答案 7 :(得分:0)

只要把它放在某处...

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

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

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

standalone

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

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

replica set

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

sharded cluster

显而易见:需要权衡的是更复杂的体系结构。 新颖:配置服务器(同样,另一个配置文件)。

要添加的很多,但是除了文字外,图片的内容基本相同。


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

vs完成了硬件升级(cpu,ram等)。她需要更多的计算机(但可能是便宜的计算机)。