您好,登录后才能下订单哦!
MongoDB复制集角色类型
MongoDB复制集角色类型
1、标准节点: 参与primary选举,当自身宕机或停止服务会自动让出primary
2、被动节点: 只能成为second 不参与选举,被设置为被动节点则不能参与选举
3、仲裁节点:负责投票选举,不存放数据,确保标准节点投票数不会相同
用实验来验证一下标准节点互相抢占和被动节点不会抢占以及仲裁节点不存放数据。
利用MongoDB多实例进行实验,yum安装MongoDB以及开启多实例请参考以下
我的另一篇博客:https://blog.51cto.com/13760226/2174032
实验角色
●标准节点1:192.168.60.135:27017
●标准节点2:192.168.60.135:27018
●被动节点 :192.168.60.135:27019
●仲裁节点 :192.168.60.135:27020
一、修改配置文件
vim /etc/mongod.conf
systemLog: #日志模块下修改日志文件路径
destination: file
logAppend: true
path: /usr/local/mongodb/mongod1.log
(剩下实例也要修改,例:mongod2.log,mongod3.log,mongod4.log)
storage: #存储模块下修改数据配置文件
dbPath: /usr/local/mongo1
(同上,例:mongo2,mongo3,mongo4)
net:
port: 27017 每个实例端口号不能相同(例:27018,27019,27020)
bindIp: 0.0.0.0 监听任意地址
直接添加如下两行,开启复制集
replication:
replSetName: repl
二、复制配置文件,创建各自数据存放目录
cp /etc/mongod.conf /etc/mongod2.conf
cp /etc/mongod.conf /etc/mongod3.conf
cp /etc/mongod.conf /etc/mongod4.conf
mkdir /usr/local/mongo{1,2,3,4} #一次创建4个数据存放目录(与配置文件的对应)
mkdir /usr/local/mongodb #创建日志存放目录
touch mongod{1,2,3,4}.log #创建实例对应日志文件
(注意:不要忘记修改复制的配置文件,端口号不能相同)
三、开启多实例,设置标准,被动,仲裁节点
[root@localhost ~]#mongod -f /etc/mongod.conf
[root@localhost ~]#mongod -f /etc/mongod2.conf
[root@localhost ~]#mongod -f /etc/mongod3.conf
[root@localhost ~]#mongod -f /etc/mongod4.conf
[root@localhost mongodb]# netstat -ntap | grep mongod
tcp 0 0 0.0.0.0:27019 0.0.0.0:* LISTEN 2280/mongod
tcp 0 0 0.0.0.0:27020 0.0.0.0:* LISTEN 2308/mongod
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 2224/mongod
tcp 0 0 0.0.0.0:27018 0.0.0.0:* LISTEN 2252/mongod
1)进入其中一个Mongodb进行设置,本文以27017为例
mongo进入数据库,设置如下
>cfg={"_id":"repl","members":
[{"_id":0,"host":"192.168.60.135:27017","priority":100},
{"_id":1,"host":"192.168.60.135:27018","priority":100},
{"_id":2,"host":"192.168.60.135:27019","priority":0},
{"_id":3,"host":"192.168.60.135:27020","arbiterOnly":true}]}
cfg只是一个名字,类似于变量。将27017和27018优先级设置为100,
27019的优先级为0,没有资格参与选举,27020设置为arbite,为仲裁复制集。
> rs.initiate(cfg) #进行初始化
{ #提示如下信息
"ok" : 1,
"operationTime" : Timestamp(1536851525, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1536851525, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
2)查看状态
repl:PRIMARY> rs.status()
27017被选为标准节点,27018有选举权但是已经有标准节点,所以变为被动节点,
27019被选为被动节点,27020被设置为仲裁节点。
四、验证
1)验证标准节点会互相抢占
repl:PRIMARY> rs.stepDown() #主动放弃主复制权
2)验证被动节点不抢占
[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown
killing process with pid: 2224
[root@localhost ~]# mongod -f /etc/mongod2.conf --shutdown
killing process with pid: 2252
关闭27017和27018的MongoDB
[root@localhost ~]# mongo -port 27019 #进入mongodb端口27019
>rs.status()
结论:当两台标准节点宕机时,被动节点也不会顶替成为标准节点,因为没有选举权。
3)验证仲裁服务器不存储数据
开启MongoDB27017端口
[root@localhost ~]# mongod -f /etc/mongod.conf
mongo #登陆
use list; #创建一个数据库
db.list.insert({"name":"zhangsan"}) 创建list集合并插入信息
repl:PRIMARY> db.list.find(); 查询list
{ "_id" : ObjectId("5b9a8ae579c4aae2378a4fd6"), "name" : "zhangsan" }
然后我们切换到27020仲裁服务器
[root@localhost ~]# mongo -port 27020
rs.slaveOk() #先输出该命令,不然无法查看
repl:ARBITER> show dbs; #查看数据库
local 0.000GB #只能看见一个数据库local
结论:仲裁服务器只负责投票选举,不参与数据存储
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。