86

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

4

8 回答 8

121

在扩展 MongoDB 的上下文中:

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

  • sharding允许通过使用shard key跨多个服务器对数据进行分区来水平扩展数据写入。选择一个好的 shard key 很重要。例如,片键选择不当可能会导致数据“热点”仅写入单个片上。

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

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

从客户端应用程序的角度来看,您还可以控制复制/分片交互,特别是:

于 2012-07-20T02:11:25.373 回答
66

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

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

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

于 2016-03-27T01:34:55.353 回答
47

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

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

如果你想水平扩展 Mongo,你会分片。10gen 喜欢调用路由器/配置服务器设置自动分片。可以在让应用程序决定写入哪个数据库的情况下进行更加贫民窟形式的分片。

于 2012-07-20T00:36:38.480 回答
28

分片

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

MongoDB分片

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

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

  • insert必须包含一个分片键,所以如果它是一个多部分的分片键,我们必须包含整个分片键
  • 我们必须了解集合本身的分片键是什么
  • 对于update, remove, find- 如果mongos没有给出分片键 - 那么它将不得不将请求广播到覆盖集合的所有不同分片。
  • 对于update- 如果我们不指定整个分片键,我们必须使它成为一个多重更新,以便它知道它需要广播它
于 2016-09-06T18:14:30.367 回答
15

每当您考虑分片或复制时,您都需要考虑写入/更新操作的上下文。如果您不需要扩展写入,那么复制,因为它相当简单,对您来说是一个不错的选择。

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

于 2013-11-20T17:43:56.307 回答
3

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

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

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

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

独立的

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

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

副本集

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

分片集群

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

还有很多要补充的,但除了文字之外,图片的内容大致相同。


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

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

于 2020-10-22T09:28:50.527 回答
1

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

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

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

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

场景 1:容错 在此场景中,用户将计费数据存储在 MongoDB 安装中。这些数据对用户的业务至关重要,并且需要 24/7 全天候可用,即使服务器崩溃或脱机也是如此。

MongoDB 复制是该用户的最佳解决方案。通过复制,整个数据集被镜像到多台服务器上。如果服务器出现故障或脱机,集群中的其他服务器将接管。

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

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

于 2020-09-06T17:09:04.060 回答
0

MongoDB Atlas 是一种数据库即服务。它支持 Azure、AWS 和 GCP 等三大云提供商。在云环境中,我们通常谈论高可用性和可扩展性。在 Atlas 中,“集群”可以是副本集或分片集群。这两个解决了我们云环境的高可用性和可扩展性特性。

一般来说,集群是一组用于完成特定任务的服务器。所以分片集群用于跨多台机器存储数据,以满足数据增长的需求。随着数据大小的增加,单台机器可能不足以存储数据,也无法提供可接受的读写吞吐量。分片集群支持底层云环境的水平可扩展性。

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

请检查文档

谢谢你。

于 2020-09-10T06:20:39.927 回答