MongoDB 分片:带示例的分步教程

⚡ 智能摘要

MongoDB 分片将大型数据集分割成分布在多个服务器上的较小子集。 MongoDB 通过实例化,降低单个服务器的 CPU 负载。分片集群结合了分片、配置服务器和路由器,可横向扩展存储和查询吞吐量。

  • 🧩 核心理念: 分片将一个逻辑集合划分到多个分片中,但查询仍然将数据视为一个单一集合。
  • ????️ Cluster 组件: 分片集群需要分片来存储数据,需要配置服务器来存储元数据,还需要路由器来定向客户端命令。
  • ⚙️ 实施流程: 启动配置服务器,启动 mongos 路由器,添加分片,然后在数据库和集合上启用分片。
  • ???? 碎片钥匙: 分片键决定文档的分发方式,因此高基数和均匀的访问模式至关重要。
  • 📈 主要好处: 分片技术可实现水平扩展,分散存储和工作负载,而不是升级单个服务器。

MongoDB 分片:带示例的分步教程

什么是分片 MongoDB?

分片是 MongoDB它将大数据集拆分成多个小数据集 MongoDB 实例。

有时 MongoDB 数据量将非常庞大,针对如此庞大的数据集进行的查询可能会导致服务器 CPU 使用率过高。为了解决这个问题, MongoDB 有分片的概念,基本上就是将数据集拆分到多个 MongoDB 实例。

这个集合可能非常庞大,但实际上它被拆分成多个集合,或者说是分片。从逻辑上讲,所有分片共同构成一个集合。

分片技术的优势 MongoDB

在部署分片集群之前,了解团队采用分片的原因很有帮助。主要优势包括:

  • 水平可扩展性: 数据分布在多个通用服务器上,而不是迫使单台机器变得越来越大。
  • 更高的吞吐量: 读写操作在分片间并行运行,因此集群每秒可以处理更多请求。
  • 更大的存储容量: 所有分片合并后的磁盘可以存储比单个服务器能够存储的数据集大得多的数据集。
  • 高可用性: 当每个分片都部署为副本集时,单个节点的故障不会导致集群崩溃。
  • 均衡负载: 此 MongoDB 负载均衡器会自动重新分配数据块,以防止任何一个分片成为热点。

这些优势共同使得分片成为扩展的标准方法。 MongoDB 超出单个服务器的限制。

如何实现分片

分片是通过使用集群来实现的,集群本质上就是一组…… MongoDB 实例。

碎片的组成部分包括:

  1. 碎片 – 这是最基本的事情,这只不过是一个 MongoDB 保存数据子集的实例。在生产环境中,所有分片都需要成为副本集的一部分。
  2. 配置服务器 - 这是一个 MongoDB 保存集群元数据的实例,基本上是关于各种集群的信息。 MongoDB 用于保存分片数据的实例。
  3. 路由器 - 这是一个 MongoDB 该实例主要负责将客户端发送的命令重定向到正确的服务器。

逐步分片 Cluster 例如:

步骤1) 为配置服务器创建一个单独的数据库。

mkdir /data/configdb

步骤2) 开始 MongoDB 实例处于配置模式。假设我们有一台名为服务器 D 的服务器,它将作为配置服务器。我们需要运行以下命令将该服务器配置为配置服务器。

mongod --configdb ServerD:27019

步骤3) 通过指定配置服务器来启动 mongos 实例。

mongos --configdb ServerD:27019

步骤4) 从 mongo shell 连接到 mongos 实例。

mongo --host ServerD --port 27017

步骤5) 如果您有服务器 A 和服务器 B 需要添加到集群中,请发出以下命令。

sh.addShard("ServerA:27017")
sh.addShard("ServerB:27017")

步骤6) 启用数据库分片。因此,如果我们需要对 Employeedb 数据库进行分片,请执行以下命令。

sh.enableSharding("Employeedb")

步骤7) 为集合启用分片。因此,如果我们需要对 Employee 集合进行分片,请发出以下命令。

sh.shardCollection("Employeedb.Employee", { "Employeeid": 1, "EmployeeName": 1 })

如何选择碎片钥匙 MongoDB

分片键是索引字段或字段集,它 MongoDB 用于决定每个文档存储在哪个分片中。由于键决定了数据的分布,因此在分片部署中,选择合适的键是至关重要的决策。糟糕的键会将数据和流量集中在一个分片上,从而抵消分片的优势。

一把强力碎片钥匙通常具有以下特征:

  • 高基数: 该字段应该有很多可能的值,以便将数据拆分成许多细粒度的块。
  • 低频: 任何单一价值观都不应占据主导地位,否则具有该价值观的文档会堆积在同一个分片上。
  • 非单调变化: 像时间戳这样总是递增的键,会将每次新的写入操作发送到同一个分片,从而造成热点。

MongoDB 支持两种基于键的分片策略。范围分片将数据划分为连续的范围,适用于范围查询;而哈希分片则应用哈希函数将写入操作均匀地分布到各个分片上。团队通常会在写入操作较多时使用哈希分片,而在基于范围的读取操作占主导地位时切换到范围分片。无论选择哪种策略,在最终确定之前,都应该使用实际查询模式测试键,因为一旦数据加载完毕,分片键就很难更改。

分片与复制 MongoDB

分片和复制是互补但又不同的功能。下表列出了它们的区别,以便您正确应用它们。在实际生产集群中,通常会将两者结合使用。

方面 拆分 复制
目的 通过分割数据进行水平缩放 保护数据并确保其可用性
每个节点的数据 数据的一个子集(一个分片) 完整的数据副本
主要益处 更大的存储和吞吐量 容错性和读取扩展性
关键部件 分片、配置服务器、mongos 路由器 主要成员和次要成员

简而言之,分片满足了规模需求,而复制满足了可用性需求,而稳健的部署则将两者结合起来。

常见问题

是的。AI 工具可以分析查询模式和字段基数,从而推荐候选分片键,并对单调字段发出警告。由于分片键后期难以更改,因此在应用任何推荐之前,务必在实际工作负载下进行验证。

是的。基于人工智能的监控可以 trac通过分析数据增长、CPU负载和查询延迟,可以预测单个服务器何时会不堪重负。它能指出分片的最佳时机,但工程师在采取行动前应确认容量规划。

范围分片将数据分割成连续的值范围,这有利于范围查询,但可能导致数据块大小不均匀。哈希分片通过对密钥进行哈希处理,将写入操作均匀地分布到各个分片上,从而改善写入分布,但代价是降低了范围扫描的效率。

是的。在数据库上启用分片,确保在选定的分片键上存在索引,然后在命名空间上运行 sh.shardCollection()。 MongoDB 开始自动将现有文档分块分发到可用分片上。

总结一下这篇文章: