副本集的做法比前面的主从服务器就高级很多,它是这样的:
1、比喻有A、B、C三台服务器,A是主服务器,B、C是备份服务器,A插入数据,B、C也会有该数据
2、当A挂掉后,自动会选择B、C中的一台做为主服务器,但A恢复的时候,A可以变成一台备服务器。这样安全性就高了很多,除非三台服务器都挂了,才会造成巨大影响。
3、而刚刚的主从服务器,主服务器挂了,从服务器是不会变成主服务器的。
下面看看具体配置:
1、A服务器
A.conf
dbpath = D:\MongoDB\A
port = 1111 #端口
bind_ip = 127.0.0.1 #服务地址
replSet = child/127.0.0.1:2222 #设定同伴
mongodbA.bat
mongod --config A.conf
2、B服务器
B.conf
dbpath = D:\MongoDB\B
port = 2222 #端口
bind_ip = 127.0.0.1 #服务地址
replSet = child/127.0.0.1:3333 #设定同伴
mongodbA.bat
mongod --config A.conf
3、B服务器
B.conf
dbpath = D:\MongoDB\C
port = 3333 #端口
bind_ip = 127.0.0.1 #服务地址
replSet = child/127.0.0.1:1111 #设定同伴
mongodbA.bat
mongod --config A.conf
注意看replSet设置,这三个服务器形成了一个闭环4、随便登陆一台服务器
mongo 127.0.0.1:1111
执行
> use admin
switched to db admin
> db.runCommand({"replSetInitiate":
... {
... "_id":'child',
... "members":[{
... "_id":1,
... "host":"127.0.0.1:1111"
... },{
... "_id":2,
... "host":"127.0.0.1:2222"
... },{
... "_id":3,
... "host":"127.0.0.1:3333"
... }]
... }
... })
{ "ok" : 1 }
child:SECONDARY> rs.status()
{
"set" : "child",
"date" : ISODate("2016-07-09T14:42:13.029Z"),
"myState" : 2,
"term" : NumberLong(1),
"syncingTo" : "127.0.0.1:1111",
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 1,
"name" : "127.0.0.1:1111",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",--------主服务器
"uptime" : 504,
"optime" : {
"ts" : Timestamp(1468074840, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-07-09T14:34:00Z"),
"lastHeartbeat" : ISODate("2016-07-09T14:42:11.860Z"),
"lastHeartbeatRecv" : ISODate("2016-07-09T14:42:11.704Z"
),
"pingMs" : NumberLong(0),
"electionTime" : Timestamp(1468074839, 1),
"electionDate" : ISODate("2016-07-09T14:33:59Z"),
"configVersion" : 1
},
{
"_id" : 2,
"name" : "127.0.0.1:2222",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", --------备份服务器
"uptime" : 504,
"optime" : {
"ts" : Timestamp(1468074840, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-07-09T14:34:00Z"),
"lastHeartbeat" : ISODate("2016-07-09T14:42:11.855Z"),
"lastHeartbeatRecv" : ISODate("2016-07-09T14:42:12.888Z"
),
"pingMs" : NumberLong(0),
"syncingTo" : "127.0.0.1:1111",
"configVersion" : 1
},
6、在主服务器插入一条数据
child:PRIMARY> use test1
switched to db test1
child:PRIMARY> db.boot.insert({name:"dddddd"})
WriteResult({ "nInserted" : 1 })
child:SECONDARY> rs.slaveOk()
child:SECONDARY> show dbs
local 0.000GB
test1 0.000GB
child:SECONDARY> use test1
switched to db test1
child:SECONDARY> db.boot.find()
{ "_id" : ObjectId("57810e691e08f8ee2277cb8e"), "name" : "dddddd" }
child:SECONDARY>
测试结果,随机选择一台备份服务器为活跃服务器
9、开启原先的活跃服务器,测试
测试结果,原先的变成了备份服务器
10、设置读写分离
slaveOkay : true
很遗憾他在shell中无法演示,这个特性是被写到mongoDB的
驱动程序中的,在JAVA和node等其他语言中可以完成。
读写分离的的用处,在处理大数据量读写操作时,可以分把读写分开来,来减少数据库负担,主库用来写,备份库用来读取
------------------------------------------------------------------------------------------------------------------------------------------
节点和初始化高级参数
standard 常规节点:参与投票有可能成为活跃节点
passive 副本节点:参与投票,但是不能成为活跃节点
arbiter 仲裁节点:只是参与投票不复制节点也不能成为活跃节点
Priority 0到1000之间 ,0代表是副本节点 ,1到1000是常规节点
arbiterOnly : true 仲裁节点
用法
members":[{
"_id":1,
"host":"127.0.0.1:1111“,
arbiterOnly : true
}]”