下面搭建的副本集是三个节点,一个主节点,一个副节点,一个选举节点,因为有三个节点,所以我们创建三个data目录,然后创建三个日志目录,还有三个配置文件。
[root@redis /]# cd /usr/local/mongodb/
[root@redis mongodb]# mkdir data
[root@redis mongodb]# ls
bin data GNU-AGPL-3.0 MPL-2 README THIRD-PARTY-NOTICES
[root@redis mongodb]# mkdir data/20001 data/20002/ data/20003
[root@redis mongodb]# mkdir logs
[root@redis mongodb]# mkdir logs/20001 logs/20002 logs/20003
一般我们把启动的配置写成配置文件,这样方便管理
具体三个配置文件内容如下:
[root@redis mongodb]# mkdir conf
[root@redis mongodb]#
在这个目录下创建三个configure文件,
20001.conf
port=20001
bind_ip=192.168.56.44
logpath=/usr/local/mongodb/logs/20001.log
dbpath=/usr/local/mongodb/data/20001/
logappend=true
pidfilepath=/usr/local/mongodb/data/20001/20001.pid
fork=true
oplogSize=1024
replSet=Csong
20002.conf
port=20002
bind_ip=192.168.56.44
logpath=/usr/local/mongodb/logs/20002.log
dbpath=/usr/local/mongodb/data/20002/
logappend=true
pidfilepath=/usr/local/mongodb/data/20002/20002.pid
fork=true
oplogSize=1024
replSet=Csong
20003.conf
port=20003
bind_ip=192.168.56.44
logpath=/usr/local/mongodb/logs/20003.log
dbpath=/usr/local/mongodb/data/20003/
logappend=true
pidfilepath=/usr/local/mongodb/data/20003/20003.pid
fork=true
oplogSize=1024
replSet=Csong
20001
[root@redis bin]# ls
bsondump mongo mongod mongodump mongoexport mongofiles mongoimport mongooplog mongoperf mongorestore mongos mongostat mongotop
[root@redis bin]# ./mongod -f /usr/local/mongodb/conf/20001.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1119
child process started successfully, parent exiting
20002
[root@redis bin]# ./mongod -f /usr/local/mongodb/conf/20002.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1143
child process started successfully, parent exiting
[root@redis bin]#
20003
[root@redis bin]# ./mongod -f /usr/local/mongodb/conf/20003.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1166
child process started successfully, parent exiting
[root@redis bin]# ./mongo 192.168.56.44:20001/admin
MongoDB shell version: 3.2.4
connecting to: 192.168.56.44:20001/admin
Server has startup warnings:
2016-04-30T13:49:19.127+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2016-04-30T13:49:19.127+0800 I CONTROL [initandlisten]
> db
admin
> config = { _id:"Csong", members:[ {"_id":0,"host":"192.168.56.44:20001"}, {"_id":1,"host":"192.168.56.44:20002"}, {"_id":2,"host":"192.168.56.44:20003","arbiterOnly":"true"} ] }
{
"_id" : "Csong",
"members" : [
{
"_id" : 0,
"host" : "192.168.56.44:20001"
},
{
"_id" : 1,
"host" : "192.168.56.44:20002"
},
{
"_id" : 2,
"host" : "192.168.56.44:20003",
"arbiterOnly" : true
}
]
}
> rs.initiate(config);
{ "ok" : 1 }
Csong:OTHER> db.users.insert({"username":"Csong"});
WriteResult({ "nInserted" : 1 })
如果不执行rs.slaveOk()说明从节点的角色是从节点的话,就不会接收到数据。这个时候还能发现提示符变成了secondary,说明是从节点。
[root@redis bin]# ./mongo 192.168.56.44:20002/admin
MongoDB shell version: 3.2.4
connecting to: 192.168.56.44:20002/admin
Server has startup warnings:
2016-04-30T13:52:16.013+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2016-04-30T13:52:16.013+0800 I CONTROL [initandlisten]
> db.user.find();
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
Csong:SECONDARY> rs.slaveOk();
Csong:SECONDARY> db.users.find();
{ "_id" : ObjectId("57244cc6c528bbeacdf82cee"), "username" : "Csong" }
这个时候登入选举节点是不会发现数据的。
[root@redis bin]# ./mongo 192.168.56.44:20003/admin
MongoDB shell version: 3.2.4
connecting to: 192.168.56.44:20003/admin
Server has startup warnings:
2016-04-30T13:52:38.230+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2016-04-30T13:52:38.230+0800 I CONTROL [initandlisten]
Csong:ARBITER> db.users.find();
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
Csong:ARBITER> rs.slaveOk();
Csong:ARBITER> db.users.find();
Error: error: { "ok" : 0, "errmsg" : "node is recovering", "code" : 13436 }
Csong:ARBITER>
简单的副本集实验就做完了,具体的参数可以查看文档解释。