mongo副本集mongo 创建用户好后我连接哪个mongo

创建副本集的quick-start
tips:确保存在/data/db的目录,且有写权限,因为以下操作将在这个目录创建数据库
1、执行命令
&mongo --nodb
--nodb表示允许在不连接数据库的情况下创建一个shell
2、执行命令
replicaSet&=&new&ReplSetTest({&nodes&&:&3})&
这条命令告诉shell创建3个数据库服务,一个主服务,两个从服务。但只有执行3中的命令,server才会真正被创建。
3、执行命令
replicaSet.startSet()
replicaSet.initiate()
这两条命令成功创建了3个mongod进程,端口号分别为,31002,
4、再开一个终端,连接到其中一个mongod
conn1&=&new&Mongo(&localhost:31000&)&
primaryDB&=&conn1.getDB(&test&)
5、执行命令
primaryDB.isMaster()
可以看到当前服务器的状态。
6、在主服务器上添加一些数据,看看从服务器有什么变化。
for&(i=0;&i&1000;&i++)&{&primaryDB.coll.insert({count:&i})&}&
再开一个终端连接到从服务器
&conn1&=&new&Mongo(&localhost:31000&)&
secondDB = conn1.getDB(&test&)
secondDB.coll.count()
会输出Sun Sep 14 22:19:18 uncaught exception: count failed: { &errmsg& : &not master&, &ok& : 0 }
这是防止你无意中查询从服务器而得到旧数据。解决方法是
conn1.setSlaveOk()然后你就可以查询到和主服务器一样的数据了。
7、从服务器禁止写入数据,他只能通过复制主服务器来写入数据。
部分翻译自mongodb权威指南第二版。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:91008次
积分:1314
积分:1314
排名:千里之外
原创:34篇
转载:15篇
评论:28条
(1)(1)(2)(9)(1)(1)(4)(7)(1)(1)(1)(2)(3)(3)(1)(12)mongodb 副本集
如何连接?? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
mongodb已经建立好了 副本集
两个数据库服务器 一个仲裁服务器
弱弱的问一句 请问应该怎么连接呢??
网上不是有一步一步的那种教程吗?几个命令连一连啊。
我的一个模板可以给你参考下
module.exports = {
&iomsg& : {
&url&: &mongodb://127.0.0.1:.0.1:.0.1:31002/iomsg&,
&options&: {
&uri_decode_auth&: false,
// 转码验证字符
// 写的复制服务器数
&wtimeout&: 500,
// 写的超时时间
&j&: true,
// 写等待日志磁盘同步
&slaveOk&: true
// 读负载均衡
&replSet&: {
&rs_name&: &myset&,
// 副本集名字
&poolSize&: 10,
// 每个服务器连接数
&socketOptions&: {
//&keepAlive&: 2,
&connectTimeoutMS&: 30000,
&socketTimeoutMS&: 500
&collections&: {
&users&: &users&,
&loggers&: &loggers&,
&msgs&: &msgs&,
&comments&: &comments&
require('mongodb').MongoClient.connect(url, options, function (err, db) {
// ...
太有帮助了 非常感谢 !!
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的既然使用Mongodb,就不得不用他的安全备份机制:副本集。
Mongodb副本集是什么东西?
& 通俗的讲就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。
需要指数的是:Mongodb的主从复制模式官方已经不在推荐使用了。
那么该如何实现呢?
&我用一台的机器的不同文件夹来做下模拟(生产环境下最好用不同的服务器来做物理隔绝)。
我的文件目录是:
F:\mongodb1\
F:\mongodb2\
F:\mongodb3\
那现在开始操作。
以上就是启动命令。
参数:port: Mongodb的监听端口
&&&&&&&& dbpath:数据文件存储路径
  && logpath:系统日志存放路径
&&&&&&&& replSet :副本集名称,我用的是test,其他的节点必须使用这个名字做副本集名称。
&&&&&&& logappend:日志的写入模式是追加,不是默认的覆盖模式。
同样对目录mongodb2,mongodb3使用以上命令,端口号分别是:,如下:
各个Mongodb启动以后,就只剩下一步了,把他们串在一起。(此处新打开一个cmd来操作,所有的命令都在这里执行,不要把这个关闭了)
首先通过执行:mongo --port 1111连接到Mongodb1的实例上
然后定义配置信息:config_test,
最后通过rs.initiate(config_test)启动副本集
至此整个副本集的配置已经完成。完成情况可通过rs.status()命令查看
这里面的几个参数说明下:
health:1&& //1表明状态是正常,0表明异常
state:1&&&& // 1表明是primary,2表明是slave,即做备份的机器
从结果看现在是一台主库,两台备份。
当一台服务器当掉会怎么样呢?
我们把mongodb1停掉,然后再运行rs.status(),如下
可以看到Mongodb已经当掉,这时候Mongodb3成为了主库。
配置完成后就免不了要做维护,关于维护请看我下篇文章
阅读(...) 评论()MongoDB集群上副本集(replica set)建立_数据库技术_Linux公社-Linux系统门户网站
你好,游客
MongoDB集群上副本集(replica set)建立
来源:Linux社区&
作者:Linux
1副本集的配置在单机上成功运行MongoDB后,要使用副本集来创建Mongodb集群,需要先关闭mongod守护进程,然后:
mongod --replSet setname --fork
来使用自己设置的副本集的名字setname并启动mongodb。注意,--fork可以不用,它的意义是让mongod 在后台执行,以方便在shell中运行别的程序。
如果要在配置文件中使用这些选项,可以在配置文件mongo.conf中加入
replSet=setnamefork=trueoplogSize=1024 #日志文件大小,兆(M)为单位。mongod启动时会创建相应大小的文件,如果设定太大会报磁盘空间不足的错误
然后使用 mongod -f mongo.conf 来启动进程
其他选项参见 http://docs.mongodb.org/manual/reference/program/mongod/#cli-mongod-replica-set
2.启动和增加节点在各个节点上使用了1.中的配置启动后,有两种方法来建立副本集的连接:
1)初始化副本集,增加节点配置用客户端登陆进入mongo使用
rs.initiate()
初始化副本集,等待一段时间(主要是创建日志文件oplog)后,看到提示符显示setname:PRIMARY& 也就是成功了,然后:
rs.config()
可以查看副本集的配置状态,比如:
{& & & & "_id" : "clover",& & & & "version" : 5,& & & & "members" : [& & & & & & & & {& & & & & & & & & & & & "_id" : 0,& & & & & & & & & & & & "host" : "host1:27017",& & & & & & & & & & & & "arbiterOnly" : false,& & & & & & & & & & & & "buildIndexes" : true,& & & & & & & & & & & & "hidden" : false,& & & & & & & & & & & & "priority" : 1,& & & & & & & & & & & & "tags" : {
& & & & & & & & & & & & },& & & & & & & & & & & & "slaveDelay" : 0,& & & & & & & & & & & & "votes" : 1& & & & & & & & }& & & & ] ...
目前只有一个主节点(primary),在确保可以访问另外两个节点的mongo服务的情况下,在本机的mongo shell中输入:
rs.add("hostname:port")
来增加节点,成功后使用:
[html] view plain copy print?rs.status()&
rs.status()来查看副本状态。
2)使用集群配置文档来创建副本集
这个方法我没有验证,如果要利用配置文档,在进入mongod shell之后,先要创建一个文档:
config = {&"_id"& : "setname",&"members" : [& {"_id" : 0, "host" : "host1:port"},& {"_id" : 1, "host" : "host2:port"},& {"_id" : 2, "host" : "host3:port"},& ...&]}
然后使用这个文档来启动副本集:
rs.initiate(config)
使用这种方法必须要用mongo shell来先创建配置文档,而不能使用配置文件。
3.测试副本集首先,使用
rs.isMaster()
{& & & & "setName" : "clover",& & & & "setVersion" : 7,& & & & "ismaster" : true,& & & & "secondary" : false,& & & & "hosts" : [& & & & & & & & "host1:27017",& & & & & & & & "host2:27017",& & & & & & & & "host3:27017"& & & & ],& & & & "primary" : "host1:27017",& & & & "me" : "host1:27017",& & & & "electionId" : ObjectId("d670c6331e5bf"),& & & & "maxBsonObjectSize" : ,& & & & "maxMessageSizeBytes" : ,& & & & "maxWriteBatchSize" : 1000,& & & & "localTime" : ISODate("T05:01:31.370Z"),& & & & "maxWireVersion" : 3,& & & & "minWireVersion" : 0,& & & & "ok" : 1}
这样来查看主节点和副本集的状态,值得一提的是,备份节点(secondary)如果设置属性hidden为0,则rs.isMaster()将不能观察到此节点,例如下面的代码:
[html] view plain copy print?cfg=rs.config() #获取当前的配置& cfg.members[2].priority=0 #让_id为2的节点优先级降为0& cfg.members[2].hidden=1 #设置此节点隐藏,仅当其优先级为0时有效& rs.reconfig(cfg) #应用配置&
cfg=rs.config() #获取当前的配置cfg.members[2].priority=0 #让_id为2的节点优先级降为0cfg.members[2].hidden=1 #设置此节点隐藏,仅当其优先级为0时有效rs.reconfig(cfg) #应用配置将_id为2的节点设为隐藏,使得其状态不被rs.isMaster看到,但它可以被rs.status()看到。
接着,在mongo shell插入一个文档:
for(i=0;i&1000;i++){test.coll.insert({count:i})}
db.coll.count() #测试插入文档是否成功
然后检查备份节点上的情况:
new Mongo("host2:27017")db.coll.count()1000
说明在host2上的数据库也更新了。
然后,尝试将host1上的mongod进程宕掉,这种情况在实际生产中可能出现,查看host2和host3的情况:
在host1的bash上:
sudo bin/mongod --shutdown killing process with pid: 15910
然后登陆host2上的mongo shell,发现提示符已经变为:setname&primary 表示host2已经变为主节点,在host2上db.coll.count()得到1000,表示备份的数据还在。
重新使用之前的集群配置文件来启动mongod -f mongo.conf ,发现提示符为setname:SECONDARY&表示其变为备份节点,在host2上用rs.isMaster()测试显示:
"setName" : "clover",& & & & "setVersion" : 9,& & & & "ismaster" : true,& & & & "secondary" : false,& & & & "hosts" : [& & & & & & & & "host1:27017",& & & & & & & & "host2:27017"& & & & ],& & & & "passives" : [& & & & & & & & "host3:27017"& & & & ],& & & & "primary" : "host2:27017",& & & & "me" : "zookeeper2:27017",&
副本集重新变为3台主机。host2仍为主节点,host3因为设置优先级为0变为消极(passives)状态,它不会被选为主节点。
更多MongoDB相关教程见以下内容:
编译安装 MongoDB与mongoDB的php扩展
CentOS 6 使用 yum 安装MongoDB及服务器端配置
13.04下安装MongoDB2.4.3
MongoDB入门必读(概念与实战并重)
Ubunu 14.04下MongoDB的安装指南
《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]
Nagios监控MongoDB分片集群服务实战
基于CentOS 6.5操作系统搭建MongoDB服务
MongoDB 的详细介绍:MongoDB 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (06月13日)
& (04月14日)
& (06月13日)
& (04月10日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款博客访问: 199492
博文数量: 65
博客积分: 0
博客等级: 民兵
技术积分: 1594
注册时间:
热衷技术,热爱交流
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: NOSQL
&副本集数据同步机制&
实例启动后,副本集成员首先通过一次初始化同步来复制数据,然后就开始利用oplog日志和主节点连续进行数据同步。如下日志反应这一过程
Wed Jul 17 13:18:39.473 [rsSync] replSet initial sync pending
Wed Jul 17 13:18:39.473 [rsSync] replSet syncing to: 192.168.69.44:10000
Wed Jul 17 13:18:39.476 [rsSync] build index local.me { _id: 1 }
Wed Jul 17 13:18:39.479 [rsSync] build index done. scanned 0 total records. 0.002 secs
Wed Jul 17 13:18:39.481 [rsSync] build index local.replset.minvalid { _id: 1 }
Wed Jul 17 13:18:39.482 [rsSync] build index done. scanned 0 total records. 0 secs
Wed Jul 17 13:18:39.482 [rsSync] replSet initial sync drop all databases
Wed Jul 17 13:18:39.482 [rsSync] dropAllDatabasesExceptLocal 1
Wed Jul 17 13:18:39.483 [rsSync] replSet initial sync clone all databases
Wed Jul 17 13:18:39.483 [rsSync] replSet initial sync cloning db: test
Wed Jul 17 13:18:39.485 [FileAllocator] allocating new datafile /mongodb/sh1/data/test.ns, filling with zeroes...0.001 secs
Wed Jul 17 13:18:39.497 [rsSync] build index test.test { _id: 1 }
Wed Jul 17 13:18:39.498 [rsSync] fastBuildIndex dupsToDrop:0
Wed Jul 17 13:18:39.498 [rsSync] build index done. scanned 1 total records. 0 secs
Wed Jul 17 13:18:39.498 [rsSync] replSet initial sync data copy, starting syncup
Wed Jul 17 13:18:39.498 [rsSync] oplog sync 1 of 3
Wed Jul 17 13:18:39.499 [rsSync] oplog sync 2 of 3
Wed Jul 17 13:18:39.499 [rsSync] replSet initial sync building indexes
Wed Jul 17 13:18:39.499 [rsSync] replSet initial sync cloning indexes for : test
Wed Jul 17 13:18:39.500 [rsSync] oplog sync 3 of 3
Wed Jul 17 13:18:39.500 [rsSync] replSet initial sync finishing up
Wed Jul 17 13:18:39.527 [rsSync] replSet set minValid=51e6290b:1
Wed Jul 17 13:18:39.527 [rsSync] replSet RECOVERING
Wed Jul 17 13:18:39.527 [rsSync] replSet initial sync done
Wed Jul 17 13:18:40.384 [rsBackgroundSync] replSet syncing to: 192.168.69.44:10000
Wed Jul 17 13:18:40.527 [rsSyncNotifier] replset setting oplog notifier to 192.168.69.44:10000
oplog:多机replication通过oplog来实现,primary向oplog写操作记录,每条记录包含了文档修改,删除,更新信息。secondary复制oplog并replay实现与primary的同步。oplog是capped collection,老的日志会被overwrite,如果secondary落后主节点数据量超过oplog大小,会被认为是stale node,它会进行全部primary sync操作,所以要根据实际情况预先设置好oplogSize。
oplog 在replica set中存在于local.oplog.rs集合,是一个capped collection,启动时候可以通过--oplogSize设置大小,对于linux 和windows 64位,oplog size默认为剩余磁盘空间的5%。
sh1:PRIMARY> db.printReplicationInfo()
configured oplog size: 23446.MB --配置的oplog日志大小
log length start to end: 23055secs (6.4hrs) --日志记录的文档的时间范围
oplog first event time: Wed Jul 17 2013 09:48:00 GMT+0800 (CST) --最早的日志时间
oplog last event time: Wed Jul 17 2013 16:12:15 GMT+0800 (CST) --最近一次的日志时间
now: Wed Jul 17 2013 16:12:18 GMT+0800 (CST)
下面命令展示的更为直观:
sh1:PRIMARY> db.getReplicationInfo()
"logSizeMB" : 23446.,
"usedMB" : 11.22,
"timeDiff" : 23521,
"timeDiffHours" : 6.53,
"tFirst" : "Wed Jul 17 :00 GMT+0800 (CST)",
"tLast" : "Wed Jul 17 :01 GMT+0800 (CST)",
"now" : "Wed Jul 17 :20 GMT+0800 (CST)"
节点之间数据同步方式有两种:Init sync和keep
Init sync同步在下面两种情况发生:
1. &secondary第一次加入,就会进行初始化同步,把所有的数据同步过来。
2. &Secondary被移出,重新移入后由于数据落后,也会进行init sync应用新的日志。如果节点落后的数量超过opolog大小,也就是说,oplog被覆盖过,那么他会启用一次全量备份,把所有数据复制过来。所以,已经有大量的数据时,加入一个新节点要注意全量复制带来的网络负担。应用高峰期时,不适合做这些操作。
Keep模式复制:
这种复制方式是持续性的,是主节点和副节点正常运行期间的数据同步方式。
Init sync过后,节点之间的复制方式就是实时同步了,一般情况下,secondaries从primary复制数据,但是secondary的复制对象可能会根据网络延时做出一些选择,也许会形成链式同步结构,参见/software-database/htm3_246718.shtml
如果两个副节点节在进行复制,那么要求设置相同的buildindex值(默认已经是true)。Secondaries不可能从延迟节点和隐藏节点复制数据。
手从修改syn target:
sh0:SECONDARY> db.adminCommand({replSetSyncFrom:"192.168.69.40:10000"})
& & & & "syncFromRequested" : "192.168.69.40:10000",
& & & & "prevSyncTarget" : "192.168.69.40:10000",
& & & & "ok" : 1
同步过程如下:
从数据源复制数据(源不一定非要primary),应用日志
建立相应索引
sh1:PRIMARY> db.printSlaveReplicationInfo()
source: & 192.168.69.45:10000
syncedTo: Wed Jul 17 :29 GMT+0800 (CST)
= 32 secs ago (0.01hrs)
source: & 192.168.69.46:10000
syncedTo: Wed Jul 17 :29 GMT+0800 (CST)
= 32 secs ago (0.01hrs)
可以使用调试命令观察secondary最后同步的一条日志信息:
sh1:SECONDARY> rs.debug.getLastOpWritten()
&&&&&&&&"ts" : {
&&&&&&&&&&&&&&&&"t" : ,
&&&&&&&&&&&&&&&&"i" : 1
&&&&&&&&},
&&&&&&&&"h" : NumberLong("7625437"),
&&&&&&&&"v" : 2,
&&&&&&&&"op" : "i",
&&&&&&&&"ns" : "test.test",
&&&&&&&&"o" : {
&&&&&&&&&&&&&&&&"_id" : ObjectId("51e7ee01b5ed8bdc9436becf"),
&&&&&&&&&&&&&&&&"name" : 5258
可通过db.oplog.rs.find().sort({$natural:-1})查看opolog日志:
{ "ts" : { "t" : , "i" : 1 }, "h" : NumberLong("7625437"), "v" : 2, "op" : "i", "ns" : "test.test", "o" : { "_id" : ObjectId("51e7ee01b5ed8bdc9436becf"), "name" : 5258 } }
oplog结构:
由7部分组成:{ts:{},h{},v{} op:{},ns:{},o:{},o2:{} }
ts:8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示
h: 一个哈希值(2.0+),确保oplog的连续性
op:1字节的操作类型
ns:操作所在的namespace。
o:操作所对应的document
o2:在执行更新操作时o只记录id而o2记录具体内容,仅限于update
op操作类型:
“i”:insert操作
“u”:update操作
“d”:delete操作
“c”:db cmd操作
"db":声明当前数据库 (其中ns 被设置成为=>数据库名称+ '.')
"n": &no op,即空操作,定期执行以确保时效性&
阅读(1530) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 mongo 创建collection 的文章

更多推荐

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

点击添加站长微信