MongoDB的数据复制和数据切片(3)

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 }

查看状态:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/68680ad15249a50022a610e5abdcc2ac.html