一般的主从复制是指定好哪个是主,哪个是从。而replSet则不需具体指定哪台主库,自动分配。如果分配的库宕掉,另个一台则自动成为主库并提供服务。
192.168.7.221上使用27018、27019、27020三个端口分别为server1、server2和vote(仲裁)server。
下面为三个服务的数据、日志及配置文件目录
ll /home/mongo
drwxr-xr-x. 4 root root 4096 Aug 27 15:25 27018
drwxr-xr-x. 4 root root 4096 Aug 27 15:26 27019
drwxr-xr-x. 4 root root 4096 Aug 27 15:31 27020
cd /home/mongo
ll 270*
27018:
drwxr-xr-x. 3 root root 4096 Aug 27 15:39 data
drwxr-xr-x. 2 root root 4096 Aug 27 15:26 log
-rw-r--r--. 1 root root 222 Aug 27 15:25 mongo27018.cnf
27019:
drwxr-xr-x. 4 root root 4096 Aug 27 15:37 data
drwxr-xr-x. 2 root root 4096 Aug 27 15:23 log
-rw-r--r--. 1 root root 137 Aug 27 15:22 mongo27019.cnf
27020:
drwxr-xr-x. 4 root root 4096 Aug 27 15:32 data
drwxr-xr-x. 2 root root 4096 Aug 27 15:32 log
-rw-r--r--. 1 root root 137 Aug 27 15:28 mongo27020.cnf
启动参数写于配置文件,此模式的主要参数就是replSet,参数值为:自定义名称、其它服务的服务器IP及端口,仲裁服务指定server1、server2中的一个即可。
1、启动server1
mongod -f mongo27018.cnf
cat 27018/mongo27018.cnf
port=27018
dbpath=/home/mongo/27018/data/
logpath=/home/mongo/27018/log/mongodb.log
logappend=true
replSet=myset/192.168.7.221:27019
2、启动server2
mongod -f 27019/mongo27019.cnf
cat 27019/mongo27019.cnf
port=27019
dbpath=/home/mongo/27019/data/
logpath=/home/mongo/27019/log/mongodb.log
logappend=true
replSet=myset/192.168.7.221:27018
3、连接任意一个服务,初始化replset
mongo 192.168.7.221:27018/admin --quiet
> db.runCommand({"replSetInitiate":{"_id":"myset","members":[{"_id":1,"host":"192.168.7.221:27018"},{"_id":2,"host":"192.168.7.221:27019"}]}})
{ "ok" : 1 }
myset:OTHER>
myset:PRIMARY>
说明:初始化后提示符自动修改,primary和secondary。其中primary对外提供服务,secondary作为从库同步相关操作
mongo 192.168.7.221:27019 --quiet
myset:SECONDARY>
4、启动vote server
mongod -f 27020/mongo27020.cnf
cat 27020/mongo27020.cnf
port=27020
dbpath=/home/mongo/27020/data/
logpath=/home/mongo/27020/log/mongodb.log
logappend=true
replSet=myset/192.168.7.221:27018<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
5、添加仲裁服务,并查看状态,rs.statu也可以看出哪个是主,哪个是从,哪个用于仲裁
myset:PRIMARY> rs.addArb("192.168.7.221:27020")
{ "ok" : 1 }
myset:PRIMARY> rs.status()
{
"set" : "myset",
"date" : ISODate("2015-08-27T07:33:42.964Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" : "192.168.7.221:27018",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 439,
"optime" : Timestamp(1440660804, 1),
"optimeDate" : ISODate("2015-08-27T07:33:24Z"),
"electionTime" : Timestamp(1440660594, 1),
"electionDate" : ISODate("2015-08-27T07:29:54Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.7.221:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 232,
"optime" : Timestamp(1440660804, 1),
"optimeDate" : ISODate("2015-08-27T07:33:24Z"),
"lastHeartbeat" : ISODate("2015-08-27T07:33:42.051Z"),
"lastHeartbeatRecv" : ISODate("2015-08-27T07:33:42.529Z"),
"pingMs" : 0,
"syncingTo" : "192.168.7.221:27018",
"configVersion" : 2
},
{
"_id" : 3,
"name" : "192.168.7.221:27020",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 18,
"lastHeartbeat" : ISODate("2015-08-27T07:33:42.094Z"),
"lastHeartbeatRecv" : ISODate("2015-08-27T07:33:42.101Z"),
"pingMs" : 4,
"configVersion" : 2
}
],
"ok" : 1
}
关掉主库,从库自动切为主库。
参考:http://www.cnblogs.com/huangxincheng/archive/2012/03/04/2379755.html
疑问:发现从库宕掉,主库切为从库,之后不能对外提供服务?