请教Mongodb 3.2.1mongodb 副本集 配置问题

Mongodb 副本集搭建问题总结及解决办法_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和修改配置的方式解决,然后把这个想法告诉他,他照此操作后,果然一次搞定!
好了,这次的两个问题基本就这样解决了,不知其他朋友们,是否对这种情况还有更好的解决方案?欢迎留言解惑。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mongodb
副本集搭建
mongodb 副本集搭建、mongodb3.0副本集搭建、别墅违章搭建解决办法、mongodb集群搭建、mongodb 3.4 集群搭建,以便于您获取更多的相关知识。
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!博客分类:
架构图如下:
客户请求: client
&& 路由:Mongs1 Mongs2 Mongs3
&&&&&&& 4& 402000
&& 配置:&&&&&&& config1&&&& config2&& config3
&&&&&&& config: 30200
&& 副本集:
&&&&&&& rs1:&
27217
&&&&&&& rs2:&
27218
&&&&&&& rs3:&
添加windows服务形式启动:
rs1:
sc.exe create MongoDB0 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb0.cfg\"" DisplayName= "MongoDB0" start= "auto"
sc.exe create MongoDB1 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb1.cfg\"" DisplayName= "MongoDB1" start= "auto"
sc.exe create MongoDB2 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb2.cfg\"" DisplayName= "MongoDB2" start= "auto"
sc.exe create config1 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\config1.cfg\"" DisplayName= "config1" start= "auto"
rs2:
sc.exe create MongoDB3 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb3.cfg\"" DisplayName= "MongoDB3" start= "auto"
sc.exe create MongoDB4 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb4.cfg\"" DisplayName= "MongoDB4" start= "auto"
sc.exe create MongoDB5 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb5.cfg\"" DisplayName= "MongoDB5" start= "auto"
sc.exe create config2 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\config2.cfg\"" DisplayName= "config2" start= "auto"
rs3:
sc.exe create MongoDB6 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb6.cfg\"" DisplayName= "MongoDB6" start= "auto"
sc.exe create MongoDB7 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb7.cfg\"" DisplayName= "MongoDB7" start= "auto"
sc.exe create MongoDB8 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\mongodb8.cfg\"" DisplayName= "MongoDB8" start= "auto"
sc.exe create config3 binPath= "\"D:\mongodb\bin\mongod.exe\" --service --config=\"D:\mongodb\db\config3.cfg\"" DisplayName= "config3" start= "auto"
net start MongoDB0
net start MongoDB1
net start MongoDB2
net start MongoDB3
net start MongoDB4
net start MongoDB5
net start MongoDB6
net start MongoDB7
net start MongoDB8
net start config1
net start config2
net start config3
浏览: 125593 次
来自: 杭州
配置分片:
mongo -port 27017config
配置路由:mongs:
40200sc ...
哥们,干得漂亮。。
配置列子如下
&?xml version=&1 ...
写道博主你好,最近在看你的js系列文章,发 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'1. 什么是副本集
副本集就是mongoDB副本所组成的一个集群。
同期原理是,写操作发生在主库,从库同步主库的OpLog日志。
集群中没有特定的主库,主库是选举产生,如果主库down了,会再选举出一台主库。
& & & & & & & & & &
mongoDB也可以配置成主从模式,但,官方已经不建议使用主从模式了,替代方案是采用副本集的模式。
副本集有以下特点:
1. 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。
2. 成员数应该为奇数,如果为偶数的情况下添加arbiter,arbiter不保存数据,只投票。
3. 最大50 members,但是只能有 7 voting members,其他是non-voting members。
2. 配置副本集
本次实验,配置的是1主2从的副本集。
test166:27017,test167:27017,test167:27018
关于mongoDB的安装和使用,请参考
2.1 创建副本集
在3台服务器上启动mongoDB,指定副本集的名字为rs0
test166上启动第一个mongoDB
# mongod --dbpath /var/lib/mongo --replSet rs0
test167上启动第二个mongoDB
# mongod --dbpath /var/lib/mongo --replSet rs0
test167上启动第三个mongoDB,指定端口为27018
# mkdir -p /data/mongo
# mongod --dbpath /data/mongo --port 27018 --replSet rs0
也可以在设定文件中指定,然后启动
# vi /etc/mongod.conf
replication:
replSetName: rs0
# systemctl start mongod
2.2 配置副本集
在任意一台上连接mongodb,初始化
& use admin
& rs.initiate()
rs0:PRIMARY& rs.conf()
添加成员到副本集
先在/etc/hosts设定hostname
添加第一个从库,test167:27017
rs0:PRIMARY& rs.add('test167:27017')
添加第二个从库,test167:27018
可以通过priority来调整主库,选举的时候,priority大的优先被选举为主库
rs0:PRIMARY& rs.add({host: "test167:27018", priority: 5})
rs0:PRIMARY& rs.conf()
rs0:SECONDARY& rs.status()
先关闭从库的mongoDB,然后在主库上移除从库
rs0:PRIMARY& rs.remove('test166:27019')
2.3 同期动作确认
在主库上插入一条记录
& db.user.insert({"username":"test","age":12,"sex":"m"})
在从库上查看数据已经同期
rs0:SECONDARY& db.getMongo().setReadPref('secondaryPreferred')
rs0:SECONDARY& use new2
rs0:SECONDARY& db.user.find()
2.4 Failover动作
副本集heartbeat ping 2秒一次,10秒没有回应认为down了。
Priority最高的被选举为主库,Priority 0的不能升为主。
Optime最高的从库才能被选为主库。
主库需要能连到其他从库,1主2从的情况下,down掉2台的情况下,不会选举出主库。
& use admin
& db.shutdownServer()
在从库上查看副本集状态,可以看到一个从库升级为主库
rs0:SECONDARY& rs.status()
启动关闭的前主库,查看副本集状态,看到主库降为从库,前主库成为主库
rs0:SECONDARY& rs.status()
备注:因为是使用OpLog日志同期,前主库down掉的时间内,在1主1从构成下发生的数据更新,前主库启动后,会同期过来
3. 读写分离
主库,从库都支持读操作。但是,默认情况读也是从主库来读。
从库可以通过设置ReadPreference打开支持读操作,ReadPreference有几种模式:
Primary & & & & & & & & & #从主的读,默认
primaryPreferred&&& &&#基本上从主的读,主不可用时,从从的读
secondary & & & & & & & &#从从的读
secondaryPreferred & #基本上从从的读,从不可用时,从主的读
nearest & & & & & & & & & &#从网络延迟最小的读
基本上常用的是,Primary,secondary,nearest
副本集的设定中可以通过Tag把成员归类,通过下面方法指定读的类型:
1,程序连接的时候,指定读的类型ReadPreference
2,用mongo命令连接,只对当前连接有效
rs0:SECONDARY& db.getMongo().setReadPref('secondaryPreferred')
4. 特殊成员类型
Secondary还有一些特殊的成员类型:
Priority 0&& #不能升为主,可以用于多数据中心场景
Hidden&&&& #对客户端来说是不可见的,一般用作备份或统计报告用
Delayed&&& #数据比副集晚,一般用作 rolling backup 或历史快照
本次介绍了副本集的配置,下次将会介绍分片(Sharding)。
阅读(...) 评论()主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 mongo 副本集 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信