当前位置: 首页 > article >正文

Mongodb分片模式部署

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.kler.cn/a/598070.html

相关文章:

  • CATIA二次开发:基于牛顿迭代法的参数化衰减球体生成系统
  • 【Flask公网部署】采用Nginx+gunicorn解决Flask框架静态资源无法加载的问题
  • ECMAScript、DOM和BOM是个啥(通俗地来讲)
  • Netty——NIO 空轮询 bug
  • Redis + 布隆过滤器解决缓存穿透问题
  • Kafka-1
  • Redis、Memcached应用场景对比
  • 字节DAPO算法:改进DeepSeek的GRPO算法-解锁大规模LLM强化学习的新篇章(代码实现)
  • 数据结构 -- 线索二叉树
  • 针对永磁电机(PMM)的d轴和q轴电流,考虑交叉耦合补偿,设计P1控制器并推导出相应的传递函数
  • 2025.3.17-2025.3.23学习周报
  • 银河麒麟桌面版包管理器(一)
  • vue3 UnwrapRef 与 unref的区别
  • 【从零开始学习计算机科学】软件工程(一)软件工程中的过程模型
  • 安装PrettyZoo操作指南
  • 计算机二级:函数基础题
  • 相控阵雷达的EIRP和G/T
  • 路由工程师大纲-1:路由+AI研究的知识体系与低成本论文方向
  • WPF-实现按钮的动态变化
  • 深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法