mongodb 查看复制集3.0 单点 怎么转 复制集

相关文章推荐
简单的在本机c盘下方了两个目录,mongodb模拟主服务,_1模拟从服务。唯一不同的是配置文件的区别。
dbpath=C:\mongodb\data\db
【注意:MongoDB自动将_id字段设置为主键】
------------------------------------------------------------------...
一个可用的复制集。
一个拥有数据集的MongoDB节点,且可以与现有复制集通讯。
否则,请参考 installation tutorial 和 部署复制集 。
详细介绍了复制集中的成员,以及每个成员的特点和使用方式。
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)相关文章推荐
Open MongoVUE and connect to the server that contains the collection “cities”
1:简单介绍
MongoDB是一款分布式文档数据库,支持类似关型数据库的主从结构,文档以二进制Json形式存储,无锁,无事务,有索引。
2:安装步骤
第一步:下载程序集htt...
1.1 企业Linux运维场景数据同步方案
1.1.1 文件级别的异机同步方案
1、scp/sftp/nc 命令可以实现远程数据同步。
2、搭建ftp/http/svn/nfs 服务器,然后在客...
MySQL主从复制原理、半同步操作步骤及原理标签(空格分隔): mysql1.1 企业Linux运维场景数据同步方案1.1.1 文件级别的异机同步方案
1、scp/sftp/nc 命令可以实现远程...
windows7 64位机上配置支持GPU版(CUDA7.5)的OpenCV2.4.13操作步骤
使用场景:
假如你的项目(这里指的是手机客户端项目)的某个版本(例如1.0版本)已经完成开发、测试并已经上线了,接下来接到新的需求,新需求的开发需要修改多个文件中的代码,当需求已经开始开发一段时间的时...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)MongoDB 复制集 (三) 内部数据同步
一 数据同步
一个健康的secondary在运行时,会选择一个离自己最近的,数据比自己新的节点进行数据同步。选定节点后,它会从这个节点拉取oplog同步日志,具体流程是这样的:
a.执行这个op日志
b.将这个op日志写入到自己的oplog中(local.oplog.rs)
c.再请求下一个op日志
如果同步操作在第1步和第2步之间出现问题宕机,那么secondary再重新恢复后,会检查自己这边最新的oplog,由于第2步还没有执行,所以自己这边还没有这条写操作的日志。这时候他会再把刚才执行过的那个操作执行一次。那对同一个写操作执行两次会不会有问题呢?MongoDB在设计oplog时就考虑到了这一点,所以所有的oplog都是可以重复执行的,比如你执行
{$inc:{counter:1}} 对counter字段加1,counter字段在加1 后值为2,那么在oplog里并不会记录 {$inc:{counter:1}} 这个操作,而是记录 {$set:{counter:2}}这个操作。所以无论多少次执行同一个写操作,都不会出现问题。
注:从节点不一定要从主节点的操作日志来读取数据,它也可以选择距离自己最近的(根据ping的时间来计算)的且比自己操作日志记录更新的从节点获取操作日志。
当我们在MongoDB时执行一个写操作时,默认会直接返回成功,同时也可以通过设置w参数,指定这个写操作同步到几个节点后才返回成功。如下:
db.foo.runCommand({getLastError:1, w:2})
上面例子就是执行getLastError命令,使其在上一个写操作同步到两个节点上后再返回。不同的客户端可能在写法上不太一样,不过这个功能应该都是有的。对于重要数据,可以考虑采用这样的方式,通过牺牲一部分写性能来提升数据的安全性。
这个功能是如何实现的呢,primary节点是如何知道数据同步了几份呢?在调用上面命令时,实际上MongoDB内部执行了如下的一些流程:
a.在primary上完成写操作
b.在primary上记录一条oplog日志,日志中包含一个ts字段,值为写操作执行的时间,比如本例中记为t
c.客户端调用{getLastError:1, w:2}命令等待primary返回结果
d.secondary从primary拉取oplog,获取到刚才那一次写操作的日志
e.secondary按获取到的日志执行相应的写操作
f.执行完成后,secondary再获取新的日志,其向primary上拉取oplog的条件为{ts:{$gt:t}}
g.primary此时收到secondary的请求,了解到secondary在请求时间大于t的写操作日志,所以他知道操作在t之前的 日志都已经成功执行了
h.这时候getLastError命令检测到primary与secondary都完成了这次写操作,于是 w:2 的条件满足了,返回给客户端成功
注意:1.如果设置的w参数大于当前复制集中的从节点数目的话,写入操作会被阻塞,一直到写入节点数达到w参数所设置的数据才会返回。
2.将W参数设置成当前负责集合中从节点的数目的话,这个复制集将会对外提供强一致性的服务,但是整个复制集的写性能也会下降。
启动初始化
当一个新节点启动并加入到现在的Replica Sets中时,这时候新启动的节点会查看自己的oplog,通过一个叫 lastOpTimeWritten 的命令查找到它最近的一条写操作。这个命令你也可以随便在命令行执行:
& rs.debug.getLastOpWritten()
这个命令会返回一条oplog记录,其中的ts字段就是最近一次写操作的时间了。
如果你这个节点是全新的,没有数据,那么oplog里也没有数据,这时候节点会选择执行一次全量的同步。本文暂时不对全量同步的方法进行描述。
选择同步源节点
Replica Sets中的节点之间总在同步数据,但是他们不是通过传统的一主多从的方式来同步的。MongoDB的策略是选择一个合适的节点作为数据源。
首先secondary节点会通过ping的时间来确定其它节点与它的距离。时间越长的识为距离越远。然后通过下面方法确定其源节点:
for each member that is healthy:
if member[state] == PRIMARY
add to set of possible sync targets
if member[lastOpTimeWritten] & our[lastOpTimeWritten]
add to set of possible sync targets
sync target = member with the min ping time from the possible sync targets
对于节点是否healthy的判断,各个版本不同,但是其目的都是找出正常运转的节点。在2.0版本中,它的判断还包括了salve delay这个因素。
你可以通过运行db.adminCommand({replSetGetStatus:1})命令来查看当前的节点状况,在secondary上运行这个命令,你能看到syncingTo这个字段,这个字段的值就是这个secondary的同步源。(其实名字应该是叫syncingFrom,但是由于版本兼容的原因,沿用了这个错误的名字)
链式同步结构
vcq9vfjQ0M2ssr2ho8v50tTH6b/2u+G4tNTT0rvQqaGjPC9wPgo8cD4KICAgICAgICAgscjI587Sw8fT0L3ateNBo6zOqnByaW1hcnm92rXjo6zIu7rzQr3atePOqnNlY29uZGFyeb3ateOjrMv8tNNBvdq1482ssr3K/b7do6zNrMqx09bT0HNlY29uZGFyeb3ateNDo6zL/LTTzazKx3NlY29uZGFyebXEQr3atePNrLK9yv2+3aGj1eLR+UEtJmd0O0ItJmd0O0PWrrzkvs3QzrPJwcvSu7j2wbTKvbXEzayyvb3hubmho8jnufvO0sPHyei2qHfOqjOjrMTHw7RBvdq148jnus7E3NaqtcBDvdq149LRvq2000K92rXjzayyvbPJuabBy8TYo788L3A+CgogICAgICAgINXiysfNqLn9b3Bsb2fNrLK90K3S6cC0yrXP1rXEo6zO0sPH08PNqMvXtcTT79HUwLS94srN0rvPwm9wbG9ntcTNrLK90K3S6aGjCgo8YnI+CgoKICAgYS61sUO000LNrLK9yv2+3cqxo6xDu+HU2tCt0unW0LbUQsu1o7rO0tKqtNPE49Xizayyvcr9vt3By6OsyOe5+9C0stnX99PQd7LOyv21xLuwo6zO0rXEzayyvdKyy+PJz7DJoaMKICAgYi7Iu7rzQrvhu9i08Mu1o7rO0rK7ysfSu7j2cHJpbWFyeb3ateOjrM7Su+Gw0cTjtcTV4rj2vMbK/deqtb3O0rXEzayyvdS0yc/IpTxicj4KICAgYy7Iu7rzQtTZttRBtPK/qtK7uPbQwrXEway906OssqLH0rbUQcu1o7rV4rj2way908Tjvs21sbPJysdDtcSwyaOs0rLL49K7uPa8xsr91Np3wO+hozxicj4KICAgZC7V4sqxuvLU2kG/tMC0o6y+zdPQwb249sGsvdPBrLW9y/vJz8Pmo6zSu7j2ysdCo6zSu7j2ysfQ6cTitcRDo6zV4sG9uPbBrL3TtrzE3LGouObL+8u1zeqzycHLzayyvbLZ1/ehozxicj4KPHA+CiAgICAgICAgtbHSu7j20LSy2df31NpByc/WtNDQuvOjrELK18/IzayyvbW91eK49rLZ1/e1xG9wbG9no6zWtNDQzeq687vhuObL30GjrM7S1rTQ0M3qwcuho8i7uvNDzazR+bTTQsnPu/HIobW9QrXEb3Bsb2ejrNKy1rTQ0MHL1eLSu8z10LSy2df3o6zIu7rzy/u45svfQqOsztLWtNDQzerBy6OsQtTaytW1vdXiuPbP7NOmuvOjrLvhzai5/bjVssW/qs2otcTQ6cTizai1wLj6Qcu1o6zO0srH0OnE4rXEQ73ateOjrM7S0rLN6rPJ0LSy2df3wcuho9XiyrG68kG+zdaqtcCjrEGhokKhokPI/bj2vdq147a8zeqzydC0stnX98HLoaN3o7oztcTM9bz+wvrX46OsyLu687e1u9i4+LX308NnZXRMYXN0RXJyb3K1xL/Nu6e2y6OszeqzydXitM6y2df3oaM8L3A+CjxwPgq+38zlyP249r3ateO85LXEway908jnz8LNvKO6PC9wPgo8cHJlIGNsYXNzPQ=="brush:">C
B和A之间有两条通道,双线那条是真正的同步连接,单线那条是一个虚拟连接。
注意:MongoDB这种链式同步结构类似于Hadoop中HDFS中数据块的流式复制,这样的好处是可以大大减轻主节点的压力,提高数据同步的速度。
三 新功能展望
上面就是当前的Replica Sets同步的内部实现,在后续这一块MongoDB还会进行一些新特性的开发。在2.2版本中,会提供replSetSyncFrom命令,让用户可以手动设置一个secondary的同步源。使用方法大概是这样:
& db.adminCommand({replSetSyncFrom:&otherHost:27017&})mongodb3.0 单点 怎么转 复制集_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
mongodb3.0 单点 怎么转 复制集
我有更好的答案
conf()来查看复制集的配置[javascript] &gt: 1,
&members&quot:02.291 [initandlisten] ** WARNING: 0,
&name& : &quot: /rs0&;set& : & : ISODate(&T01:40: 0,
&host& : &data/mongod:30000&
7. 启动一个新的mongod服务[javascript] bash-3.2$ mkdir -p &#47. 我们还可以用 , 1): Timestamp(.status()来查看复制集的运行状态[javascript] rs0.shutdownServer()命令来停止mongod[javascript] &,
&version&date&db --logpath &#47,
&quot. Number of files is 256; :07Z&),
&myState& ;,
6.&Config now saved locally.
Should come online in about a minute:30000&;
switched to db admin
& db.shutdownServer()
2. 使用--replSet的选项加上新的复制集的名字来重新启动这个mongod[javascript] bash-3.2$ mongod --dbpath /data/health& :PRIMARY& rs.status()
&stateStr& : &optime&quot: [
&_id& ; : 2185,
&quot. 在mongo shell里创建一个包含复制集配置信息的对象[javascript] rsconf = {
Mon Jul 29 11:28;test
Server has startup warnings: 1,
&members&quot.log
child process db2 --logpath /data/localhost.0;data/mongod.
forked process: 3092
all output going to.2$ mongo --port 30000
MongoDB shell version: 2.5
connecting to: 127;PRIMARY&:30000&#47.log --logappend --fork --port 30000 --replSet rs0
about to fork child process, waiting until server is ready for connections.4.conf()
&_id&quot: 0,
host: &quot.initiate()来初始化复制集[javascript] & . 初始化完毕后; rs: &rs0& ;,
members: [
&_id&quot: 1,
&state& ,我们可以用data/db2
bash-3.2$ mongod --dbpath /data&#47:30000&
5. 用rs.0:
rs.1: ISODate(&T02:15,
&quot:44Z&),
&self& : true
8, parent exiting
3. 连接刚才启动的数据库[javascript] bash-3.initiate( rsconf )
&info& : &quot:02.291 [initandlisten]
Mon Jul 29 11:28;optimeDate&quot: [
&quot, should be at least 1000
4;uptime& ; ; ;localhost: &rs0&quot1. 停止单节点的mongod我们可以从mongo shell里运行db2/mongod.log --logappend --fork --port 30001 --replSet rs0
about to fork child process, waiting until server is ready for connections.
forked process: 3118
all output going to: /data/db2/mongod.log
child process started successfully, parent exiting
9. 将新的mongod添加到复制集里[javascript] rs0:PRIMARY& rs.add(&localhost:30001&)
{ &ok& : 1 }
10. 再启动一个新的mongod服务来作为仲裁节点[javascript] bash-3.2$ mkdir -p /data/arb
bash-3.2$ mongod --dbpath /data/arb --logpath /data/arb/mongod.log --logappend --fork --port 30002 --replSet rs0
about to fork child process, waiting until server is ready for connections.
forked process: 3124
all output going to: /data/arb/mongod.log
child process started successfully, parent exiting 11. 将新启动的mongod服务作为仲裁节点添加到复制集中[javascript] rs0:PRIMARY& rs.addArb(&localhost:30002&)
{ &ok& : 1 }
12. 查看复制集的状态[javascript] rs0:PRIMARY& rs.status()
&set& : &rs0&,
&date& : ISODate(&T02:18:20Z&),
&myState& : 1,
&members& : [
&_id& : 0,
&name& : &localhost:30000&,
&health& : 1,
&state& : 1,
&stateStr& : &PRIMARY&,
&uptime& : 2378,
&optime& : Timestamp(, 1),
&optimeDate& : ISODate(&T02:17:56Z&),
&self& : true
&_id& : 1,
&name& : &localhost:30001&,
&health& : 1,
&state& : 2,
&stateStr& : &SECONDARY&,
&uptime& : 34,
&optime& : Timestamp(, 1),
&optimeDate& : ISODate(&T02:17:56Z&),
&lastHeartbeat& : ISODate(&T02:18:18Z&),
&lastHeartbeatRecv& : ISODate(&T02:18:18Z&),
&pingMs& : 0,
&syncingTo& : &localhost:30000&
&_id& : 2,
&name& : &localhost:30002&,
&health& : 1,
&state& : 7,
&stateStr& : &ARBITER&,
&uptime& : 24,
&lastHeartbeat& : ISODate(&T02:18:18Z&),
&lastHeartbeatRecv& : ISODate(&T02:18:19Z&),
&pingMs& : 0
资深电脑人
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包}

我要回帖

更多关于 mongodb 复制集合 的文章

更多推荐

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

点击添加站长微信