十二、MongoDB副本集

来源:互联网 发布:ibearfree是什么软件 编辑:程序博客网 时间:2024/04/28 06:18
1、复制简介
复制一般是在生产环境使用的,一般会将数据副本保存在多台服务器。
2、创建副本集(这种方法不适合在生产上使用,只能在自己本地练习,帮助理解)
这里使用mongod.exe起MongoDB服务,先不要在后面加--dbpath(会报错,后续找原因)
使用mongo -nodb启动mongo shell
创建3个服务器的副本集
(nodb)>replicaSet= new ReplSetTest({"nodes":3})

运行完这个之后可以看到端口,记住,后面要用
启动三个mongodb进行
(nodb)>replicaSet.startSet()
配置复制功能
replicaSet.initiate()
重新再开一个shell
test>conn1 = new Mongo("localhost:20006")
获取当前数据库test
test>primaryDB = conn1.getDB("test")
输出一些属性
test>primaryDB.isMaster()
"ismaster" : true判断是否是主节点
“primary"如果是从节点,用这个看主节点是哪个
插入1000条数据
test>for(var i=0;i<1000;i++){primaryDB.coll.insert({count:i})}
看是否插入1000
test>primaryDB.coll.count()
1000
验证是否复制
连接一个副本,看里面的数据
test>conn2 = new Mongo("localhost:20007")
test>secondeDB = conn2.getDB("test")
test>secondeDB .coll.find()如无意外会报错,因为mongodb为了保护程序,不设置一下,是不会让你读取的,因为怕你读取到过期数据
test>conn2.setSlaveOk()
然后再获取数据就可以了
可以再试试往这个secondeDB 中插入新数据
test>secondDB.coll.insert({count:1001})
是会报错的,报错的原因就是他不是主节点,从节点是不能插入数据的,只能复制
自动故障转移
先自己关一个
primaryDB.adminCommand({"shutdown":1})
secondDB.isMaster()看看哪个是主节点了
在开启的那个shell中关闭副本集
replicaSet.stopSet()
总结:
*在单台服务器上执行的命令,可以在主节点上执行
*客户端不能在备份节点上执行写操作
*默认情况下不能再备份节点上直接执行读操作,需要设置setSlaveOk

3、可使用的副本集
推荐一个好的博文参考
http://www.cnblogs.com/ten951/p/6072740.html
http://www.cnblogs.com/zhoujinyi/p/3554010.html
4、修改副本集配置
添加副本集
rs.add("xxx.xxx.xxx.xxx:xxxxx")
删除副本集
rs.remove("xxx.xxx.xxx.xxx:xxxxx")
删除时会报错,无法连接数据库,这属于正常现象。
rs.config()每次修改完副本集配置,可通过此命令查看副本信息
需要修改rs.config()中的字段
var config = rs.config()
config.members[1].host="xxx.xxx.xxx.xxx:xxxxx"
其实,如果需要新增或者删除副本集的时候还是用这种方式修改比较好,新增或者删除一个用add,delete命令还好,如果添加删除多个用命令就比较麻烦
修改完配置之后,用rs.reconfig(cofig)将新配置传送到数据库

原创粉丝点击