MongoDB副本集部署完整教程

 更新时间:2025年09月07日 09:41:39   作者:南瓜呱呱  
本文主要介绍如何部署一个三成员MongoDB副本集,包括主节点和两个副本节点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一般而言,副本集主要成员有三个:主节点,副本节点,仲裁节点

按照官方推荐方案,我们搭建一个三成员的副本集,这个副本集由一个主结点和两个副本结点组成。

这里采用三台虚拟机进行部署:node1(主节点),node2(副本节点),node3(副本节点)

一、环境准备

按照跳转文章介绍的方式,分别在三台服务器上创建user-mongo用户,并将目录/opt/module/,mongodb_dcmo/更改为用户user_mongo的权限,使用该用户进行MongoDB副本集安装与启动
        在三台服务器目录/opt/module/mongodb_demo/下创建目录/replicaset/data/和目录/replicaset/logs/,用于存放MongoDB副本集的数据和MongoDB副本集的日志文件,具体操作命令如下:

mkdir replicaset
cd replicaset/
mkdir data
mkdir logs
cd logs
touch mongodb.log

二、副本集的安装与启动

1.安装副本集

首先在node1上安装好mongodb,通过解压MongoDB安装包的方式安装MongoDB,将MongoDB安装包解压目录/opt/module/mongo_demo/replicaset/下,重命名为mongodb后

replicaset目录下包含data(数据)、logs(日志)和mongodb(MongoDB安装目录)文件夹,并且这些文件夹的用户权限都是user_mongo.

再将服务器node1中/opt/module/mongodb_demo/replicaset/目录下的所有内容通过scp命令分发到服务器node2和服务器node3上

2.启动副本集

分别在三台服务器node1、node2和node3的/opt/module/mongodb_demo/replicaset/mongodb/bin目录下以副本集模式启动MongoDB,这里以服务器node1为例进行操作

node1:

cd /opt/module/mongodb_demo/replicaset/mongodb/bin

副本集模式启动mongodb: 

./mongod --replSet xxx --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27017 --bind_ip node1 --logappend --fork

上述启动MongoDB命令中,参数replSet指定MongoDB副本集名称【xxx-自己命名】,同一副本集须指定相同名称;

  • 参数dbpath指定MongoDB副本集数据存放目录(不能与其他MongoDB服务冲突);
  • 参数logpath指定MongoDB服务副本集日志目录;
  • 参数port指定MongoDB副本集启动占用的端口号(不能与其他MongoDB冲突);
  • 参数bind_ip开启远程连接,使用当前服务器主机名;
  • 参数logappend指定以追加的方式写入日志;
  • 参数fork指定MongoDB后台启动。 

node2:

cd /opt/module/mongodb_demo/replicaset/mongodb/bin
./mongod --replSet itcast --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27018 --bind_ip node2 --logappend --fork

node3:

cd /opt/module/mongodb_demo/replicaset/mongodb/bin
./mongod --replSet itcast --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27018 --bind_ip node3 --logappend --fork

3.副本集的初始化

 登录mongodb客户端:

./mongosh --host node1 --port 27017

这里新版本用的mongosh 老版本用mongo即可

当出现命令输入提示符>,证明在服务器node1中成功登录MongoDB客户端!
接着在MongoDB客户端中执行副本集初始化操作:

rs.initiate()

接着查看副本集成员状态:

rs.status()

当前副本集只有一个成员角色,即主结点。接下来,我们将其他两台服务器node2和node3中的MongoDB以副本结点的角色添加到副本集中(添加结点的操作必须在主结点
进行),具体命令如下:

rs.add("node2:27017")
rs.add("node3:27017")

执行完添加副本结点命令后,客户端会返回添加的副本结点的相关信息,如信息中字段“OK”的值为1,则证明副本结点添加成功!

此时,在服务器node2和node3上登录MongoDB客户端,查看当前服务器在副本集中的角色分配情况:

./mongosh --host node2 --port 27017

 

./mongosh --host node3 --port 27017

4.同步副本文档

通过向MongoDB副本集主结点写入文档,验证其他副本结点是否成功同步主结点写入的文档内容,具体操作步骤如下。
(1)在服务器node1(副本集主结点)的MongoDB客户端写入一条文档,具体命令如下: 

      

  通过上述操作,成功在副本集主结点的数据库test中创建集合user并插入一条文档。
(2)在服务器node2(副本结点)中登录MongoDB客户端,查看数据库test下的集合user中是否存在与主结点一致的文档内容,具体命令如下:

执行查看集合中的文档命令时,客户端会返回Error的错误信息,这是因为默认情况下
副本结点不能读取副本集中的内容,因此我们需要设置开启副本结点的读取权限,然后才可
以查看副本集中的内容,具体命令如下:       

注:MongoDB 旧版本中,rs.secondaryOk() 用于允许从 secondary 副本集成员读取数据。但在较新版本(MongoDB 4.2 及以上),官方改进了 读偏好(Read Preference) 机制,推荐使用 setReadPref() 来设置读取策略。

db.getMongo().setReadPref("primaryPreferred")

或在 MongoDB shell 连接时直接指定:

mongo --host xxx --readPreference=primaryPreferred

  • "primary":默认值,只从 primary 读取。
  • "secondary":只从 secondary 读取(适用于查询压力大的情况)。
  • "primaryPreferred"优先从 primary 读取,但如果 primary 不可用,则从 secondary 读取(推荐)。
  • "secondaryPreferred":优先从 secondary 读取,primary 不可用时才会使用 primary。
  • "nearest":从最近的节点读取(不考虑 primary/secondary

5.配置副本集成员

1.查看当前副本集配置

首先,您已经使用了 rs.conf() 命令查看了当前的副本集配置,以下是您已经提供的配置内容:cfg = rs.conf();

2.将服务器nosql02由仲裁结点更改为副本结点

修改配置

将 node2 修改为 仲裁节点arbiterOnly: true,并且将 priority 设置为 0)。

将 node3 修改为 延迟节点secondaryDelaySecs: Long("0"),并且将 priority 设置为 0,hidden 设置为 true)。

cfg.members[1].arbiterOnly = true;               // 将 node2 改为仲裁节点
cfg.members[1].priority = 0;                     // 设置优先级为 0,避免 node2 成为主节点

提交配置更改

rs.reconfig(cfg);

 
但由于不允许直接修改节点的 arbiterOnly 字段,需要先删除该节点,然后再重新添加它作为仲裁节点。

1.从副本集中删除 node2: 使用 rs.remove() 命令从副本集配置中删除 node2

rs.remove("node2:27017");

2.重新添加 node2 作为仲裁节点: 通过 rs.add() 命令将 node2 以仲裁节点的身份重新添加到副本集中。这里将 arbiterOnly 设置为 true,并将其优先级设置为 0。 

rs.add({ _id: 1, host: "node2:27017", arbiterOnly: true, priority: 0 });

成功成为仲裁节点!

也有别的方法,我没试过,应该莫问题,自己尝试

3.将服务器nosql03中延迟结点修改为正常的副本结点

修改配置:

cfg.members[2].priority = 0;                     // 设置优先级为 0,避免 node3 成为主节点
cfg.members[2].hidden = true;                    // 将 node3 设置为隐藏节点,确保不会被选为主节点

【注】出现问题解决方法【新版】 

错误提示 BSON field 'MemberConfig.slaveDelay' is an unknown field 表示 slaveDelay 这个字段在 MongoDB 配置中是不被识别的,导致 rs.reconfig(cfg) 执行失败。事实上,MongoDB 中并没有 slaveDelay 字段用于副本集成员的配置。

正确的字段名:

在 MongoDB 中,应该使用 secondaryDelaySecs 来设置副本集成员的延迟时间,而不是 slaveDelaysecondaryDelaySecs 字段用于设置副本节点相对于主节点的延迟时间,单位是秒。

解决方法:

将 slaveDelay 更改为 secondaryDelaySecs,并重新配置副本集:

cfg.members[2].secondaryDelaySecs = 3600;  // 设置延迟时间为3600秒

cfg.members[3].priority = 1;  // 设置优先级为 1
cfg.members[3].hidden = false;  // 取消隐藏节点
cfg.members[3].secondaryDelaySecs = 0;  // 设置延迟为 0 秒

成功了,将服务器nosql03中延迟结点修改为正常的副本结点,即优先级为1,非隐藏和延迟为0秒。

6.安全认证

1.在服务器node3创建新的数据目录和日志文件,以副本集模式启动新的MongoDB,此MongoDB使用27016端口,并指定keyFile文件。

(1)创建存放keyfile文件的目录,文件写入密钥并修改权限

mkdir -p /opt/module/mongodb_demo/replicaset/key
touch /opt/module/mongodb_demo/replicaset/key/keyfile
openssl rand -base64 756 -out /opt/module/mongodb_demo/replicaset/key/keyfile
chmod 600 /opt/module/mongodb_demo/replicaset/key/keyfile

 (2)同步文件

scp -r /opt/module/mongodb_demo/replicaset/key user_mongo@node1:/opt/module/mongodb_demo/replicaset/
scp -r /opt/module/mongodb_demo/replicaset/key user_mongo@node2:/opt/module/mongodb_demo/replicaset/

(3)创建全局管理用户

登录客户端后,切换到数据库admin,添加全局用户

use admin;
db.createUser({user:"wurui",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});

验证用户是否创建成功:

执行完上述命令后客户端返回信息“1”,则证明用户创建成功。

创建新data和新log --我这里命名data103文件和log103文件,log3文件中添加空文件mongo.log

赋予权限:

sudo chown -R user_mongo:user_mongo /opt/module/mongodb_demo/replicaset/data103/
sudo chown -R user_mongo:user_mongob /opt/module/mongodb_demo/replicaset/logs103/

启动安全认证:

./mongod --replSet wurui --keyFile /opt/module/mongodb_demo/replicaset/key/keyfile --dbpath=/opt/module/mongodb_demo/replicaset/data103/ --logpath=/opt/module/mongodb_demo/replicaset/logs103/mongo.log --port 27016 --bind_ip node3 --logappend -fork

node1查看状态:

2.在副本集主结点将服务器node3上新启动的MongoDB以副本结点的形式添加到副本集

主节点中:

rs.add("node3:27016")

出现ok1-->成功成功! 

到此这篇关于MongoDB副本集部署完整教程的文章就介绍到这了,更多相关MongoDB副本集部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Mongodb参数说明与常见错误处理的总结

    关于Mongodb参数说明与常见错误处理的总结

    这篇文章主要给大家介绍了关于Mongodb参数说明与常见错误处理的相关资料,文中通过一步步的步骤介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • 为MongoDB数据库注册windows服务

    为MongoDB数据库注册windows服务

    这篇文章介绍了为MongoDB数据库注册windows服务的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • mongodb增量备份脚本的实现和原理详解

    mongodb增量备份脚本的实现和原理详解

    MongoDB本身不支持增量备份,所以这里介绍我找到的方法,下面这篇文章主要给大家介绍了关于mongodb增量备份脚本的实现和原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • 解决MongoDB6.0报错:"mongo"不是内部或外部命令,也不是可运行的程序或批处理文件

    解决MongoDB6.0报错:"mongo"不是内部或外部命令,也不是可运行的程序或批处理文件

    这篇文章主要给大家介绍了关于解决MongoDB6.0报错:"mongo"不是内部或外部命令,也不是可运行的程序或批处理文件的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • MongoDB的基础知识简介

    MongoDB的基础知识简介

    这篇文章主要介绍了MongoDB的基础知识简介,需要的朋友可以参考下
    2017-05-05
  • mongoDB中聚合函数java处理示例详解

    mongoDB中聚合函数java处理示例详解

    这篇文章主要给大家介绍了关于mongoDB中聚合函数java处理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mongoDB具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • MongoDB索引机制详解

    MongoDB索引机制详解

    与MySQL 一样,"索引" 在 MongoDB 中也是用于优化查询的一种数据结构,通过创建适当的索引,MongoDB 能够快速地定位符合查询条件的文档,从而减少了扫描文档的数量,提高了查询性能。本文详细介绍了MongoDB 的索引机制,感兴趣的同学可以参考阅读
    2023-04-04
  • SpringBoot 整合mongoDB并自定义连接池的示例代码

    SpringBoot 整合mongoDB并自定义连接池的示例代码

    这篇文章主要介绍了SpringBoot 整合mongoDB并自定义连接池 ,整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它可以很容易的操作mongoDB数据库,对整合过程及实例代码感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • MongoDB账户密码设置的方法详解

    MongoDB账户密码设置的方法详解

    这篇文章主要给大家介绍了关于MongoDB账户密码设置的相关资料,我们知道mysql在安装的时候需要我们设置一个数据库默认的用户名和密码,mongodb也不例外,需要的朋友可以参考下
    2023-09-09
  • MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查

    MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查

    这篇文章主要为大家详细介绍了使用MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论