1、复制简介


复制一般是在生产环境使用的,一般会将数据副本保存在多台服务器。


2、创建副本集(这种方法不适合在生产上使用,只能在自己本地练习,帮助理解)


这里使用mongod.exe起MongoDB服务,先不要在后面加--dbpath(会报错,后续找原因)


使用mongo -nodb启动mongo shell


创建3个服务器的副本集


(nodb)>replicaSet= new ReplSetTest({"nodes":3})




查看mongodb 副本集数据 mongodb副本集连接_数据库




运行完这个之后可以看到端口,记住,后面要用


启动三个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、可使用的副本集


推荐一个好的博文参考




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)将新配置传送到数据库