繁体   English   中英

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

[英]In Mongo what is the difference between sharding and replication?

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

在扩展 MongoDB 的背景下:

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

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

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

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

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

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

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

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

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

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

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

分片

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

MongoDB 分片

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

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

  • insert必须包含一个分片键,所以如果它是一个多部分的分片键,我们必须包含整个分片键
  • 我们必须了解集合本身的分片键是什么
  • 对于updateremovefind - 如果没有为mongos提供分片键 - 那么它将必须将请求广播到涵盖集合的所有不同分片。
  • 对于update - 如果我们没有指定整个分片键,我们必须使它成为一个多重更新,以便它知道它需要广播它

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

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

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

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

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

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

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

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

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

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

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

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

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

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

独立的

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

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

副本集

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

分片集群

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

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


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

vs 已完成升级硬件(cpu、ram 等)。 hs 需要更多的电脑(但可能是便宜的电脑)。

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

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

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

请检查文档

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM