学堂 学堂 学堂公众号手机端

MongoDB中复制选举的原理是什么

lewis 4年前 (2021-07-11) 阅读数 5 #技术

这期内容当中小编将会给大家带来有关MongoDB中复制选举的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

MongoDB复制集的选举原理

MongoDB复制的原理

MongoDB的复制是基于操作日志oplog,相当于MySQL中的二进制日志,只记录发生改变的记录。复制是将主节点的oplog日志同步并应用到其他从节点的过程。

MongoDB选举的原理

MongoDB的节点分为三种类型,分别为标准节点(host)、被动节点(passive)和仲裁节点(arbiter)


只有标准节点才有可能被选举为活跃节点(主节点),拥有选举权。被动节点有完整副本,不可能成为活跃节点,具有选举权。仲裁节点不复制数据,不可能成为活跃节点,只有选举权。说白了就是只有标准节点才有可能被选举为主节点,即使在一个复制集中说有的标准节点都宕机,被动节点和仲裁节点也不会成为主节点。后续有示例演示验证。

标准节点与被动节点的区别:priority值高者是标准节点,低者则为被动节点

选举规则是票数高的获胜,priority是优先权0~1000的值,相当于额外增加0~1000的票数。选举结果:票数高者获胜;若票数相同,数据新者获胜。

MongoDB复制集节点间选举所示

前文链接
Yum安装MongoDB及数据库管理
配置MongoDB复制集

示例验证复制集选举原理

创建4个实例

创建新实例的path文件和dbpath的文件目录,并为日志文件设置权限
mkdir-p/data/mongodb/logs
//path目录,因为在安装完成之后就会有一个实例,所以这里我们只需要创建三个实例即可
mkdir-p/data/mongodb/mongo{2,3,4}//创建dbpath目录
touch/data/mongodb/logs/mongod{2,3,4}.log//创建日志文件
chmod777/data/mongodb/logs/*.log//为日志文件赋予权限
修改配置文件(/etc/mongod.conf)
path:
dbPath:
port:
bindIp:
replication:
replSetName://修改配置文件中这五个项目的值

关闭防火墙及selinux防火墙
systemctldisablefirewalld.service
systemctlstopfirewalld.service
setenforce0
启动实例
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()

查看oplpog日志

此时对数据库进行一些增删改查的操作,注意在oplog日志中不会记录查询的语句,只会记录对数据库进行更改的语句

usestady//使用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}//删除表数据
查看oplog中内容
uselocal
showcollections//可以看到其中有一个oplog.rs文件
db.oplog.rs.find()
//由于内容过多,在这里就不展示,查看之后就会发现,没有记录查询的记录,只有记录对数据库做更改的操作

模拟主节点故障

关闭主节点
kill-9+进程号//关闭主节点
mongod-f/etc/mongod4.conf--shutdown//关闭主节点
mongo--port27018
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":"(notreachable/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--port27019
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":"(notreachable/healthy)",
···省略部分内容
"_id":1,
"name":"172.16.10.29:27018",
"health":0,
"state":8,
"stateStr":"(notreachable/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复制集管理

配置允许在从节点读取数据

默认MongoDB复制集的从节点是不能读取数据的,但是可以使用密令来允许能够在从节点读取数据

rs.slaveOk()//允许从节点能够读取数据

查看复制集状态信息

rs.help
rs.printReplicationInfo()//查看oplog日志文件的大小及时间范围
rs.printSlaveReplicationInfo()//查询节点及节点复制的时间

调整oplog日志文件大小

如果节点属于复制集成员,此时你想要修改oplog的大小是不被允许的,所以要将节点移出复制集想要修改日志文件的默认大小。此时要做的是首先要关闭节点的服务,然后退出复制集

关闭节点服务(属于离线升级)
useadmin//在复制集的从节点上做
db.shutdownServer()//关闭服务,此时再想登陆该节点则会失败
节点退出复制集

注销掉replication的值和修改port值,将其作为单实例启动

vim/etc/mongod2.conf
#replication:
#replSetName:chenrs
port:27028
mongod-f/etc/mongod2.conf//启动实例,此时该实例不属于复制集
完全备份oplog日志
mongodump--port27028--dblocal--collection'oplog.rs'//在linux界面操作
删除节点中oplog文件
>uselocal
>db.oplog.rs.drop()
重建oplog日志
db.runCommand({create:"oplog.rs",capped:true,size:(2*1024*1024*1024)})
再次关闭节点服务
useadmin
db.shutdownServer()
将节点加入到复制集

回调参数,同时要加一个参数指定日志文件大小

vim/etc/mongod2.conf
replication:
replSetName:chenrs
oplogSizeMB:2048//单位为兆
mongod-f/etc/mongod2.conf//启动实例
mongo-port27018//进入实例

查看oplog大小
rs.printReplicationInfo()

对于日志文件大小的更改,只对该节点生效,其他节点仍然是默认值

部署认证复制

创建管理用户
useadmin
db.createUser({"user":"root","pwd":"123123","roles":["root"]})

配置密钥验证

为了使其他的节点还能够和主节点进行同步,创建密钥文件使其他节点能够同步

创建验证文件

#cd/usr/bin/
#echo"chenrskey">chenrskey1
#echo"chenrskey">chenrskey2
#echo"chenrskey">chenrskey3
#echo"chenrskey">chenrskey4//密钥内容自定义,但是要保证内容的一致性
#chmod600chenrskey{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--port27018
useadmin
db.auth("root","123123")

上述就是小编为大家分享的MongoDB中复制选举的原理是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注博信行业资讯频道。

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门