首页 > 技术文章 > MongoDB副本集

windysai 2017-04-24 15:16 原文

MongoDB副本集

据说,很多游戏公司都用这个东西 。。。。。

因为做了好几天,所以写下来 = =   ,估计是之前安装有点残渣,导致yum卸载总是卸不干净,于是大胆开多一台干净的机器来实验(特意用了快照,做好再接再厉的准备)

 

一、前言

早期使用master-slave(有点像mysql的主从,目前已淘汰),

但有个弊端:slave为只读,master宕机后,slave不能自动切换为主

现在:一个主(primary),多个从(secondary)只读

原理:支持给从设置权重,当主宕掉后,权重最高的从切换为主

特点:读写数据都在主上,要想实现负载均衡,需要手动指定读库的目标server

 
 
二、副本集搭建
【1】前期准备工作
1、准备三台机器,都安装mongodb
http://note.youdao.com/noteshare?id=490b80b86122a49de98a369428b13965&sub=A2EA861481E248998757C76FF5EB75F5
 
副本集主节点(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)

推荐阅读