您的位置:首页 > 数据库 > Mongodb

Mongodb从0到1系列五: 主从复制

2017-07-27 23:44 513 查看
Mongodb从0到1系列一:下载、安装、启动、停止
Mongodb从0到1系列二:数据库与集合操作文档、增删改查
Mongodb从0到1系列三: 条件查询、大小写
Mongodb从0到1系列四: Limit与Skip方法、排序、索引

10 主从复制

主从复制类似于DB2中的HADR,一个主机,一个备机,两者存放相同的数据库内容,主机的内容的修改会被同步到备机,备机只读。

两台机器,hostname分别是db2a和db2b,现用db2a作Master, db2b做slave

Master IP地址 192.168.37.1 (db2a)

Slave IP地址 192.168.37.3 (db2b)

db2a拷贝相应的介质到db2b上:

db2a:~ # scp mongodb-linux-x86_64-enterprise-suse11-3.4.6.tgz 192.168.37.3:/root

db2b为初始化mongodb做准备:

db2b:~ # tar -zxvf mongodb-linux-x86_64-enterprise-suse11-3.4.6.tgz

db2b:~ # echo "export PATH=/root/mongodb-linux-x86_64-enterprise-suse11-3.4.6/bin/:$PATH" >> /etc/profile

db2b:~ # source /etc/profile

db2b:~ # mkdir -p /data/db

首先在db2a上使用db.shutdownServer()停止mongodb服务,然后开启mongodb服务的时候,指定--master选项:

db2a:~ # mongod --master

新开一mongo shell:

> db.getMongo().setSlaveOk

function (value) {

    if (value == undefined)

        value = true;

    this.slaveOk = value;

}

在db2b上开启mongodb服务的时候要指定--slave和--source

db2b:~ # mongod --slave --source=192.168.37.1:27017

新开一mongo shell:

db2b:~ # mongo

> use test1

switched to db test1

> db.student.find()

Error: error: {

        "ok" : 0,

        "errmsg" : "not master and slaveOk=false",

        "code" : 13435,

        "codeName" : "NotMasterNoSlaveOk"

}

> rs.slaveOk()

> show collections

student

teacher

> db.student.find({},{"_id":0})

{ "name" : "Zhaoliu", "age" : 25, "course" : "Chinese" }

{ "name" : "Zhangsan", "age" : 22, "course" : "Chinese" }

{ "name" : "Lisi", "age" : 23, "course" : "computer" }

{ "name" : "Liuneng", "age" : 26, "course" : "English" }

{ "name" : "Wangwu", "age" : 24, "course" : "Chinese" }

> db.student.insert({name:'Xieguangkun',age:42,course:'Art'})

WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })

> use test2

switched to db test2

> show collections

STUDENT

Student

student

可以看到,slave只能读取,不能写入

在db2a上新添加一个文档,可以在db2b上同步

db2a上:

> db.student.insert({name:'Xieguangkun',age:42,course:'Art'})

WriteResult({ "nInserted" : 1 })

db2b上:

> db.student.find({},{"_id":0})

{ "name" : "Zhaoliu", "age" : 25, "course" : "Chinese" }

{ "name" : "Zhangsan", "age" : 22, "course" : "Chinese" }

{ "name" : "Lisi", "age" : 23, "course" : "computer" }

{ "name" : "Liuneng", "age" : 26, "course" : "English" }

{ "name" : "Wangwu", "age" : 24, "course" : "Chinese" }
{ "name" : "Xieguangkun", "age" : 42, "course" : "Art" }

这里需要注意一点:将slave停掉之后,再按照正常模式是可以启动的,可以进行增、删改操作。再次以slave模式启动后,删除的记录不会再次从主机拷贝过来, 增加的条目也不会被删掉。

master-slave架构。没有自动故障转移功能,需要指定master和slave端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb 主从复制