mongodb的Replica Set主从配置
配置
mongodb有两种主从配置,一种是master/slave模式,另一种是Replica Set模式。由于Replica Set有故障自动切换功能,而master/slave没有,所以master/slave已经不被推荐使用。
启动三个数据库,先准备三套文件夹用来存放数据库文件。然后是启动命令。其中,--replSet
参数指定Replica
Set的名字,任意,最好有意义。
1
2
3
4
5mongod --maxConns=100 --port=27017 --bind_ip=127.0.0.1 --dbpath=/home/cellargalaxy/file/mongodb/db --logpath=/home/cellargalaxy/file/mongodb/log/mongodb.log --replSet rs0
mongod --maxConns=100 --port=27018 --bind_ip=127.0.0.1 --dbpath=/home/cellargalaxy/file/mongodb/db2 --logpath=/home/cellargalaxy/file/mongodb/log2/mongodb.log --replSet rs0
mongod --maxConns=100 --port=27019 --bind_ip=127.0.0.1 --dbpath=/home/cellargalaxy/file/mongodb/db3 --logpath=/home/cellargalaxy/file/mongodb/log3/mongodb.log --replSet rs0
然后用mongo --host 127.0.0.1 --port 27017
登录27017。
1 |
|
添加完后,这三个数据库会自己进行选举,决定谁是主数据库,谁是从数据库,效果:
1 |
|
测试
先连上27018,从数据库要对主数据库读取,还需要到从数据库进行设置。
1
rs.slaveOk()
回到27017插入数据。跟mysql一样,只有主数据库才能写,全部数据库都能读
1
2
3
4
5
6rs0:PRIMARY> use mycloud
switched to db mycloud
rs0:PRIMARY> db.mycloud.insert({name:'name1',age:11})
WriteResult({ "nInserted" : 1 })
rs0:PRIMARY> db.mycloud.find()
{ "_id" : ObjectId("5afc24bc37f9ecd1e677ee57"), "name" : "name1", "age" : 11 }又回到27018,看看数据同步了没
1
2
3
4rs0:SECONDARY> use mycloud
switched to db mycloud
rs0:SECONDARY> db.mycloud.find()
{ "_id" : ObjectId("5afc24bc37f9ecd1e677ee57"), "name" : "name1", "age" : 11 }再测试一下27019,先不rs.slaveOk()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17rs0:SECONDARY> use mycloud
switched to db mycloud
rs0:SECONDARY> db.mycloud.find()
Error: error: {
"operationTime" : Timestamp(1526474043, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1526474043, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}对27019执行rs.slaveOk()
1
2
3
4rs0:SECONDARY> rs.slaveOk()
switched to db mycloud
rs0:SECONDARY> db.mycloud.find()
{ "_id" : ObjectId("5afc24bc37f9ecd1e677ee57"), "name" : "name1", "age" : 11 }
故障自动切换
故障自动切换是Replica Set才有,master/slave没有的功能。故障自动切换就是当主数据库挂了,其他从数据库会自行进行选举,选择出新的主数据库。如果停掉主数据库,等一会,在其他从数据库里回车或者用rs.status()就能查看到主数据库切换了。
不足
现在数据库是不设防,不需要密码登录的。目前还没找到密码登录的主从同步的方法。
参考文章:
mongodb 副本集(Replica
Set)搭建