第一种:
- 开启两个mongodb进程,模拟两台机器;
- 一个为master主服务器,另一个为slave从服务器;
- 主服务器down机后,从服务器不会成为主服务器。
#在当前目录下创建mongodb的数据文件
zheng@zheng:~$ cd ./mongodbTest/
mkdir ./t1/db
mkdir ./t2/db
mkdir ./t1/log
mkdir ./t2/log
touch ./t1/log/mongodb.log
touch ./t2/log/mongodb.log
zheng@zheng:~/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的数据文件
zheng@zheng:~$ cd ./mongodbTest/
zheng@zheng:~/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
}