莫张周刘王 发表于 2025-3-14 20:37:44

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 https://i-blog.csdnimg.cn/direct/be4456093d06455a8616f0eea387887f.png
        上述启动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
https://i-blog.csdnimg.cn/direct/23eca3ca8cc9442cac25c273ad97f352.png
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
https://i-blog.csdnimg.cn/direct/01ed3266853043c48ffdc23bdc7dcb2e.png
3.副本集的初始化

 登录mongodb客户端:
./mongosh --host node1 --port 27017 这里新版本用的mongosh 老版本用mongo即可
https://i-blog.csdnimg.cn/direct/18a7dbf62fb04d5cbb24c5e57b050ca2.png
当出现命令输入提示符>,证明在服务器node1中成功登录MongoDB客户端!
接着在MongoDB客户端中执行副本集初始化操作:
rs.initiate() https://i-blog.csdnimg.cn/direct/d6926b6706554bd4b943e46034edabd5.png
接着查看副本集成员状态:
rs.status() https://i-blog.csdnimg.cn/direct/481c593566b44201b7dac81586565547.png
https://i-blog.csdnimg.cn/direct/6cc80dc706a34b92b09ea0460d8dee19.png
https://i-blog.csdnimg.cn/direct/e32509f23cb24f58b746e6b8bae5d959.png
https://i-blog.csdnimg.cn/direct/91acb30cff0d4b1a8a449827755a9536.png
当前副本集只有一个成员角色,即主结点。接下来,我们将其他两台服务器node2和node3中的MongoDB以副本结点的角色添加到副本集中(添加结点的操作必须在主结点
进行),详细命令如下:
rs.add("node2:27017") rs.add("node3:27017") https://i-blog.csdnimg.cn/direct/dc3175572fbe415f85fe6aabdfb41167.png       
         执行完添加副本结点命令后,客户端会返回添加的副本结点的相关信息,如信息中字段“OK”的值为1,则证明副本结点添加成功!
        此时,在服务器node2和node3上登录MongoDB客户端,查看当前服务器在副本集中的角色分配情况:
./mongosh --host node2 --port 27017  https://i-blog.csdnimg.cn/direct/3f67c11cd149471fade8604907eef3e2.png
./mongosh --host node3 --port 27017 4.同步副本文档

通过向MongoDB副本集主结点写入文档,验证其他副本结点是否成功同步主结点写入的文档内容,详细操作步骤如下。
(1)在服务器node1(副本集主结点)的MongoDB客户端写入一条文档,详细命令如下: 
https://i-blog.csdnimg.cn/direct/70ee92c69bff495a929d4ee6ce5adae5.png
https://i-blog.csdnimg.cn/direct/a075f4297dc34ac192960a7c6ba60e41.png      
  通过上述操作,成功在副本集主结点的数据库test中创建集合user并插入一条文档。
(2)在服务器node2(副本结点)中登录MongoDB客户端,查看数据库test下的集合user中是否存在与主结点一致的文档内容,详细命令如下:
https://i-blog.csdnimg.cn/direct/cf7fe015233546bcb52e1ad5ef6cb260.png
        执行查看集合中的文档命令时,客户端会返回Error的错误信息,这是由于默认情况下
副本结点不能读取副本集中的内容,因此我们须要设置开启副本结点的读取权限,然后才可
以查看副本集中的内容,详细命令如下:       
https://i-blog.csdnimg.cn/direct/73e3420d61b64dfcba871d5a903b3148.png
        注: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.arbiterOnly = true;               // 将 node2 改为仲裁节点
cfg.members.priority = 0;                     // 设置优先级为 0,避免 node2 成为主节点 提交设置更改
rs.reconfig(cfg);
https://i-blog.csdnimg.cn/direct/6b8256c4a3eb4ca88b9bb07c38db084b.png
 
但由于不允许直接修改节点的 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 });



https://i-blog.csdnimg.cn/direct/bb8d2158097d44d998ce03df0141ffcf.png
成功成为仲裁节点!
也有别的方法,我没试过,应该莫问题,自己尝试
https://i-blog.csdnimg.cn/direct/06f53fdb10c34712a46835ee05bf2012.png
3.将服务器nosql03中延长结点修改为正常的副本结点

修改设置:

cfg.members.priority = 0;                     // 设置优先级为 0,避免 node3 成为主节点
cfg.members.hidden = true;                    // 将 node3 设置为隐藏节点,确保不会被选为主节点 【注】出现问题解决方法【新版】 
https://i-blog.csdnimg.cn/direct/e006cd12c65242e2bc3a10280ef091e9.png
        错误提示 BSON field 'MemberConfig.slaveDelay' is an unknown field 表示 slaveDelay 这个字段在 MongoDB 设置中是不被辨认的,导致 rs.reconfig(cfg) 执行失败。事实上,MongoDB 中并没有 slaveDelay 字段用于副本集成员的设置。
正确的字段名:
在 MongoDB 中,应该使用 secondaryDelaySecs 来设置副本集成员的延长时间,而不是 slaveDelay。secondaryDelaySecs 字段用于设置副本节点相对于主节点的延长时间,单元是秒。
解决方法:
将 slaveDelay 更改为 secondaryDelaySecs,并重新设置副本集:
cfg.members.secondaryDelaySecs = 3600;  // 设置延长时间为3600秒
https://i-blog.csdnimg.cn/direct/d207ad6eaab142a788bdf25e9f13f5da.png
cfg.members.priority = 1;  // 设置优先级为 1
cfg.members.hidden = false;  // 取消隐藏节点
cfg.members.secondaryDelaySecs = 0;  // 设置延迟为 0 秒
https://i-blog.csdnimg.cn/direct/07e7edf2752e46a787ad4165067313e5.png
成功了,将服务器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
https://i-blog.csdnimg.cn/direct/a3d61ef3c6844fb39e5e70d5e5b14fdc.png
 (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"}]}); https://i-blog.csdnimg.cn/direct/00d125bfe705464c8d793b85b1916356.png
验证用户是否创建成功:
https://i-blog.csdnimg.cn/direct/1938444f44c74135b2563a764ebe63c9.png 执行完上述命令后客户端返复书息“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查看状态:
https://i-blog.csdnimg.cn/direct/ba549def53794e4988c8a20628d2f0b9.png
2. 在副本集主结点将服务器node3上新启动的 MongoDB 以副本结点的情势添加到副本集

主节点中:
rs.add("node3:27016")  https://i-blog.csdnimg.cn/direct/94d9b21aefa94beaab3206363c9ba999.png
出现ok1-->成功成功! 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MongoDB副本集部署完整教程