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:

bash 复制代码
cd /opt/module/mongodb_demo/replicaset/mongodb/bin

副本集模式启动mongodb:

bash 复制代码
./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:

bash 复制代码
cd /opt/module/mongodb_demo/replicaset/mongodb/bin
bash 复制代码
./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:

bash 复制代码
cd /opt/module/mongodb_demo/replicaset/mongodb/bin
bash 复制代码
./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客户端:

bash 复制代码
./mongosh --host node1 --port 27017

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

当出现命令输入提示符>,证明在服务器node1中成功登录MongoDB客户端!

接着在MongoDB客户端中执行副本集初始化操作:

bash 复制代码
rs.initiate()

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

bash 复制代码
rs.status()

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

进行),具体命令如下:

bash 复制代码
rs.add("node2:27017")
bash 复制代码
rs.add("node3:27017")

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

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

bash 复制代码
./mongosh --host node2 --port 27017
bash 复制代码
./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)。

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

提交配置更改

bash 复制代码
rs.reconfig(cfg);

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

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

bash 复制代码
rs.remove("node2:27017");

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

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

成功成为仲裁节点!

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

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

修改配置:

bash 复制代码
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秒

bash 复制代码
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文件的目录,文件写入密钥并修改权限

bash 复制代码
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)同步文件

bash 复制代码
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,添加全局用户

bash 复制代码
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

赋予权限:

bash 复制代码
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/

启动安全认证:

bash 复制代码
./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 以副本结点的形式添加到副本集

主节点中:

bash 复制代码
rs.add("node3:27016")

出现ok1-->成功成功!

相关推荐
珹洺1 小时前
计算机网络:(一)详细讲解互联网概述与组成 (附带图谱更好对比理解)
服务器·开发语言·网络·数据库·后端·计算机网络·php
BirdMan981 小时前
Flask实现分页的三种方法
数据库·python·flask
失业写写八股文2 小时前
数据库死锁场景如何复现和解决?
数据库·mysql
MiniFlyZt2 小时前
使用Redis如何实现分布式锁?(超卖)
数据库·redis·分布式
littlegirll3 小时前
同步Oracle及mysql至KADB的KFS配置文件参考
数据库·mysql·oracle
Eugene Jou4 小时前
FlinkSQL实现实时同步和实时统计过程(MySQL TO MySQL)
数据库·mysql·flink·flinksql
低代码布道师4 小时前
智慧加油站小程序数据库设计文档
数据库·小程序
其实我就是个萌新5 小时前
使用spring data MongoDB对MongoDB进行简单CURD操作示例
java·mongodb·spring
帅维维5 小时前
MongoDB中的游标(Cursor)
数据库·mongodb