mongodb搭建mongodb 副本集群为什么要奇数

Mongodb 副本集搭建问题总结及解决办法
作者:生_若蜉蝣
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Mongodb 副本集搭建问题总结及解决办法的相关资料,在Mongodb 副本集搭建过程中会遇到很多问题,这里就对常见问题进行总结并提供解决办法,需要的朋友可以参考下
Mongodb 副本集搭建问题总结及解决办法
Mongodb数据库的副本集是由多台服务器组成,基中一台是主节点,其它为从节点,如果主节点宕机就自动切换到任意一个从节点。如果以前的主节点修复完成和正常运行就自动变成从节点,从节点不能查询数据。也可以在一台服务器装多个Mongodb端口不一样。
在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的。
但是,却仍然有这种情况存在,就如我这几天主要负责的事,就是一个系统的全部服务器迁移中的部分机器迁移,还有一部分由别人负责。
这个系统涉及到flume数据采集,storm数据分析,rabbitmq消息分发,ehcache缓存提升系统性能,MongoDB副本集存储数据,tomcat管理系统应用等,架构基本如下:
而这里我主要负责的是rabbitmq、tomcat、ehcache、mongodb,这里边tomcat、ehcache的安装和配置都比较简单,只是rabbitmq需要依赖于erlang。而erlang又需要依赖一些其他的东西,这些东西需要root权限执行yum,而我们没有root权限,于是稍微花了一点点功夫。
除此之外,mongodb副本集的再次搭建也稍微遇到了一点点问题,不过好在一切还是按照预料中发展的,以前没遇到过的问题也通过经验猜想完美解决。
之所以mongodb副本集搭建会遇到一些问题,大部分原因是因为这次并非亲自动手,而是由所带的新人操作。
首先,按照我给的文档他一步步的操作下去,结果在端口上,不知道是因为习惯还是因为什么,他所设置的端口并不是我们要求的端口。
那么这时候当我要求他改成要求的端口时,他有些茫然,不知道是应该把所有配置删了重配,还是要怎样。
由于时间关系,于是我给他提供了一个方案,就是直接使用配置优先级的方式改掉端口。之前我写过的副本集搭建的文档中应该有说过优先级怎么改,大体上是下边三步:
config=rs.conf()
config.members[0].priority=2
rs.reconfig(config)
那么根据这个,我们设想的改端口应该是下边这样(下边ip和端口只是随便假设的,生产环境自然不能随便透漏):
config=rs.conf()
config.members[0].host="192.168.117.88:37017"
rs.reconfig(config)
但是结果呢,在第三步的时候抛出异常,遗憾的是当时只为了解决问题而没有截图,忘记具体是什么异常了,但大体意思是说这个端口的成员不存在。
于是,我又给他提供了第二个方案,那就是先把三个成员中非主服务的任意一个从成员中删除:
rs.remove("ip:port")
然后把这台机的端口改为我们需要的37017,之后再使用增加成员的命令添加进来:
rs.add("ip:port")
然后就这样操作三次后,三台服务器的端口都成功修改成要求的端口。
这个过程中,当修改到主服务的时候,因为一开始设置了最高优先级,因此需要把另外一台先设置成更高的优先级操作。
问题就这样解决了,只不过事后我又想了想,似乎这种方案并非是最优最简洁的,因为当时没有细想第一种方案中那个问题的原因,后来一想,多半是因为那台机还是原端口没有被重启。
如果我们先把非主服务机器的端口都改好重启,那么再次用第一种方案进行应该也是可行的,而且还会比第二种方案简单,有机会了一定要试试。
本以为这样就可以了,然后没想到的是,当我们都迁移完成后,被告知那些机器都是测试服务网段的,要改成生产网段。
于是乎,所有的机器ip全部变了,以至于我们的mongodb副本集又要重新配置。
但是这一次比较麻烦的是,之前那次改端口是因为我至少可以保证有两台机还是正常运行的,可以操作rs命令,但是这一次ip一变,我三台机都无法正常成为主服务,以至于rs命令失效。
几番折腾,始终没有想出好的方案,于是只好把data目录下的内容尽数删除,然后真正的重新配置一遍。
然而,在这位新手的操作下,配置的过程中,把本该是如下的命令:
config={_id:”reptest”,members:[{_id:0,host:”192.168.0.160:57017”},{_id:1,host:”192.168.0.211:57017”},{_id:,host:”192.168.0.213:57017”}]}
rs.initiate(config)
弄成了这样:
config={_id:”reptest”,members:[{_id:0,host:”192.168.0.160:57017”},{_id:1,host:”192.168.0.211:57017”},{_id:,host:”192.168.0.213:57017”}]}
rs.initiate()
也就是说这里他虽然给config赋值了,但是再加载的时候竟然没有使用,这也怪了忘了告诉他之前发现的一个问题。
通常我们在window系统上操作Linux上的应用,都会使用crt或者putty这些工具,这两个工具各有优劣,而我发现当我们进入mongo shell中操作时,这两个工具是有区别的,使用putty就可以回退,而crt就不能再mongodb shell中回退。
因此当他敲完rs.initiate(),想要回到括号里加上config时,已经没了回头路,只能硬着头皮回车。
而这时候,rs.initiate()只能执行一次,接下来和我文档中的操作不一样了,又该怎么办呢?
经过上一个问题,这个问题貌似就很好解决的,怎么办呢,我觉得还是可以使用rs.add和修改配置的方式解决,然后把这个想法告诉他,他照此操作后,果然一次搞定!
好了,这次的两个问题基本就这样解决了,不知其他朋友们,是否对这种情况还有更好的解决方案?欢迎留言解惑。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具用户名:cd_azhuang
文章数:54
评论数:42
访问量:30812
注册日期:
阅读量:1297
阅读量:3317
阅读量:459555
阅读量:1143990
51CTO推荐博文
MongoDB 副本集(类似高可用)1.节点类型standard:常规节点,它存储一份完整的数据副本,参与选举投票,有可能成为活跃节点。passive:存储了完整的数据副本,参与投票,不能成为活跃节点。arbiter:仲裁节点,只参与投票,不接收复制的数据,也不能成为活跃节点。2.参数说明--dbpath & 数据文件路径--logpath &日志文件路径--port & & & &端口号,默认是27017.我这里使用的也是这个端口号.--replSet & 复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是1905.--replSet & 这个后面跟的是其他standard节点的ip和端口--maxConns & 最大连接数--fork & & & 后台运行--logappend & 日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。3.创建副本集环境说明:ip:192.168.3.206 & #standard节点ip:192.168.3.210 & #standard节点ip:192.168.3.201 & #仲裁节点4.安装方法&参照http://blog.csdn.net/liu/article/details/来安装。安装成功后,不要用博客上面的启动命令。5.启动方法&启动第一个standard节点(ip:192.168.3.206)&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb/ --logpath /data/logs/mongodb/log.log --logappend --port=27017 -replSet 1905 -maxConns=2000 -fork&启动第一个standard节点(ip:192.168.3.210)&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb/ --logpath /data/logs/mongodb/log.log --logappend --port=27017 -replSet 1905 -maxConns=2000 -fork&启动arbiter节点,也就是仲裁节点 (ip:192.168.3.201)&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb/ --logpath /data/logs/mongodb/log.log --logappend --port=27017 -replSet 1905 -maxConns=2000 -fork6.shell初始化副本集启动了以上服务器后,日志告诉你副本集没有初始化。连接其中一台standard(192.168.3.206)节点服务器。初始化命令只能执行一次&db.runCommand({"replSetInitiate" : { && & "_id" : "1905", && & "members" : [ && & { && & "_id" : 0, && & "host" : "192.168.3.206:27017" && & }, && & { && & "_id" : 1, && & "host" : "192.168.3.210:27017" && & } && & ]}}) &rs.status(){"startupStatus" : 3,"info" : "run rs.initiate(...) if not yet done for the set","ok" : 0,"errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)"}如果通过rs.status()得到上面结果。说明还没有得到副本集合的配置信息,然后执行下面语句config_rs={_id:'1905',members:[{_id:0,host:'192.168.3.206:27017'},{_id:1,host:'192.168.3.210:27017'}]}rs.initiate(config_rs);{"info" : "Config now saved locally. &Should come online in about a minute.","ok" : 1}表示已经得到副本集合了。7.测试副本集7.1查看副本集合&rs.status(){"set" : "1905","date" : ISODate("T03:11:53Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 4777,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:10:30Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T03:10:40Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 81,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:10:30Z"),"lastHeartbeat" : ISODate("T03:11:53Z"),"lastHeartbeatRecv" : ISODate("T03:11:53Z"),"pingMs" : 0,"syncingTo" : "192.168.3.206:27017"}],"ok" : 1}7.2加入仲裁节点执行以下命令:&rs.addArb("192.168.3.201:27017");{ "ok" : 1 }我们可以再次查看当前状态:rs.status(){"set" : "1905","date" : ISODate("T03:18:58Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 5202,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:17:39Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T03:10:40Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 506,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T03:17:39Z"),"lastHeartbeat" : ISODate("T03:18:58Z"),"lastHeartbeatRecv" : ISODate("T03:18:58Z"),"pingMs" : 0,"syncingTo" : "192.168.3.206:27017"},{"_id" : 2,"name" : "192.168.3.201:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 79,"lastHeartbeat" : ISODate("T03:18:57Z"),"lastHeartbeatRecv" : ISODate("T03:18:58Z"),"pingMs" : 0}],"ok" : 1}&rs.status()通过这个命令,可以查看各个节点的ip、角色已经是否正常我们看到已经成功配置。&7.3查看活跃节点:db.isMaster();&{"setName" : "1905","setVersion" : 2,"ismaster" : true,"secondary" : false,"hosts" : ["192.168.3.206:27017","192.168.3.210:27017"],"arbiters" : ["192.168.3.201:27017"],"primary" : "192.168.3.206:27017","me" : "192.168.3.206:27017","maxBsonObjectSize" : ,"maxMessageSizeBytes" : ,"maxWriteBatchSize" : 1000,"localTime" : ISODate("T03:23:18.798Z"),"maxWireVersion" : 2,"minWireVersion" : 0,"ok" : 1}可以看到现在192.168.3.206:27017为活跃节点。检测是否配置成功7.4模拟故障可以强制primary和standard节点角色互换,从而验证是否能够实现副本集功能进入主节点后执行下面命令rs.stepDown() &&执行完成后:db.isMaster(){"setName" : "1905","setVersion" : 2,"ismaster" : false,"secondary" : true,"hosts" : ["192.168.3.206:27017","192.168.3.210:27017"],"arbiters" : ["192.168.3.201:27017"],"primary" : "192.168.3.210:27017","me" : "192.168.3.206:27017","maxBsonObjectSize" : ,"maxMessageSizeBytes" : ,"maxWriteBatchSize" : 1000,"localTime" : ISODate("T03:43:25.102Z"),"maxWireVersion" : 2,"minWireVersion" : 0,"ok" : 1}&可以看到现在主节点已经修改为192.168.3.210:27017了。8.动态扩展增加节点&为了节约服务器,我们在ip:192.168.3.210上面重新增加端口27027为standard节点&mkdir -p /data/mongodb1 & &#27027端口数据目录&mkdir -p /data/logs/mongodb1/ #27027端口日志目录&#启动27027端口standard节点&/usr/local/mongodb/bin/mongod &--dbpath=/data/mongodb1/ --logpath /data/logs/mongodb1/log.log --logappend --port=27027 -replSet 1905 -maxConns=2000 -fork进入活跃节点的服务器rs.add("192.168.3.210:27027"); &{ "ok" : 1 }我们可以再次查看当前状态:rs.status(){"set" : "1905","date" : ISODate("T05:55:37Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 838,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T05:55:34Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T05:47:58Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 314,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T05:55:34Z"),"lastHeartbeat" : ISODate("T05:55:36Z"),"lastHeartbeatRecv" : ISODate("T05:55:37Z"),"pingMs" : 0,"syncingTo" : "192.168.3.206:27017"},{"_id" : 2,"name" : "192.168.3.201:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 836,"lastHeartbeat" : ISODate("T05:55:35Z"),"lastHeartbeatRecv" : ISODate("T05:55:35Z"),"pingMs" : 0},{"_id" : 3,"name" : "192.168.3.210:27027","health" : 1,"state" : 5,"stateStr" : "STARTUP2","uptime" : 3,"optime" : Timestamp(0, 0),"optimeDate" : ISODate("T00:00:00Z"),"lastHeartbeat" : ISODate("T05:55:36Z"),"lastHeartbeatRecv" : ISODate("T00:00:00Z"),"pingMs" : 0}],"ok" : 1}已经出现192.168.3.210:27027说明动态增加节点成功。9.动态扩展删除节点进入活跃节点的服务器rs.remove("192.168.3.210:27027"); &T14:00:10.118+0800 DBClientCursor::init call() failedT14:00:10.119+0800 Error: error doing query: failed at src/mongo/shell/query.js:81T14:00:10.121+0800 trying reconnect to 127.0.0.1:2.0.1) failedT14:00:10.122+0800 reconnect 127.0.0.1:2.0.1) ok我们可以再次查看当前状态:&rs.status(){"set" : "1905","date" : ISODate("T06:00:31Z"),"myState" : 1,"members" : [{"_id" : 0,"name" : "192.168.3.206:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 1132,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T06:00:10Z"),"electionTime" : Timestamp(, 1),"electionDate" : ISODate("T05:47:58Z"),"self" : true},{"_id" : 1,"name" : "192.168.3.210:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 21,"optime" : Timestamp(, 1),"optimeDate" : ISODate("T06:00:10Z"),"lastHeartbeat" : ISODate("T06:00:30Z"),"lastHeartbeatRecv" : ISODate("T06:00:29Z"),"pingMs" : 0,"lastHeartbeatMessage" : "syncing to: 192.168.3.206:27017","syncingTo" : "192.168.3.206:27017"},{"_id" : 2,"name" : "192.168.3.201:27017","health" : 1,"state" : 7,"stateStr" : "ARBITER","uptime" : 21,"lastHeartbeat" : ISODate("T06:00:30Z"),"lastHeartbeatRecv" : ISODate("T06:00:30Z"),"pingMs" : 2}],"ok" : 1}192.168.3.210:27027已经没有出现在副本集合里面,说明删除节点成功。10.为主节点模拟写数据10.1在主节点上面操作&use mytest& db.test03.insert({age:26})WriteResult({ "nInserted" : 1 })& db.test03.find(){ "_id" : ObjectId("53c4f9dd7f7a3afaa3dd2415"), "age" : 26 }10.2在从节点上面操作&admin & (empty)local & 1.078GBmytest &0.078GB#mytest数据库已经自动同步OKT14:17:21.849+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131#上面提示从节点不能读,所以不能查看集合。rs.slaveOk() &#执行此命令允许从节点可以读取,但是不能写。system.indexestest03&db.test03.find(){ "_id" : ObjectId("53c60edaf2c66b02d9c99338"), "age" : 26 }本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)新手求教MongoDB副本集配置问题【mongodb吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,625贴子:
新手求教MongoDB副本集配置问题收藏
本人一共搭建了3个虚拟机,都是以mongod --replSet spock --fork --syslog的方式启动的,启动了一个Mongo shell之后输入如下代码:& config = {&_id&: &spock&, &members&: [{&_id&: 0, &host&: &localhost:27017&}, {&_id&: 1, &host&: &virtual1:27017&}, {&_id&: 2, &host&: &virtual2:27017&}]};{
&_id& : &spock&,
&members& : [
&_id& : 0,
&host& : &localhost:27017&
&_id& : 1,
&host& : &virtual1:27017&
&_id& : 2,
&host& : &virtual2:27017&
]}& rs.initiate(config);{
&errmsg& : &Either all host names in a replica set configuration must be localhost references, found 1 out of 3&,
&code& : 93}报这个错误,请问这是什么原因?
mongodb,网易云一站式MongoDB解决方案,便捷高可靠,支持自动备份,一键快速恢复.mongodb,网易云0元免费备案,7*24小时客户支持,20年技术积累,50万+用户接入.
host名称重复
要么所有主机名都是localhost,要么都不是localhost你这里有一个叫localhost
登录百度帐号推荐应用mongodb副本集优先级设置
在设置mongodb副本集时,Primary节点,second节点,仲裁节点,有可能资源配置(CPU或者内存)不均衡,所以要求某些节点不能成为Primary
我们知道mongodb的设置:
除了仲裁节点,其他每个节点都有个优先权,可以手动设置优先权来决定谁的成为primay的权重最大。
副本集中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,优先权越高。
默认的值是1,rs.conf是不显示的;
如果值是0,那么不能成为primay。
1.规划时直接设置,这个就略过了
2.在线加入的节点配置:
配置过程:
通过修改priority的值来实现(默认的优先级是1(0-100),priority的值设的越大,就优先成为主)
1)PRIMARY& config=rs.conf()
2)PRIMARY&config.members[3].priority = 3
3)PRIMARY& rs.reconfig(config)
注意:第2步members大括号里面的成员和_id是没有关系的,而是rs.conf查出来节点的数值的顺序;
这些操作必须在Primary上进程。

我要回帖

更多关于 mongodb 3.4 副本集 的文章

 

随机推荐