您的位置:首页 > 数据库 > Mongodb

Mongodb集群

2016-07-18 00:00 537 查看
摘要: Mongodb可以做到主从集群,对于主从配置,官方不建议使用了。

1) 集群中有三个角色,一个主两个从



2) 还可以增加一个角色arbiter(仲裁),它只负责仲裁,不会存储任何数据



3) 坏掉主后,其中一个从会接管主的角色



三台机器:
192.168.184.5(primary) 192.168.184.5
172.7.15.112(secondary) 192.168.184.11
172.7.15.101(secondary) 192.168.184.14
编辑三台机器的配置文件,增加:
replication:
##oplog大小
oplogSizeMB: 20 【mysql binlog】
##复制集名称
replSetName: aminglinux
[注意:]bind_ip :留为空,不然在config的时候会出现:
"errmsg" : "No host described in new configuration 1 for replica set aminglinux maps to this node",
的错误。
分别重启后,连接primary机器
mongo
>use admin
>config={_id:"chengyuegroup",members:[{_id:0,host:"192.168.184.5:27017"},{_id:1,host:"192.168.184.11:27017"},{_id:2,host:"192.168.184.14:27017"}]}
>rs.initiate(config)
>rs.add("192.168.184.11")
>rs.add("192.168.184.14")
查看状态:
>rs.status()
{
"set" : "aminglinux",
"date" : ISODate("2015-10-19T06:32:09.200Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost.localdomain:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1381,
"optime" : Timestamp(1445235074, 1),
"optimeDate" : ISODate("2015-10-19T06:11:14Z"),
"electionTime" : Timestamp(1445234949, 1),
"electionDate" : ISODate("2015-10-19T06:09:09Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "172.7.15.112:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 1268,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-19T06:32:07.764Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 1,
"configVersion" : -2
},
{
"_id" : 2,
"name" : "172.7.15.101:27017",
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP",
"uptime" : 1255,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2015-10-19T06:32:07.930Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 1,
"configVersion" : -2
}
],
"ok" : 1
}
或者使用命令:rs.config();

这个状态是不对的,正常从节点上应该是SECONDARY,而不是STARTUP
解决该问题,需要在主节点执行
> var config={_id:"aminglinux",members:[{_id:0,host:"172.7.15.111:27017"},{_id:1,host:"172.7.15.112:27017"},{_id:2,host:"172.7.15.101:27017"}]}
>rs.reconfig(config)
再次执行
>rs.status()
发现状态好了

测试:
主上建库,建集合
>use mydb
>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
>show tables

从上测试
首先要:
>rs.slaveOk();
【注意:】如果没有rs.slaveOK(); 执行
shwo dbs的时候,会出现:

Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }

>show dbs //也出现mydb库了。

更改primary和secondary的权重,会引起主从切换
cfg = rs.conf()
cfg.members[0].priority = 1
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)
这样第二个机器会自动切换到主,权重最高的机器会担任主角色。
在生成环境中,我们需要找一个从节点作为自动切换节点,当主节点宕机后,它会自动接管主的服务,成为主节点,当主恢复后还会自动切换回原来的身份。所以,我们应该这样配置:
【注意:】执行下面的配置的时候,必须要在主节点上执行:

不然会出现:

"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is SECONDARY; use the \"force\" argument to override",

cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)这样的话,第二个节点将会成为候选主节点。

候选主节点,当主节点恢复以后,主会自动恢复当候选主节点为主的时候写入的数据。也就是说和其他
的节点的数据保持同步。
测试:



本机上连接不上mongodb ,在从上,就会出现:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: