这期内容当中小编将会给大家带来有关MongoDB中复制选举的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
MongoDB的复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录。复制是将主节点的oplog日志同步并应用到其他从节点的过程。
MongoDB的节点分为三种类型,分别为标准节点(host)、被动节点(passive)和仲裁节点(arbiter)
只有标准节点才有可能被选举为活跃节点(主节点),拥有选举权。被动节点有完整副本,不可能成为活跃节点,具有选举权。仲裁节点不复制数据,不可能成为活跃节点,只有选举权。说白了就是只有标准节点才有可能被选举为主节点,即使在一个复制集中说有的标准节点都宕机,被动节点和仲裁节点也不会成为主节点。后续有示例演示验证。
标准节点与被动节点的区别:priority值高者是标准节点,低者则为被动节点
选举规则是票数高的获胜,priority是优先权0~1000的值,相当于额外增加0~1000的票数。选举结果:票数高者获胜;若票数相同,数据新者获胜。
MongoDB复制集节点间选举所示
前文链接
Yum安装MongoDB及数据库管理
配置MongoDB复制集
mkdir -p /data/mongodb/logs // path目录,因为在安装完成之后就会有一个实例,所以这里我们只需要创建三个实例即可 mkdir -p /data/mongodb/mongo{2,3,4} //创建dbpath目录 touch /data/mongodb/logs/mongod{2,3,4}.log //创建日志文件 chmod 777 /data/mongodb/logs/*.log //为日志文件赋予权限
path: dbPath: port: bindIp: replication: replSetName: //修改配置文件中这五个项目的值
systemctl disable firewalld.service systemctl stop firewalld.service setenforce 0
mongod -f /etc/mongod.conf
本次复制集由四个节点组成,分别包括两个标准节点,一个被动节点,一个仲裁节点。
mongo //=进入数据库 chen={"_id":"chenrs","members":[{"_id":0,"host":"172.16.10.29:27017","priority":100},{"_id":1,"host":"172.16.10.29:27018","priority":100},{"_id":2,"host":"172.16.10.29:27019","priority":0},{"_id":3,"host":"172.16.10.29:27020","arbiterOnly":true}]}
rs.initiate(chen)
rs.isMaster()
此时对数据库进行一些增删改查的操作,注意在oplog日志中不会记录查询的语句,只会记录对数据库进行更改的语句
use stady //使用stady库 db.abc.insert({"id":1,"name":"zhangsan"}) //向表abc中写入一条数据 db.abc.insert({"id":2,"name":"lisi"}) //再次插入一条数据 db.abc.find() //查看表中内容 db.abc.update({"id":2},{$set:{"name":"jack"}}) //修改表数据 db.abc.remove({"id":1} //删除表数据
use local show collections //可以看到其中有一个oplog.rs文件 db.oplog.rs.find() //由于内容过多,在这里就不展示,查看之后就会发现,没有记录查询的记录,只有记录对数据库做更改的操作
kill -9 + 进程号 //关闭主节点 mongod -f /etc/mongod4.conf --shutdown //关闭主节点 mongo --port 27018 chenrs:PRIMARY> rs.status() //此时该节点已经成为主节点 { "set" : "chenrs", "date" : ISODate("2018-07-16T05:30:04.152Z"), "myState" : 1, ···省略部分内容 "members" : [ "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, //健康值为0,处于非活跃状态 "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分内容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", //此时1为主节点 ···省略部分内容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", ···省略部分内容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ···省略部分内容 ]
mongod -f /etc/mongod2.conf --shutdown mongo --port 27019 chenrs:SECONDARY> rs.status() //仍处于secondary状态 { "set" : "chenrs", "date" : ISODate("2018-07-16T05:40:09.740Z"), "members" : [ { "_id" : 0, "name" : "172.16.10.29:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分内容 "_id" : 1, "name" : "172.16.10.29:27018", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", ···省略部分内容 "_id" : 2, "name" : "172.16.10.29:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", //即使两个标准节点都处于宕机状态,被动节点和仲裁节点也没有成为主节点 ···省略部分内容 "_id" : 3, "name" : "172.16.10.29:27020", "health" : 1, "state" : 7, "stateStr" : "ARBITER", ] ···省略部分内容
默认MongoDB复制集的从节点是不能读取数据的,但是可以使用密令来允许能够在从节点读取数据
rs.slaveOk() //允许从节点能够读取数据
rs.help rs.printReplicationInfo() //查看oplog日志文件的大小及时间范围 rs.printSlaveReplicationInfo() //查询节点及节点复制的时间
如果节点属于复制集成员,此时你想要修改oplog的大小是不被允许的,所以要将节点移出复制集想要修改日志文件的默认大小。此时要做的是首先要关闭节点的服务,然后退出复制集
use admin //在复制集的从节点上做 db.shutdownServer() //关闭服务,此时再想登陆该节点则会失败
注销掉replication的值和修改port值,将其作为单实例启动
vim /etc/mongod2.conf #replication: # replSetName: chenrs port: 27028 mongod -f /etc/mongod2.conf //启动实例,此时该实例不属于复制集
mongodump --port 27028 --db local --collection 'oplog.rs' //在linux界面操作
> use local > db.oplog.rs.drop()
db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
use admin db.shutdownServer()
回调参数,同时要加一个参数指定日志文件大小
vim /etc/mongod2.conf replication: replSetName: chenrs oplogSizeMB: 2048 //单位为兆 mongod -f /etc/mongod2.conf //启动实例 mongo -port 27018 //进入实例
rs.printReplicationInfo()
对于日志文件大小的更改,只对该节点生效,其他节点仍然是默认值
use admin db.createUser({"user":"root","pwd":"123123","roles":["root"]})
为了使其他的节点还能够和主节点进行同步,创建密钥文件使其他节点能够同步
创建验证文件
# cd /usr/bin/ # echo "chenrs key"> chenrskey1 # echo "chenrs key"> chenrskey2 # echo "chenrs key"> chenrskey3 # echo "chenrs key"> chenrskey4 //密钥内容自定义,但是要保证内容的一致性 # chmod 600 chenrskey{1..4} //设置文件权限,不设置在接下来的启动中会报错
修改配置文件,开启mongodb的安全验证功能(四个配置文件都要修改,注意内容差异)
vim /etc/mongod.conf security: keyFile: /usr/bin/chenrskey1 //每个节点的验证文件不同,要根据不同的节点修改 clusterAuthMode: keyFile //认证类型,密钥文件认证
重启服务
mongod -f /etc/mongod.conf --shutdown mongod -f /etc/mongod.conf /其他几台的重启方式都相同,重复操作即可
当你直接使用登陆命令登陆系统时,使用show dbs 是不能够查看数据的,此时就需要使用身份验证
mongo --port 27018 use admin db.auth("root","123123")
上述就是小编为大家分享的MongoDB中复制选举的原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。