Primary至少需要一个,从的话可以一个或者多个!
除了增加多个Secondary之外,我们还可以在集群架构中增加一个Arbiter(仲裁):
其主要目的是,当主挂掉之后,我们的Arbiter会决定根据权重选择出来一个从接替主的位置继续服务!(也是为了防止脑裂这种情况的发生!)
当主挂掉后,其中的一个Secondary自动的变成了新的Primary并行驶主的权利!
主机名 | (角色)作用 |
---|---|
zhdy01 192.168.96.129 | Primary |
zhdy02 192.168.96.135 | Secondary |
zhdy03 192.168.96.136 | Secondary |
三台机器均需要安装MongoDB服务! 关闭firewall规则!
replication://把此行前面的#删除
##oplog大小
oplogSizeMB: 20 //前面有两个空格
##复制集名称
replSetName: aminglinux //前面有两个空格
三台机器均配置如下,bindIp处配置改成本机自身的IP(修改如下两个地方):
net:
port: 27017
bindIp: 127.0.0.1,192.168.96.129 # Listen to local interface only, comment to listen on all interfaces.
replication:
oplogSizeMB: 20
replSetName: zhdya
重启服务生效
systemctl restart mongod
> use admin
> config={_id:"zhdya",members:[{_id:0,host:"192.168.96.129:27017"},{_id:1,host:"192.168.96.135:27017"},{_id:2,host:"192.168.96.136:27017"}]}
配置副本集id为zhdya id分别为0 1 2
> rs.initiate(config)
{ "ok" : 1 }
然后我们再次去登录其它两台server(其实等待个2分钟左右就会自动配置好主和从,一般主的话是你在哪台机器上面设置如上的conf) 显示:
zhdya:SECONDARY>
再次查看下状态:
主上建库,建集合
zhdya:PRIMARY> use mydb
zhdya:PRIMARY> db.acc.insert({AccountID:1,UserName:"asd",password:"asd9577"})
zhdya:PRIMARY> show dbs
zhdya:PRIMARY> use mydb
switched to db mydb
zhdya:PRIMARY> show tables
acc
从上查看
zhdya:SECONDARY> show dbs
2017-10-19T22:05:18.642+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
出现错误Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },需要执行
zhdya:SECONDARY> rs.slaveok()
zhdya:SECONDARY> use mydb
switched to db mydb
zhdya:SECONDARY> show tables
acc
然后就可以发现我们刚刚在主上面创建的集合!
默认三台机器权重都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为primary角色,所以我们预设三台机器的权重分别为:129:3,135:2,136:1
在主上执行:
iptables -I INPUT -p tcp --dport 27017 -j DROP
(稍等个30秒,我们再次进入去查看状态)由于权重都是1所以轮序着来。
这样的话,第二个节点将会成为候选主节点。
试想一下,如果我们删除了iptables规则,默认的zhdy01主还会自动回来吗?
答案:肯定不会的,因为大家权重都是1。
针对这种情况我们就需要设置不同的权重值,去区分!当故障恢复后依然会恢复到主的身份!
下面我们来这个新的主zhdy02上面来操作:
zhdya:PRIMARY> cfg = rs.conf()
zhdya:PRIMARY> cfg.members[0].priority = 3
3
zhdya:PRIMARY> cfg.members[1].priority = 2
2
zhdya:PRIMARY> cfg.members[2].priority = 1
1
zhdya:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
状态检测:
zhdya:SECONDARY>
2017-10-19T22:36:00.827+0800 I NETWORK [thread1] Socket say send() Broken pipe 127.0.0.1:27017
2017-10-19T22:36:00.833+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-10-19T22:36:00.835+0800 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) ok
zhdya:SECONDARY>
zhdya:PRIMARY>
zhdya:PRIMARY>
之前挂掉的主 经过配置 故障恢复后再次成为了主 继续服务!