MongoDB副本集
- 早期版本使用master-slave,一主一从和Mysql类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主
- 目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。
- 在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据
- 再此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server
MongoDB副本集搭建
- 三台机器:192.168.221.10(secondary) 192.168.221.20(primary) 192.168.221.30(secondary),都安装mongodb-org
- 三台机器都要编辑配置文件(去掉用户认证,关闭防火墙、selinux)
vim /etc/mongod.conf //加上以下三行 replication: oplogSizeMB: 20 replSetName: apenglinux bindIp: 127.0.0.1,192.168.221.20 //各自加各自的ip systemctl restart mongod.service
- 连接主,在主上配置如下,目的是为了建立副本集
mongo > use admin; > config={_id:"apenglinux",members:[{_id:0,host:"192.168.221.20:27017"},{_id:1,host:"192.168.221.10:27017"},{_id:2,host:"192.168.221.30:27017"}]} > rs.initiate(config) apenglinux:SECONDARY> rs.status();//关注输出内容中的“"stateStr" : "SECONDARY",” apenglinux:PRIMARY>
mongodb副本集测试
- 在主上建立testdb,再建立集合testCollection并插入数据
apenglinux:PRIMARY> use testdb; apenglinux:PRIMARY> db.testCollection.insert({AccountID:1,UserName:'test',password:'test'}); apenglinux:PRIMARY> show dbs; admin 0.000GB config 0.000GB local 0.000GB test 0.000GB testdb 0.000GB
- 连接到从,查看
mongo
apenglinux:SECONDARY> show dbs;
"errmsg" : "not master and slaveOk=false", //会报这样的错误
......以下省略........
apenglinux:SECONDARY> rs.slaveOk(); //注意拼写
apenglinux:SECONDARY> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
testdb 0.000GB
apenglinux:PRIMARY> use testdb;
apenglinux:PRIMARY> show tables;
testCollection
副本集更改权重模拟主宕机
- 查看优先级(副本集中中的成员都可以查看,默认都为1)
apenglinux:SECONDARY> rs.conf();
- 模拟主宕机(在主的机器上开启防火墙规则)
iptables -I INPUT -p tcp --dport 27017 -j DROP
在从上查看,192.168.221.30变为了PRIMARY
mongo --port 27017 --host 192.168.221.30
apenglinux:PRIMARY> rs.status() //只列出了重要部分
............
"_id" : 0,
"name" : "192.168.221.20:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
................
"_id" : 1,
"name" : "192.168.221.10:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
.................
"_id" : 2,
"name" : "192.168.221.30:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
.............
将192.168.221.20这台机器变为正常,正常了也不能成为PRIMARY
更改优先级,使优先级高的成为新的PRIMARY
在主上设置
apenglinux:PRIMARY> cfg = rs.conf()
apenglinux:PRIMARY> cfg.members[0].priority = 3
apenglinux:PRIMARY> cfg.members[1].priority = 2
apenglinux:PRIMARY> cfg.members[2].priority = 1
apenglinux:PRIMARY> rs.reconfig(cfg)
更改之后,可以发现192.168.221.20又变成了PRIMARY
转载于:https://blog.51cto.com/13480443/2086095