mongoDB3.4主从复制实现(第一种情况亲测)
第一种:
- 开启两个mongodb进程,模拟两台机器;
- 一个为master主服务器,另一个为slave从服务器;
- 主服务器down机后,从服务器不会成为主服务器。
- #在当前目录下创建mongodb的数据文件
- [email protected]:~$ cd ./mongodbTest/
- mkdir ./t1/db
- mkdir ./t2/db
- mkdir ./t1/log
- mkdir ./t2/log
- touch ./t1/log/mongodb.log
- touch ./t2/log/mongodb.log
- [email protected]:~/mongodbTest$ tree
- .
- ├── t1
- │ ├── db
- │ └── log
- │ └── mongodb.log
- └── t2
- ├── db
- └── log
- └── mongodb.log
- #设置主服务器,并启动服务
- mongod --dbpath ./t1/db --logpath ./t1/log/mongodb.log --port 50001 --logappend --fork --master
- #设置从服务器,并启动服务。--source ip:port,设置其主服务器
- mongod --dbpath ./t2/db --logpath ./t2/log/mongodb.log --port 50002 --logappend --fork --slave --source 127.0.0.1:50001
- #进入主数据库
- mongo --port 50001
- #在主数据库插入数据
- > use stu
- switched to db stu
- > for(i=1;i<1000;i++){
- db.s.insert({name:'hi'+1}
- )}
- WriteResult({ "nInserted" : 1 })
- > db.s.find().count()
- 999
- #进入从数据库
- mongo --port 50002
- #在从数据库查询
- > show dbs
- 2017-09-14T16:54:56.790+0800 E QUERY [main] Error: listDatabases failed:{
- "ok" : 0,
- "errmsg" : "not master and slaveOk=false",
- "code" : 13435,
- "codeName" : "NotMasterNoSlaveOk"
- } :
- #从数据库无法查看数据库,使用rs.slaveOk()
- > rs.slaveOk()
- > show dbs
- admin 0.000GB
- local 0.000GB
- stu 0.000GB
- > use stu
- switched to db stu
- > show collections
- s
- > db.s.find().count()
- 999
- #从数据库无法插入数据
- > db.stu.insert({name:'hello'})
- WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })
第二种:副本集
- 主服务器down机后,从服务器自动切换。
- #在当前目录下创建mongodb的数据文件
- [email protected]:~$ cd ./mongodbTest/
- [email protected]:~/mongodbTest$ tree
- .
- ├── t1
- │ ├── db
- │ └── log
- │ └── mongodb.log
- ├── t2
- │ ├── db
- │ └── log
- │ └── mongodb.log
- └── t3
- ├── db
- └── log
- └── mongodb.log
- #启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下
- mongod --bind_ip 192.168.14.12 --port 50001 --dbpath ./t1/db --logpath ./t1/log/mongodb.log --logappend --fork --replSet zheng
- mongod --bind_ip 192.168.14.12 --port 50002 --dbpath ./t2/db --logpath ./t2/log/mongodb.log --logappend --fork --replSet zheng
- mongod --bind_ip 192.168.14.12 --port 50003 --dbpath ./t3/db --logpath ./t3/log/mongodb.log --logappend --fork --replSet zheng
- #连接主服务器,此处设置192.168.14.12:50001为主服务器
- mongo --host 192.168.14.12 --port 50001
- #初始化,哪个服务器先初始化就是主服务器
- rs.initiate()
- #初始化后,提示符变为zheng:SECONDARY>
- > rs.initiate()
- {
- "info2" : "no configuration specified. Using a default configuration for the set",
- "me" : "zheng:50001",
- "ok" : 1
- }
- zheng:SECONDARY>
- #查看当前状态
- rs.status()
- #提示符变为
- zheng:PRIMARY>
- #添加副本集
- rs.add('192.168.14.12:50002')
- rs.add('192.168.14.12:50003')
- #副本集添加成功后,当前状态如图
- #向主服务器中插入数据
- zheng:PRIMARY> db
- test
- zheng:PRIMARY> for(i=0;i<=10;i++){db.t.insert({name:'name'+i})}
- WriteResult({ "nInserted" : 1 })
- zheng:PRIMARY> db.t.find().count()
- 11
- #启动从服务器
- mongo --host 192.168.14.12 --port 50002
- mongo --host 192.168.14.12 --port 50003
- #查看数据
- zheng:SECONDARY> rs.slaveOk()
- zheng:SECONDARY> db.t.find()
- { "_id" : ObjectId("59ba7f2060170e82e7b65e89"), "name" : "name0" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e8a"), "name" : "name1" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e8b"), "name" : "name2" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e8d"), "name" : "name4" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e8c"), "name" : "name3" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e8e"), "name" : "name5" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e8f"), "name" : "name6" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e90"), "name" : "name7" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e91"), "name" : "name8" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e92"), "name" : "name9" }
- { "_id" : ObjectId("59ba7f2060170e82e7b65e93"), "name" : "name10"}
- #删除从服务器
- rs.remove('192.168.14.12:50002')
#注意
关闭主服务器后,再重新启动,会发现原来的从服务器变为了从服务器,新启动的服务器(原来的从服务器)变为了从服务器
第三种:
- 可设置优先级,优先级最高的就先为主服务器;
- 主服务器down机后,优先级高的为新的主服务器。
- #启动三个mongodb进程,--replSet name:设置三个mongodb在同一个副本下
- 和上面一样......
- #启动mongo服务器
- mongo --host 192.168.14.12 --port 50001
- #设置主从服务器
- use admin
- db.runCommand({"replSetInitiate":{"_id":"zheng","members":[{"_id":1,"host":"192.168.14.12:50001","priority":3},{"_id":2,"host":"192.168.14.12:50002","priority":2},{"_id":3,"host":"192.168.14.12:50003","priority":1}]}})
- #查看当前状态
- zheng:OTHER> rs.status()
- {
- "set" : "zheng",
- "date" : ISODate("2017-09-14T13:43:58.663Z"),
- "myState" : 1,
- "term" : NumberLong(1),
- "heartbeatIntervalMillis" : NumberLong(2000),
- "optimes" : {
- "lastCommittedOpTime" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "appliedOpTime" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "durableOpTime" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- }
- },
- "members" : [
- {
- "_id" : 1,
- "name" : "192.168.14.12:50001",
- "health" : 1,
- "state" : 1,
- "stateStr" : "PRIMARY",
- "uptime" : 347,
- "optime" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "optimeDate" : ISODate("2017-09-14T13:43:56Z"),
- "infoMessage" : "could not find member to sync from",
- "electionTime" : Timestamp(1505396636, 1),
- "electionDate" : ISODate("2017-09-14T13:43:56Z"),
- "configVersion" : 1,
- "self" : true
- },
- {
- "_id" : 2,
- "name" : "192.168.14.12:50002",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 12,
- "optime" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "optimeDurable" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "optimeDate" : ISODate("2017-09-14T13:43:56Z"),
- "optimeDurableDate" : ISODate("2017-09-14T13:43:56Z"),
- "lastHeartbeat" : ISODate("2017-09-14T13:43:58.317Z"),
- "lastHeartbeatRecv" : ISODate("2017-09-14T13:43:58.153Z"),
- "pingMs" : NumberLong(0),
- "syncingTo" : "192.168.14.12:50001",
- "configVersion" : 1
- },
- {
- "_id" : 3,
- "name" : "192.168.14.12:50003",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 12,
- "optime" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "optimeDurable" : {
- "ts" : Timestamp(1505396636, 2),
- "t" : NumberLong(1)
- },
- "optimeDate" : ISODate("2017-09-14T13:43:56Z"),
- "optimeDurableDate" : ISODate("2017-09-14T13:43:56Z"),
- "lastHeartbeat" : ISODate("2017-09-14T13:43:58.317Z"),
- "lastHeartbeatRecv" : ISODate("2017-09-14T13:43:58.152Z"),
- "pingMs" : NumberLong(0),
- "syncingTo" : "192.168.14.12:50001",
- "configVersion" : 1
- }
- ],
- "ok" : 1
- }
来源:http://blog.****.net/zheng_lan_fang/article/details/77986007