rs0:PRIMARY> use student_db
switched to db student_db
rs0:PRIMARY> for (i=1;i<=100000;i++) db.students.insert({name:"student"+i,age:(i%120),address:"china_nb"});
WriteResult({ "nInserted" : 1 })
此时在从节点上访问数据会报如下错误:
rs0:SECONDARY> use student_db
switched to db student_db
rs0:SECONDARY> db.students.findOne()
2015-09-04T19:28:10.730-0400 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131
执行rs.slaveOk()后,数据才可读。
rs0:SECONDARY> rs.slaveOk()
rs0:SECONDARY> db.student.findOne()
null
rs0:SECONDARY> db.students.findOne()
{
"_id" : ObjectId("55ea287ce476f31ac766a383"),
"name" : "student1",
"age" : 1,
"address" : "china_nb"
}
当主节点故障时,从节点会重新投票选举出主节点,继续提供服务,避免单点故障。
主节点上关闭服务:
[root@mongo1 ~]# service mongod stop
Stopping mongod: [ OK ]
从节点上查看状态信息:
rs0:SECONDARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2015-09-04T23:31:49Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.1.132:27017",
"health" : 0, #主节点已经下线
"state" : 8,
"stateStr" : "(not reachable/healthy)",
................
},
{
"_id" : 1,
"name" : "192.168.1.139:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #新选出的主节点
............
},
{
"_id" : 2,
"name" : "192.168.1.140:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
.........
}
],
"ok" : 1
}
可以看到原来的主节点已经下线(health为0),重新选举的主节点为192.168.1.139。可以通过rs.isMaster()查看当前节点是否为主节点。
4)添加一个从节点
数据库运行一段时间后,可能需要再次添加节点来分散压力。通过rs.add命令添加从节点。添加完成后,该节点需要和主节点同步数据,同步过程有3个步骤:
1、初始同步(initial sync)
2、回滚后追赶(post-rollback catch-up)
3、切分块迁移(sharding chunk migrations)
添加从节点(在主节点上):
rs0:PRIMARY> rs.add("192.168.1.138")
{ "ok" : 1 }
查看状态: