在mongodb中,复制集的节点通过选举机制产生主节点。复制基于操作日志(oplog),类似于mysql中的二进制日志,记录所有数据变更。复制过程是将主节点的oplog同步并应用到其他从节点。
节点类型包括标准(host)节点、被动(passive)节点和仲裁(arbiter)节点。

标准节点与被动节点的区别在于优先级(priority)值,值高者为标准节点,值低者为被动节点。选举规则是票数高者获胜,priority值在0到1000之间,相当于额外增加0到1000的票数。选举结果:票数高者胜出;若票数相同,数据新者胜出。
自定义yum源文件
[root@RedHat7_6 ~]# cd /etc/yum.repos.d/ [root@redhat7_6 yum.repos.d]# mkdir bak [root@redhat7_6 yum.repos.d]# mv CentOS-* bak/ [root@redhat7_6 yum.repos.d]# vim local.repo <p>[mongodb-org] name=MongoDB Repository baseurl=<a href="https://www.php.cn/link/d8c3b11e26ab89d9712734aac8765677">https://www.php.cn/link/d8c3b11e26ab89d9712734aac8765677</a> gpgcheck=1 enabled=1 gpgkey=<a href="https://www.php.cn/link/63515bad9f509b6783009bc4bca0162e">https://www.php.cn/link/63515bad9f509b6783009bc4bca0162e</a>
安装MongoDB
[root@redhat7_6 ~]# yum -y install mongodb-org [root@redhat7_6 ~]# yum clean all #清除yum缓存 [root@redhat7_6 ~]# yum list #重新加载源
创建实例相关文件
[root@redhat7_6 ~]# mkdir -p /data/mongodb/mongodb{1,2,3,4} #创建数据目录
[root@redhat7_6 ~]# mkdir -p /data/logs/mongodb #创建日志目录
[root@redhat7_6 ~]# cd /data/logs/mongodb/
[root@redhat7_6 mongodb]# touch mongodb{1,2,3,4}.log #创建日志文件
[root@redhat7_6 mongodb]# chmod 777 *.log #修改目录权限编辑实例1配置文件
[root@redhat7_6 ~]# cp -p /etc/mongod.conf /etc/mongod1.conf [root@redhat7_6 ~]# vim /etc/mongod1.conf #修改配置文件</p><p>path: /data/logs/mongodb/mongodb1.log #约第10行,编辑日志文件路径,对应其他的实例依次往下…… dbPath: /data/mongodb/mongodb1/ #编辑数据目录文件路径,也是一样对应其他的实例依次往下…… net: #约28行,指定网络接口 port: 27017 #编辑端口号,实例1为27017,实例2为27018,依次往下排…… bindIp: 0.0.0.0 replication: #约37行,打开复制选项注释,四台实例都要添加 replSetName: kgcrs #指定复制集名称
编辑其他实例配置文件
[root@redhat7_6 ~]# cp -p /etc/mongod1.conf /etc/mongod2.conf #创建其他三个MongoDB实例配置文件 [root@redhat7_6 ~]# cp -p /etc/mongod1.conf /etc/mongod3.conf [root@redhat7_6 ~]# cp -p /etc/mongod1.conf /etc/mongod4.conf [root@redhat7_6 ~]# rm -rf /etc/mongod.conf
编写启动脚本
[root@redhat7_6 ~]# vim /etc/init.d/mongodb</p><h1>!/bin/bash</h1><h1>descript:Mongodb Server Control Script</h1><h1>Author: GuiHaiYiDao TEL:139741741741</h1><h1>date:long long ago</h1><p>instance=$1 action=$2 case "$action" in 'start') /usr/bin/mongod -f /etc/"$instance".conf ;; 'stop') /usr/bin/mongod -f /etc/"$instance".conf --shutdown ;; 'restart') /usr/bin/mongod -f /etc/"$instance".conf --shutdown /usr/bin/mongod -f /etc/"$instance".conf ;; esac</p><p>[root@redhat7_6 ~]# chmod +x /etc/init.d/mongodb</p><p>[root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 start [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start [root@redhat7_6 ~]# /etc/init.d/mongodb mongod3 start [root@redhat7_6 ~]# /etc/init.d/mongodb mongod4 start</p><p>[root@redhat7_6 ~]# netstat -anpt | grep 'mongod'

初始化配置复制集
[root@redhat7_6 ~]# mongo --port 27017</p><p>> cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.100.76:27017","priority":100},{"_id":1,"host":"192.168.100.76:27018","priority":100},{"_id":2,"host":"192.168.100.76:27019","priority":0},{"_id":3,"host":"192.168.100.76:27020","arbiterOnly":true}]} #定义两个主节点,一个被动节点,一个仲裁节点
> rs.initiate(cfg) #初始化复制集
> kgcrs:PRIMARY
> rs.isMaster() #查看群集状态
{ "hosts" : [ #标准节点
"192.168.100.76:27017",
"192.168.100.76:27018"
],
"passives" : [ #被动节点
"192.168.100.76:27019"
],
"arbiters" : [ #仲裁节点
"192.168.100.76:27020"
],
"setName" : "kgcrs",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.100.76:27017",
"me" : "192.168.100.76:27017",
"electionId" : ObjectId("7fffffff0000000000000001"),
}查看oplog日志
kgcrs:PRIMARY> use testDB #进入或创建库
kgcrs:PRIMARY> db.t1.insert({"id":1,"name":"Tom"}) #插入数据
kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"Jack"})
kgcrs:PRIMARY> db.t1.find() #查看集合
{ "_id" : ObjectId("5b95c4c915740fa3d0077e8d"), "id" : 1, "name" : "Tom" }
{ "_id" : ObjectId("5b95c4d715740fa3d0077e8e"), "id" : 2, "name" : "Jack" }
kgcrs:PRIMARY> db.t1.update({"id":2},{"$set":{"name":"Bob"}}) #修改数据
kgcrs:PRIMARY> db.t1.remove({"id":2}) #移除数据
kgcrs:PRIMARY> show dbs
kgcrs:PRIMARY> use local #进入local库
kgcrs:PRIMARY> show collections
kgcrs:PRIMARY> db.oplog.rs.find() #注意查看每个文档都代表主节点上执行的一个操作,oplog会包含所有对数据有修改的操作(查询操作不会记录)
模拟主节点01故障(端口27017)
[root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 stop #关闭01节点服务器 [root@redhat7_6 ~]# mongo --port 27018</p><p>kgcrs:PRIMARY> rs.status() #查看复制状态

模拟主节点02故障(端口27018)
[root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 stop [root@redhat7_6 ~]# mongo --port 27019 #进入第三个实例

启动标准节点
[root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 start #第一个先启动实例1,成为主节点。可以进行人为控制 [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start</p><p>kgcrs:PRIMARY> rs.status()

配置允许在从节点读取数据
1). 查看实例1服务
[root@redhat7_6 ~]# mongo --port 27017</p><p>kgcrs:PRIMARY> show dbs
kgcrs:PRIMARY> use testDB
kgcrs:PRIMARY> db.t1.find() #查询集合数据
{ "_id" : ObjectId("5b98d55d06a599fff182be6d"), "id" : 1, "name" : "Tom" }2). 设置允许读取数据
[root@redhat7_6 ~]# mongo --port 27018</p><p>kgcrs:SECONDARY> rs.slaveOk() #允许默认从节点读取数据 kgcrs:SECONDARY> show dbs …… testDB 0.000GB #读取成功 kgcrs:SECONDARY> use testDB kgcrs:SECONDARY> db.t1.find()

查看复制状态信息
kgcrs:SECONDARY> rs.help() #查看命令帮助 kgcrs:SECONDARY> rs.printReplicationInfo() configured oplog size: 990MB #oplog文件大小 log length start to end: 7688secs (2.14hrs) #日志启用的时间段。单位:秒 oplog first event time: Wed Sep 12 2018 16:50:59 GMT+0800 (CST) #第一个事务日志的产生时间 oplog last event time: Wed Sep 12 2018 18:59:07 GMT+0800 (CST) #第一个事务日志的结束时间 now: Wed Sep 12 2018 18:59:16 GMT+0800 (CST) #当前时间 kgcrs:SECONDARY> rs.printSlaveReplicationInfo() #可以通过下面IP、端口发现,仲裁节点不具备数据复制 source: 192.168.100.76:27018 #从库的IP及端口 syncedTo: Wed Sep 12 2018 18:59:27 GMT+0800 (CST) #目前的同步情况,延迟了多久等信息 0 secs (0 hrs) behind the primary source: 192.168.100.76:27019 syncedTo: Wed Sep 12 2018 18:59:27 GMT+0800 (CST) 0 secs (0 hrs) behind the primary
更改oplog大小简介
oplog,即operations log的简写,存储在local数据库中。新操作会自动替换旧的操作,以保证oplog不会超过预设的大小。默认情况下,oplog大小会占用64位实例5%的可用磁盘空间。
原理:主节点应用业务操作修改数据后,记录这些操作到oplog中,从节点复制这些oplog并应用这些修改。这些操作是异步的。如果从节点的操作落后主节点太多,oplog日志可能已经轮滚一圈,从节点跟不上同步,复制就会停止,从节点需要重新做完整的同步。为了避免这种情况,尽量保证主节点的oplog足够大,能够存放相当长时间的操作记录。
1). 关闭从节点服务器
[root@redhat7_6 ~]# mongo --port 27018</p><p>kgcrs:SECONDARY> use admin kgcrs:SECONDARY> db.shutdownServer() #关闭服务,从复制集成员退出来
2). 修改从节点主配置文件
[root@redhat7_6 ~]# vim /etc/mongod2.conf

3). 启动单实例
[root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start

4). 备份当前节点所有oplog记录
[root@redhat7_6 ~]# mongodump --port 27028 --db local --collection 'oplog.rs'</p><p>port #指定端口 db #指定数据库 collection #指定集合
5). 更改oplog文件大小
[root@redhat7_6 ~]# mongo --port 27028</p><p>> use local
> db.oplog.rs.drop() #删除oplog文件
> db.runCommand({ create: "oplog.rs", capped: true, size: (2 <em> 1024 </em> 1024 * 1024)}) #重建文件,指定2048M的空间6). 暂时关闭服务
> use admin > db.shutdownServer()
7). 修改从节点主配置文件
[root@redhat7_6 ~]# vim /etc/mongod2.conf</p><p>net: port: 27018 #约29行,把端口改成27018 replication: #约37行,打开复制选项 replSetName: kgcrs #解开注释 oplogSizeMB: 2048 #添加oplog日志文件大小2048MB
8). 登录服务
[root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 start [root@redhat7_6 ~]# mongo --port 27018</p><p>kgcrs:SECONDARY> rs.printReplicationInfo()
9). 进行主从切换
[root@redhat7_6 ~]# mongo --port 27017</p><p>kgcrs:PRIMARY> rs.freeze(30) #暂停30秒不参加选举 kgcrs:PRIMARY> rs.stepDown(60,30) #告知主节点交出主节点位置,然后维持从节点状态不少于60秒,同时等待30秒以使主节点和从节点日志同步</p><p>[root@redhat7_6 ~]# mongo --port 27018

[root@redhat7_6 ~]# mongo --port 27018
创建用户
kgcrs:PRIMARY> use admin
kgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})修改主配置文件
[root@redhat7_6 ~]# vim /etc/mongod1.conf</p><p>security: #约33行,开启认证功能 keyFile: /usr/bin/kgcrskey1 #指定验证文件路径。!!!注意实例1是kgcrskey1 ;实例2是kgcrskey2;实例3是kgcrskey3 clusterAuthMode: keyFile #指定验证模式,秘钥文件验证 [root@redhat7_6 ~]# vim /etc/mongod2.conf #依次第2、3、4实例都要添加上面句。!!!注意验证文件路径要修改</p><p>[root@redhat7_6 ~]# vim /etc/mongod3.conf [root@redhat7_6 ~]# vim /etc/mongod4.conf
生成秘钥文件
[root@redhat7_6 ~]# cd /usr/bin/ [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey1 [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey2 [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey3 [root@redhat7_6 bin]# echo "kgcrs key" > kgcrskey4
更改目录权限
[root@redhat7_6 bin]# chmod 600 kgcrskey{1..4} #复制集对keyFile的权限有要求,最多到600重启实例
[root@redhat7_6 ~]# /etc/init.d/mongodb mongod1 restart [root@redhat7_6 ~]# /etc/init.d/mongodb mongod2 restart [root@redhat7_6 ~]# /etc/init.d/mongodb mongod3 restart [root@redhat7_6 ~]# /etc/init.d/mongodb mongod4 restart
访问主节点
[root@redhat7_6 ~]# mongo --port 27017

验证访问
kgcrs:PRIMARY> use admin
kgcrs:PRIMARY> db.auth("root","123")
以上就是MongoDB复制选举原理及复制集管理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号