MongoDB副本集
据说,很多游戏公司都用这个东西 。。。。。
因为做了好几天,所以写下来 = = ,估计是之前安装有点残渣,导致yum卸载总是卸不干净,于是大胆开多一台干净的机器来实验(特意用了快照,做好再接再厉的准备)
一、前言
早期使用master-slave(有点像mysql的主从,目前已淘汰),
但有个弊端:slave为只读,master宕机后,slave不能自动切换为主
现在:一个主(primary),多个从(secondary)只读
原理:支持给从设置权重,当主宕掉后,权重最高的从切换为主
特点:读写数据都在主上,要想实现负载均衡,需要手动指定读库的目标server
二、副本集搭建
【1】前期准备工作
1、准备三台机器,都安装mongodb
副本集主节点(primary):192.168.37.131
副本集副本节点(secondary): 192.168.37.133 192.168.37.128
2、编辑三台机器的mongod配置文件
vim /etc/mongod.conf
replication:
##oplog大小
oplogSizeMB: 20 ——》开头空2格,20前有1个空格
##复制集名称
replSetName: ljy
3、分别重启三台机器:service mongod restart
【2】具体搭建过程
1、131主机器上执行
(1)use admin ——》切换到admin库
(2)运行
config={_id:"ljy",members:[{_id:0,host:"192.168.37.133:27017"},{_id:1,host:"192.168.37.128:27017"},{_id:2,host:"192.168.37.131:27017"}]}
(3)初始化配置
rs.initiate(config)
(4)查看状态,有3个角色
rs.status()
133、128 都为 secondary
131是primary
(5)执行完之后,会发现131自动变为PRIMARY,133、128变为SECONDARY
###################
ps:
如果两个从上的状态为"stateStr" : "STARTUP", 则需要进行如下操作
> var config={_id:"ljy",members:[{_id:0,host:"192.168.37.133:27017"},{_id:1,host:"192.168.37.128:27017"},{_id:2,host:"192.168.37.131:27017"}]}
> rs.reconfig(config)
此时再次查看rs.status()会发现从的状态变为SECONDARY
###################
三、副本集测试
1、主(131)建立测试集合
(1)use mydb
(2)db.createCollection('jihe')
2、从上看数据
show dbs ——》报错: listDatabases failed
解决: 执行 rs.slaveOk()
show tables 能看到 jihe
3、主宕机,切换到从
(1)131主,更改primary和secondary的权重,引起主从切换
cfg = rs.conf()
cfg.members[0].priority = 3 ——》131 primary
cfg.members[1].priority = 2 ——》133 secondary
cfg.members[2].priority = 1 ——》128 secondary
rs.reconfig(cfg) 重新加载
这样,第二个节点将会成为候选节点
(2)131主禁掉主服务
iptables -I INPUT -p tcp --dport 27017 -j DROP
看日志: tail /var/log/mongodb/mongod.log
(3)133从回车,从SECONDARY ——》PRIMARY
ps:
不能将用户的访问从原来的主切换到从,
解决:写监控脚本,程序帮忙切换主的ip
4、新主(133)创建集合,原主(131)能看到
(1)db.createCollection('jihe2')
(2)131(原主)执行,解禁
iptables -D INPUT -p tcp --dport 27017 -j DROP
(3)show tables 可以看到 jihe2
(4)结论:
主宕机,恢复期间,给新主(133)写入新数据,新数据是可以同步给原来宕机的主(131)