Mongodb分片模式部署

news2025/3/26 16:29:23

MongoDB 分片集群部署教程

在这里插入图片描述

1. 概述

MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片,MongoDB 可以将数据分布在多个服务器上,从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。

介绍

分片集群中主要由三个部分组成,即分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(Config Server)组成。其中,分片服务器有三个,即Shard1、Shard2、Shard3;路由服务器有两个,即Mongos1和Mongos2;配置服务器有三个,即主、副、副。

分片服务器

即MongoDB实例(即mongod,用Shard表示),分片服务器是实际存储数据的组件,持有完整数据集中的一部分,每个分片服务器都可以是一个MongoDB实例,也可是一组MongoDB实例组成的集群(副本集)。从MongoDB 3.6开始,必须将分片部署为副本集,这样具有更好的容错性。

路由服务器

即mongos,路由服务器主要提供客户端应用程序与分片集群交互的接口,所有请求都需要通过路由服务器进行协调工作。路由服务器实际上就是一个消息分发请求中心,它负责把客户端应用程序对应的数据请求转发到对应的分片服务器上。应用程序将查询、存储、更新等请求原封不动地发送给路由服务器。路由服务器询问配置服务器操作分片服务器需要获取哪些元数据,然后连接相应的分片服务器进行相关操作,最后将各个分片服务器的响应进行合并,返回给客户端应用程序。
生产环境中,一个分片集群通常会有多个路由服务器,一方面可以解决多个客户端同时请求,从而达到负载均衡的效果;另一方面可以解决当路由服务器宕机时导致整个分片集群无法使用的问题。

配置服务器

即Config Server。在生产环境中,通常需要多个配置服务器,因为它存储了分片集群的元数据,并且这些数据是不允许丢失的。因此,需要配置多个配置服务器以防止数据丢失,尽管其中一台分片服务器宕机,我们还有其它配置服务器,从而保证MongoDB分片集群依然能够正常工作。从MongoDB 3.4版本开始,配置服务器必须部署副本集,因此我们需要配置三个配置服务器组成的副本集。
配置服务器存储着分片集群的持久化元数据,而路由服务器存储着分片集群的非持久化元数据,这些数据均为内存缓存的数据。当路由服务器初次启动或关闭重启时,就会从配置服务器中加载分片集群的元数据。若是配置服务器的信息发生变化,则会通知所有路由服务器更新自己的状态,这样路由服务器就能继续准确的协调客户端与分片集群的交互工作。
在这里插入图片描述

2. 环境准备

在开始部署之前,确保已经准备好以下环境:

  • 三台服务器(例如:nosql01, nosql02, nosql03)
  • MongoDB 安装包
  • 每台服务器上已创建 user_mongo 用户
虚拟机名称服务器名称IP地址Shard1Shard2Shard3mongosConfig Server
NoSQL_1nosql01192.168.121.13427018主节点27020仲裁节点27019副节点2702127022主节点
NoSQL_2nosql02192.168.121.13527019副节点27018主节点27020仲裁节点2702127022副节点
NoSQL_3nosql03192.168.121.13627020仲裁节点27019副节点27018主节点27022副节点

(1)/opt/servers/mongodb_demo/shardcluster/:存放分片集群的相关配置文件目录、日志文件目录和数据目录等内容。
(2)/opt/servers/mongodb_demo/shardcluster/configServer/configFile:存放配置服务器的配置文件。
(3)/opt/servers/mongodb_demo/shardcluster/configServer/data:存放配置服务器的数据文件。
(4)/opt/servers/mongodb_demo/shardcluster/configServer/logs:存放配置服务器的日志文件。
(5)/opt/servers/mongodb_demo/shardcluster/shard/configFile:存放分片服务器的配置文件。
(6)/opt/servers/mongodb_demo/shardcluster/shard/shard1_data:存放分片服务器1的数据文件。
(7)/opt/servers/mongodb_demo/shardcluster/shard/shard2_data:存放分片服务器2的数据文件。
(8)/opt/servers/mongodb_demo/shardcluster/shard/shard3_data:存放分片服务器3的数据文件。
(9)/opt/servers/mongodb_demo/shardcluster/shard/logs:存放分片服务器的日志文件。
(10)/opt/servers/mongodb_demo/shardcluster/mongos/configFile:存放路由服务器的配置文件。
(11)/opt/servers/mongodb_demo/shardcluster/mongos/logs:存放路由服务器的日志文件。

3. 部署 MongoDB

3.1 上传并解压 MongoDB 安装包

  1. 将 MongoDB 安装包上传到 nosql01 服务器的 /opt/software/ 目录下。
  2. 修改安装包的用户和用户组权限为 user_mongo
  3. 解压安装包到 /opt/servers/mongodb_demo/shardcluster/ 目录下:
    $ tar -zxvf /opt/software/mongodb-linux-x86_64-rhel70-4.2.2.tgz -C /opt/servers/mongodb_demo/shardcluster/
    
  4. 重命名解压后的目录为 mongodb
    $ mv mongodb-linux-x86_64-rhel70-4.2.2/ mongodb
    

3.2 分发 MongoDB 安装包

mongodb 目录分发到 nosql02nosql03 服务器:

$ scp -r /opt/servers/mongodb_demo/shardcluster/mongodb/ user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/mongodb/
$ scp -r /opt/servers/mongodb_demo/shardcluster/mongodb/ user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/mongodb/

4. 部署 Config Server

4.1 创建配置文件

  1. nosql01/configServer/configFile/ 目录下创建配置文件 mongodb_config.conf
    $ touch /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf
    
  2. 编辑 mongodb_config.conf,添加以下内容:
    # 数据文件存放路径
    dbpath=/opt/servers/mongodb_demo/shardcluster/configServer/data
    
    # 日志文件路径
    logpath=/opt/servers/mongodb_demo/shardcluster/configServer/logs/config_server.log
    
    # MongoDB 服务监听的端口号
    port=27022
    
    # 绑定 IP 地址,指定 MongoDB 服务监听的网络接口
    bind_ip=nosql01
    
    # 以追加方式写入日志文件
    logappend=true
    
    # 以守护进程方式运行 MongoDB
    fork=true
    
    # 最大同时连接数
    maxConns=5000
    
    # 复制集名称
    replSet=configs
    
    # 声明这是一个集群的 Config Server
    configsvr=true
    

4.2 分发配置文件

将配置文件分发到 nosql02nosql03

$ scp /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/configServer/configFile/
$ scp /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/configServer/configFile/
  1. 修改 nosql02nosql03 上的 bind_ip 为各自的 IP 地址。

4.3 启动 Config Server

在三台服务器上启动 Config Server:

$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf

4.4 配置 Config Server 副本集

在任意一台服务器上初始化副本集:

$ ./mongo --host nosql01 --port 27022
> rs.initiate()
configs:SECONDARY> rs.add('nosql02:27022')
configs:PRIMARY> rs.add('nosql03:27022')

5. 部署 Shard

5.1 创建配置文件

  1. nosql01/shard/configFile/ 目录下创建三个配置文件 mongodb_shard1.conf, mongodb_shard2.conf, mongodb_shard3.conf

    $ touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf
    $ touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf
    $ touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf
    
  2. 编辑 mongodb_shard1.conf,添加以下内容:

    # 数据文件存放路径
    dbpath=/opt/servers/mongodb_demo/shardcluster/shard/shard1_data
    
    # 日志文件路径
    logpath=/opt/servers/mongodb_demo/shardcluster/shard/logs/shard1.log
    
    # MongoDB 服务监听的端口号
    port=27018
    
    # 绑定 IP 地址,指定 MongoDB 服务监听的网络接口
    bind_ip=nosql01
    
    # 以追加方式写入日志文件
    logappend=true
    
    # 以守护进程方式运行 MongoDB
    fork=true
    
    # 最大同时连接数
    maxConns=5000
    
    # 复制集名称
    replSet=shard1
    
  3. 类似地,编辑 mongodb_shard2.confmongodb_shard3.conf,分别修改 dbpath, logpath, port, bind_ip, 和 replSet 参数。

5.2 启动 Shard

在三台服务器上启动 Shard:

$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf
$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf
$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf

5.3 配置 Shard 副本集

在每台服务器上初始化副本集:

$ ./mongo --host nosql01 --port 27018
> rs.initiate()
shard1:SECONDARY> rs.add('nosql02:27019')
shard1:PRIMARY> rs.addArb('nosql03:27020')

6. 部署 mongos

6.1 创建配置文件

  1. nosql01/mongos/configFile/ 目录下创建配置文件 mongodb_mongos.conf
    $ touch /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf
    
  2. 编辑 mongodb_mongos.conf,添加以下内容:
    # 日志文件路径
    logpath=/opt/servers/mongodb_demo/shardcluster/mongos/logs/mongos.log
    
    # 以追加方式写入日志文件
    logappend=true
    
    # MongoDB 服务监听的端口号
    port=27021
    
    # 绑定 IP 地址,指定 MongoDB 服务监听的网络接口
    bind_ip=nosql01
    
    # 以守护进程方式运行 MongoDB
    fork=true
    
    # 指定 Config Server 地址
    configdb=configs/nosql01:27022,nosql02:27022,nosql03:27022
    
    # 最大同时连接数
    maxConns=20000
    

6.2 分发配置文件

将配置文件分发到 nosql02

$ scp /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/mongos/configFile/
  1. 修改 nosql02 上的 bind_ipnosql02

6.3 启动 mongos

nosql01nosql02 上启动 mongos:

$ ./mongos -f /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf

7. 启动分片功能

7.1 登录 mongos

nosql01 上登录 mongos:

$ ./mongo --host nosql01 --port 27021

7.2 添加 Shard

向分片集群中添加 Shard:

mongos> use gateway
mongos> sh.addShard("shard1/nosql01:27018,nosql02:27019,nosql03:27020")
mongos> sh.addShard("shard2/nosql01:27020,nosql02:27018,nosql03:27019")
mongos> sh.addShard("shard3/nosql01:27019,nosql02:27020,nosql03:27018")

8. 分片基本操作

8.1 设置 chunk 大小

块大小的作用
数据分片:

MongoDB 将分片集合中的数据划分为多个块(chunk),每个块是一个连续的范围(range)。

默认情况下,每个块的大小为 64MB。

数据均衡:

当某个分片上的块数量过多或数据分布不均匀时,MongoDB 会自动触发数据迁移(chunk migration),将块从一个分片迁移到另一个分片,以实现数据均衡。

性能影响:

块大小会影响数据迁移的频率和性能。较小的块可以更精细地分布数据,但会增加迁移的频率;较大的块会减少迁移频率,但可能导致数据分布不均匀。

默认块大小

MongoDB 的默认块大小是 64MB。这个值在大多数场景下是一个合理的折衷方案。

查看 chunk 大小:

mongos> use config
mongos> db.settings.findOne({ _id: "chunksize" });

将 chunk 大小设置为 1MB:

mongos> use config
mongos> db.settings.save({"_id":"chunksize","value":1})

注意
在 MongoDB 5.0 及以上版本中,save() 方法已被弃用,不再支持。你需要使用 insertOne() 或 updateOne() 方法来插入或更新文档。

如果 config.settings 集合中还没有 chunksize 的记录,可以使用 insertOne() 插入新文档:

use config;
db.settings.insertOne({ _id: "chunksize", value: 1 });

如果 config.settings 集合中已经有 chunksize 的记录,可以使用 updateOne() 更新文档:

use config;
db.settings.updateOne(
  { _id: "chunksize" }, // 查询条件
  { $set: { value: 1 } }, // 更新操作
  { upsert: true } // 如果不存在则插入
);

8.2 模拟写入数据

创建数据库 school 并向集合 user 中插入 50000 条文档:

mongos> use school
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}

8.3 启用数据库分片

启用数据库 school 的分片功能:

mongos> use gateway
mongos> sh.enableSharding("school")

8.4 对集合进行分片

为集合 user 创建索引并进行分片:

mongos> use school
mongos> db.user.createIndex({"id":1})
mongos> sh.shardCollection("school.user",{"id":1})

9. 验证分片集群

9.1 查看分片信息

查看数据库 school 中集合 user 的分片信息:

mongos> sh.status()

9.2 验证数据分布

通过查询不同分片上的数据,验证数据是否均匀分布:

mongos> db.user.getShardDistribution()

10. 安全认证(可选)

10.1 创建 KeyFile

  1. 生成 KeyFile:
    $ openssl rand -base64 756 > /opt/servers/mongodb_demo/shardcluster/keyfile
    $ chmod 400 /opt/servers/mongodb_demo/shardcluster/keyfile
    
  2. 将 KeyFile 分发到所有服务器:
    $ scp /opt/servers/mongodb_demo/shardcluster/keyfile user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/
    $ scp /opt/servers/mongodb_demo/shardcluster/keyfile user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/
    

10.2 修改配置文件

在所有服务器的配置文件中添加以下内容:

# 启用安全认证
security:
  keyFile: /opt/servers/mongodb_demo/shardcluster/keyfile

10.3 重启集群

重启所有 MongoDB 服务以应用安全认证配置。

10.4 创建管理员用户

在 mongos 上创建管理员用户:

mongos> use admin
mongos> db.createUser({user: "admin", pwd: "admin123", roles: ["root"]})

10.5 验证安全认证

以安全认证模式登录 mongos:

$ ./mongo --host nosql01 --port 27021 -u admin -p admin123 --authenticationDatabase admin

11. 集群关闭

11.1 Mongosr、Shard、Configserver依次关闭

在关闭集群之前先关闭平衡器(Balancer)

$ ./mongo --host nosql01 --port 27021 
mongos> use gateway
mongos> sh.stopBalancer()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElementPlus 快速入门

目录 前言 为什么要学习 ElementPlus&#xff1f; 正文 步骤 1 创建 一个工程化的vue 项目 ​2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装&#xff0c;选择包管理器 3 运行该命令 demo(案例1 &#xff09; 步骤 …

C++输入输出流第二弹:文件输入输出流and字符串输入输出流

目录 文件输入输出流&#xff08;重点&#xff09; 文件输入流 文件输入流对象的创建 对测试代码进行解读&#xff1a; 1. 代码核心逻辑 2. 读取过程详解 3. 关键特性总结 4. 注意事项 5. 完整流程示例 这里既然提到了 >> 流&#xff0c;那么就对他进行进一步的…

TCP传输---计算机网络

TCP结构 源端口和目标端口&#xff1a;标识通信的应用程序。序列号&#xff1a;标记发送的数据段的顺序序号。确认号 ( ACK)&#xff1a;确认接收到的数据序号。标志位&#xff1a;控制连接状态&#xff0c;包括 SYN&#xff08;同步&#xff09;、ACK&#xff08;确认&#xf…

基于TweenMax和SVG的炫酷弹性进度条动画特效

这是一款效果非常炫酷的基于TweenMax和SVG的炫酷弹性进度条动画特效。该弹性进度条特效在点击触发按钮之后&#xff0c;按钮会变形为进度条&#xff0c;然后一个滑块在它上面滑动&#xff0c;就像重物滑过绳子的感觉&#xff0c;非常有创意。 在线演示 使用方法 该弹性进度条效…

python面试高频考点(深度学习大模型方向)

1. python中yeild和return的区别&#xff1f; 2. 介绍一下pytohn中的上下文管理器&#xff1f; 在Python中&#xff0c;上下文管理器&#xff08;Context Manager&#xff09; 是一种通过 with 语句管理资源的协议&#xff0c;确保资源&#xff08;如文件、数据库连接、线程锁…

六、重学C++—深入探索new delete

上一章节&#xff1a; 五、重学C—类(封装继承)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146458436?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/m…

Unity代码热更新和资源热更新

知识点来源&#xff1a;人间自有韬哥在&#xff0c;hybridclr,豆包 目录 一、代码热更新1.代码热更新概述2.HybridCLR 二、资源热更新1.资源热更新概述2.AB包2.1.AB包的加载2.2.卸载AB包2.3.加载AB包依赖包2.4.获取MD52.5.生成对比文件2.6.更新AB包 3.Addressable3.1.AssetRef…

于纷扰中寻静谧:正念观照的智慧之旅

在现代社会的快节奏浪潮中&#xff0c;我们仿若被裹挟前行的浮萍&#xff0c;生活的压力与信息的洪流冲刷着内心的宁静&#xff0c;焦虑与迷茫如影随形。而正念观照&#xff0c;恰似一叶扁舟&#xff0c;能引领我们在心灵的海洋中回归自我&#xff0c;探寻那片澄澈之境。 正念…

环境评价分析中土地利用现状图的制作方法

在环境评价中&#xff0c;土地利用现状图是重要的基础图件&#xff0c;用于分析项目区域的土地利用类型、分布格局及其生态环境特征。 以下是制作土地利用现状图的详细步骤和方法&#xff1a; 一、前期准备工作 确定制图范围和比例尺 根据评价范围确定制图区域边界 常用比例…

编程题记录3

九宫幻方 题目链接&#xff1a;https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&second_category_id3&tags%E7%9C%81%E8%B5%9B&tag_relationintersection 先旋转、镜像得到所有的情况&#xff0c;可以发现情况是可以暴力得出的。…

sql语句给表添加一个递增列

SSMS–》视图-》数据库(表)-》新建查询 ALTER TABLE [表名] DROP COLUMN ID ALTER TABLE [表名] ADD ID INT IDENTITY(1,1)执行完以上操作&#xff0c;会在表的最后一列添加一个自增字段 接下来如何把最后一个字段放到第一个字段呢&#xff1f; 假如sqlserver 表test 有以下…

vue java 实现大地图切片上传

文章目录 一、项目背景二、页面三、代码1.前端2.mock-i18n.js文件3.xx.js文件定义方法4.配置文件 application.properties5.后端方法 四、易错点易错点1&#xff1a;前端要进行分片切割&#xff0c;然后再分片上传。易错点2&#xff1a;后端配置文件要配置。易错点3&#xff1a…

langchain+ollama+deepseek的部署(win)

ANACONDA 安装 官网&#xff1a;Download Anaconda Distribution | Anaconda 配置系统环境 在系统变量中配置 检查是否配置成功 通过 cmd 窗口输入&#xff1a; conda info 如图&#xff1a;表示成功 配置你的虚拟环境 二、安装 ollama allama 安装 官网地址&#xff1a…

deepseek实战教程-第四篇开放平台接口文档使用

第二篇讲解了如何本地安装大模型&#xff0c;然后编写一个基于jsspringboot的项目&#xff0c;通过页面实现对话的功能。实际上&#xff0c;上面的demo用到是deepseek提供的接口&#xff0c;那么deepseek共提供了多少接口呢&#xff1f;这就要讨论到deepseek的接口库了&#xf…

一站式电脑工具箱,功能全面且实用

小明工具箱是一款集成了系统设置、维护工具、实用工具、图像处理等四大类工具的电脑工具箱&#xff0c;涵盖了上百种实用工具&#xff0c;能够满足用户在文件管理、文本处理、系统优化、图像处理等多方面的需求。 初次使用&#xff0c;需双击软件&#xff0c;便会自动将工具解压…

那些正常的动态规划

文章目录 前言动态规划到底是啥&#xff1f; 线性dp最长上升子序列子集和子序列和子串的区别内容分析 最大上升子序列例题1——[NOIP2004 提高组] 合唱队形分析 最长公共子序列最长公共子串 平面dp例题2——[NOIP2000 提高组] 方格取数分析 例题3——[NOIP2008 提高组] 传纸条分…

华为交换相关

端口模式 &#xff08;1&#xff09;access&#xff1a;只能属于单个VLAN&#xff0c;一般用于连接计算机端口 &#xff08;2&#xff09;trunk&#xff1a;端口允许多个VLAN通过&#xff0c;可以接收和发送多个VLAN报文&#xff0c;默认情况下只有管理VLAN不携带标签信息 &…

Chrome Performance 面板完全指南:从卡顿到丝滑的终极调试术

1.写在前面 前端性能调试是优化网页加载速度和运行效率的关键步骤&#xff0c;Chrome DevTools 的 Performance 面板 是核心工具; 2.Performance 面板使用步骤 ★ 基础 打开面板 在 Chrome 中按 F12 → 切换到 Performance 标签页。 开始录制 方式一&#xff1a;点击 ⚫️ 圆…

JDK 24:Java 24 中的新功能

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…

ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程

ventoy启动服务器版iso镜像&#xff0c;注意看server名称&#xff0c;跟之前desktop版ubuntu不一样。没有gui界面。好&#xff0c;进入命令行界面。语言彻底没汉化了&#xff0c;选英文吧&#xff0c;别的更看不懂。 跟桌面版ubuntu类似&#xff0c;选择是否精简系统&#xff0…