【问题标题】:In Mongo what is the difference between sharding and replication?在 Mongo 中,分片和复制有什么区别?
【发布时间】:2012-07-19 06:05:00
【问题描述】:

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

【问题讨论】:

标签: mongodb


【解决方案1】:

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

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

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

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

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

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

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

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

还有更多要添加,但除了文字之外,图片的内容大致相同。


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

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

【讨论】:

    【解决方案2】:

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

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

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

    请查看documentation

    谢谢。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        分片

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

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 解释得很好。
          • Stackoverflow 需要更多这种风格的答案。
          • 我认为复制就像将你的音乐文件保存在不同的文件夹中(不是分片)
          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            在扩展 MongoDB 的上下文中:

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

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

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

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

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

            【讨论】:

            • “在 mongodb 中,每个分片都是一个副本集”——这不是真的。您可以将单个服务器添加为分片。
            • @SergioTulentsev:谢谢,将“是”澄清为“可以”。理想情况下,您的分片应该是一个副本集,因此存在一些冗余/故障转移。类似地,副本集应该在多个服务器上运行(但从技术上讲,并非必须如此)。
            • 我建议删除“基于复制构建”子句。它不是建立在它之上的。这两件事是完全正交的。 :)
            • @SergioTulentsev:在典型的分片 MongoDB 部署中,您会看到复制与分片一起使用,但这些概念确实是正交的。感谢您的反馈.. 已经改进了答案。
            【解决方案8】:

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

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

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

            【讨论】:

            • 喜欢“更多的贫民窟形式”这句话
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-19
            • 2011-08-16
            • 2013-02-23
            • 2015-11-23
            • 2013-02-13
            • 2011-04-26
            相关资源
            最近更新 更多