MongoDB 分片集群搭建实践及实现原理介绍

概述

在大数据时代,数据量的增大使得单机存储已经无法满足需求,因此出现了分布式存储。MongoDB 也不例外,它大力推崇的分布式存储方式是分片集群。本文将介绍 MongoDB 分片集群的搭建方法及其实现原理。

分片集群是什么

MongoDB 分片集群是指将一个大的数据库分散到多个 shard(分片)上,实现数据的分布式存储,同时也解决了单机存储的瓶颈问题。在分片集群中,每一个 shard 都是一个完整的 MongoDB 实例,负责存储某一部分数据。而 Mongos(MongoDB 路由器)负责将所有数据的查询请求路由到对应的 shard 上。如下图:

整个集群由三个部分组成:

  • Config Server
  • Shard
  • Mongos

Config Server 存储了整个集群的配置,每个 shard 负责存储一个片段数据,而 Mongos 指导应用程序的查询请求路由到合适的 shard 上。

搭建 MongoDB 分片集群

1. 确认环境

  • 确认各个节点能够互相通信,建议使用内网,提高稳定性和性能;
  • 确认每个节点都安装了 MongoDB;
  • 文章中使用的 MongoDB 版本为 4.4.8。

2. 启动 Config Server

在 MongoDB 官方文档 (https://docs.mongodb.com/v4.4/tutorial/deploy-shard-cluster/) 中,提供了启动 Config Server 的脚本:

------ ----------- --------- ------------- --------- ------------------ ------ ----- -------- -----------------------------------------------

其中,--replSet 指定了集群名称为 configReplSet,--bind_ip 指定了 bind 的 IP 地址,--port 指定了端口号,--dbpath 指定了存储实例数据的目录。需要注意的是,此处的目录需要是一个共享目录,因为 Config Server 是集群的基础架构,必须高可用。如下是启动 Config Server 的示例命令:

------ ----------- --------- ------------- --------- ----------------------------------------- ------ ----- -------- -----------------------------------------------

3. 启动 Shard

在 MongoDB 中,每个 shard 是一个完整的 MongoDB 实例。因此,启动 shard 与单节点启动 MongoDB 时的过程是相同的。添加 --shardsvr 选项启动 shard。如下是启动 shard 的示例命令:

----- ----------------
------ ---------- --------- ------------- --------- ------------------ ------ ----- -------- -----------------------------------------------------

4. 启动 Mongos

在 MongoDB 官方文档 (https://docs.mongodb.com/v4.4/tutorial/deploy-shard-cluster/) 中,提供了启动 Mongos 的脚本:

------ ---------- ------------------------------------------------------------- --------- ------------------ ------ -----

其中,--configdb 指定了 Config Server 的地址。如下是启动 Mongos 的示例命令:

------ ---------- ------------------------------------------------------------------------- --------- ------------- ------ -----

5. 添加 shard

在 Mongos 中添加 shard:

------- ------------------------------------------------

其中,shardReplSet1 是 shard 集合名称,192.168.1.105:27017 是 shard 所在节点的地址。添加 shard 时,可以添加多个 shard。

6. 启用分片

分片集群搭建完成后,还需要启用分片。在 MongoDB 操作时,需要指定分片键,从而将数据分散到不同的 shard 上。下面的示例代码中使用了 name 作为分片键:

------- -------------------------
------- ------------------------------- -------- ----------

其中,sh.enableSharding("test") 指定启用分片,并为数据库 test 开启分片功能。sh.shardCollection("test.user", {"name": "hashed"}) 指定了集合 user 采用分片策略,name 字段采用哈希分片策略。

实现原理

在 MongoDB 分片集群中,负责路由查询请求的是 Mongos,而 Config Server 存储整个集群的配置。对于一个查询请求来说,Mongos 首先需要通过 Config Server 获取 shard 的地址,然后将查询请求路由到对应的 shard 上。

查询流程

Mongos 接收到查询请求后,会向 Config Server 查询目标集合的 chunks,每个 chunk 都表示一个连续的区间。之后 Mongos 会将查询请求的 shard 键值根据 chunk 区间的范围进行定位,进而查询到对应的 shard 上。

写入流程

在 MongoDB 中,写入和查询的流程不同。在写入时,Mongos 首先通过 Config Server 获取目标集合的 chunks 信息,之后确定需要将数据写入到哪个 shard 上,因为每个 chunk 都会关联一个 primary shard(默认作为数据写入的 shard),读写该 chunk 的所有操作都发生在 primary shard 上。Mongos 根据目标 chunk 的 primary shard 将数据写入到对应的 shard 上,并在 chunk 区间上更新元数据,使得数据可以在整个集群内可见。

指导意义

通过本文,我们介绍了 MongoDB 分片集群的搭建方法及其实现原理,它可以应用于存储大规模数据的场景,并可以扩展性地支持更多数据的增长。在实际应用中,还需要注意数据备份、集群的高可用性以及监控等问题。总结一下,MongoDB 分片集群提供了:

  • 分布式存储能力,可以通过横向扩展节点数又提高扩展性;
  • 支持大规模数据存储,满足企业级数据存储需求;
  • 高可用性和容错能力,支持集群的自动容错和故障转移。

示例代码

查询数据

--------------------- -------

插入数据

----------------------- ------ ------ ----

更新数据

----------------------- ------- -------- ------- -----

删除数据

----------------------- -------

结语

本文介绍了 MongoDB 分片集群的搭建方法及其实现原理,以及示例代码,希望能够为读者提供参考和帮助。在实际应用中,需要针对实际业务需求进行适当的规划和调整。如果有不足或错误之处,还请读者批评指正。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65a201efadd4f0e0ffa1598e


猜你喜欢

  • Sequelize 错误信息解决办法

    Sequelize 是一款 Node.js 下的 ORM 框架,用于操作关系型数据库。在使用 Sequelize 的过程中,会遇到各种错误信息,因为我们的程序总会有一些不可预知的因素出现,例如无法连接...

    9 个月前
  • 在 AngularJS 中使用 RxJS 实现 Websocket 实时数据交互

    前言 在现代 Web 应用中,实时数据交互已经成为了许多场景的必要需求,而 Websocket 作为一种流行的实现方式,可以使用它来处理实时数据交互的需求。而使用 AngularJS 和 RxJS 的...

    9 个月前
  • Flexbox 在响应式设计中常见问题及解决方式

    Flexbox 是一种用于布局的 CSS3 模块,它可以使得在 Web 开发中的布局变得更加灵活和高效。它可以帮助我们轻松地创建响应式设计,让页面可以适配不同的屏幕尺寸和设备类型。

    9 个月前
  • 使用 Mocha 和 Chai 测试 Node.js 应用程序中间件的完整指南

    随着 Node.js 和前端技术的日渐发展,越来越多的 Node.js 应用程序需要使用中间件来处理各种需求。中间件可以帮助我们处理数据、验证用户身份、调用外部 API 等等。

    9 个月前
  • RESTful API 的 GET 方法与 POST 方法有哪些区别?

    简介 RESTful API 是一种基于 HTTP 协议设计的 Web API,作为目前互联网上最为流行的 API 设计风格之一,它具有轻量、可扩展、简单易用等特点,在云计算时代背景下也变得越来越重要...

    9 个月前
  • Redis 如何实现 LUA 脚本

    Redis 是一个轻量级的 NoSQL 数据库,它提供了多种数据类型和丰富的命令,可以用作缓存、队列、键值数据库等多种用途。同时,Redis 也支持使用 LUA 脚本进行自定义操作,这在某些场景下可以...

    9 个月前
  • CSS Reset 制作模板效果及代码实现

    在前端开发中,经常需要处理浏览器间的兼容性问题,其中之一便是不同浏览器对 CSS 样式的渲染存在差异,这时候 CSS Reset 便可以派上用场。在本文中,我们将深入探讨 CSS Reset 的实现原...

    9 个月前
  • 如何在 Vue.js 中使用 HTTP 拦截器技术

    在 Vue.js 中使用 HTTP 拦截器技术可以方便地对请求进行统一处理,比如添加全局请求头、处理异常情况等。本篇文章将详细介绍如何在 Vue.js 中使用 HTTP 拦截器技术,让前端开发者能够更...

    9 个月前
  • 教你如何在 Node.js 中使用 HTTPS 模块

    简介 HTTPS 是一个在网络传输中加密数据的协议,用于保护敏感信息的传输安全。在前端开发中,很多场景中需要使用到 HTTPS 来保护数据的安全性。下面我们就来介绍如何在 Node.js 中使用 HT...

    9 个月前
  • 遇到 Next.js 页面打包后体积过大怎么办?

    遇到 Next.js 页面打包后体积过大怎么办? Next.js 是一个基于 React 的轻量级框架,可以方便地搭建 SSR 应用。在开发过程中,我们经常会遇到页面打包后体积过大的问题,而这个问题尤...

    9 个月前
  • Redux 数据流程与应用状态的维护技巧

    什么是 Redux Redux 是一种 JavaScript 应用程序的状态容器,它可以管理应用程序的状态并控制它们是如何被处理的。Redux 非常适合于大型应用程序,因为它可以帮助开发者更好地组织和...

    9 个月前
  • Mongoose:如何获取或返回两个 date 时间之间的所有日期

    Mongoose:如何获取或返回两个 date 时间之间的所有日期 在前端开发过程中,日期时间经常会用到。有时候需要获取或者返回两个 date 时间之间的所有日期,这个场景在开发中也是比较常见的。

    9 个月前
  • Cherrypy 内置 Server-sent 事件的使用方法及其优点

    在前端开发中,实时性数据的展示一直是一个重要的需求,即使是如今的单页面应用也不能避免。为了提供实时数据变化的展示,传统的做法是长轮询或者 Websocket,但是这两种方式都有自己的弊端。

    9 个月前
  • 使用 TailwindCSS 创建响应式图像

    当今的 Web 开发中,响应式设计是必不可少的。而响应式图像是其中一个非常重要的方面。在本文中,我们将学习如何使用 TailwindCSS 来创建响应式图像。 TailwindCSS 简介 Tailw...

    9 个月前
  • 如何解决 Cypress 测试时存在的跨域问题

    在进行前端自动化测试时,我们可能会用到 Cypress 这个工具。但是,在使用 Cypress 进行测试时,由于浏览器的同源策略,会出现一些跨域问题,这会导致我们的测试用例无法正确运行,影响测试结果。

    9 个月前
  • webpack 如何提高页面加载速度?

    在现代前端开发中,Webpack 是一个非常流行的打包工具,它可以将各种资源文件打包成一个或多个文件,并优化这些文件的大小和加载顺序,从而提高页面的加载速度。本文将会介绍如何使用 Webpack 来提...

    9 个月前
  • 使用无障碍 API:如何在应用中控制焦点顺序

    在设计应用程序时,为了让所有用户都能够访问、浏览和使用它们,我们需要考虑到无障碍性(Accessibility)。无障碍 API 是一种用于开发无障碍应用程序的 API,它允许开发人员控制应用中焦点的...

    9 个月前
  • 深入理解 Java 虚拟机性能优化

    Java 虚拟机(Java Virtual Machine,简称 JVM)是 Java 语言的核心,它是 Java 程序运行的基础。在开发 Java 应用程序时,JVM 的性能优化是必不可少的环节。

    9 个月前
  • PWA 落地时的坑及解决方法总结

    前言 PWA(Progressive Web Apps),中文名为“渐进式 Web 应用”,是一种可以像原生应用一样运行的 Web 应用程序。其主要特点是具备离线缓存、消息推送、本地存储等诸多优点,使...

    9 个月前
  • Node.js 开始尝试实现 Promise/A

    什么是 Promise Promise 是一种异步编程的解决方案,它可以更优雅地处理异步函数的执行结果。Promise 可以在异步函数的回调函数中返回一个对象,代表这个异步操作的未来结果。

    9 个月前

相关推荐

    暂无文章