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


73

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

Answers:


100

在扩展MongoDB的情况下:

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

  • 分片通过使用分片在多个服务器之间对数据进行分区,可以实现数据写入的水平扩展。到是很重要的选择一个好的片键。例如,碎片键选择不当可能导致仅将数据写入单个碎片上的“热点”。

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

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

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


2
“在mongodb中,每个分片都是一个副本集”-这是不正确的。您可以将各个服务器添加为分片。
塞尔吉奥·图伦采夫

3
@SergioTulentsev:谢谢,澄清了“是”为“可以”。理想情况下,您的分片为副本集,以便进行一些冗余/故障转移。同样,副本集在多个服务器上运行(但从技术上讲,不必这样做)。
Stennie 2012年

1
我建议删除“基于复制的构建”子句。它不基于此。这两件事是完全正交的。:)
Sergio Tulentsev 2012年

1
@SergioTulentsev:在典型的分片MongoDB部署中,您会看到复制与分片一起使用,但是概念确实是正交的。感谢您的反馈..改善了答案。
Stennie 2012年

52

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

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

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


2
很好解释。
mhndev '17

1
这样,Stackoverflow需要更多答案。
dgg32

我认为复制就像将音乐文件保存在不同的文件夹中(而不是分片)
newari

42

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

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

如果要水平缩放Mongo,则需要分片。10gen喜欢调用路由器/配置服务器设置自动分片。在您让应用决定要写入哪个数据库的情况下,可以执行更贫民窟的分片形式。


14
爱“更多贫民窟形式”的短语
scarpacci 2012年

25

分片

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

MongoDB分片

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

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

  • insert 必须包含一个分片密钥,因此,如果它是一个多部分分片密钥,那么我们必须包含整个分片密钥
  • 我们必须了解集合本身上的分片键是什么
  • updateremovefind-如果mongos没有给出碎片关键-那么它不得不广播要求所有包括收集不同的碎片。
  • 对于update-如果我们不指定整个分片密钥,则必须对其进行多次更新,以便它知道需要广播它

11

每当您考虑分片或复制时,都需要考虑编写器/更新操作的上下文。如果您不需要扩展写入,那么复制(因为它相当简单)是您的理想选择。

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


0

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

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

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

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

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

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

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

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


0

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

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

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

请检查文件

谢谢。


0

只是把它放在某个地方...

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

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

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

独立的

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

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

复制集

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

分片集群

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

还有很多更多的补充,但除了单词的图片持有大致相同。


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

vs完成了硬件升级(cpu,ram等)。hs需要更多计算机(但可能是廉价计算机)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.