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端