一般而言,副本集主要成员有三个:主节点,副本节点,仲裁节点
按照官方推荐方案,我们搭建一个三成员的副本集,这个副本集由一个主结点和两个副本结点组成。
这里采用三台虚拟机进行部署: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
来设置副本集成员的延迟时间,而不是 slavedelay
。secondarydelaysecs
字段用于设置副本节点相对于主节点的延迟时间,单位是秒。
解决方法:
将 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副本集部署内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论