加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MongoDB中isMaster命令在不同类型mongo实例上的执行结果总结

(2016-05-17 11:13:52)
标签:

mongodb

ismaster命令

分类: IT那点事儿说起来却也又臭又长
       最近本博主在阅读MongoDB的Golang版本驱动mgo的源代码,一来是想通过阅读一些优秀的Golang项目代码进一步学习Golang的高级用法,二来是因为目前公司的一些项目都在使用mgo作为MongoDB的驱动,理解其内部实现有助于更好地使用它,三来则是想通过阅读驱动代码迫使自己更加细致地去了解MongoDB的通信协议,从另一个角度加深对MongoDB自身功能的了解。

       在mgo中所有对MongoDB服务器的读写操作均通过Session来完成,无论Session连接的是MongoDB单点、复制集还是分片集群中的mongos。当Session首次被创建去连接参数给定的MongoDB服务器种子节点的时候,Session本身需要去识别它要连接的MongoDB服务器到底是单点、复制集还是mongos。如果连接的是MongoDB复制集,在参数没有提供全部节点列表的时候,Session需要主动去发现列表中未给出的节点。另外,因为复制集在发生Failover时可能会发生Primary节点切换导致复制集内部节点角色的变化,所以Session内部也需要有一个定期同步节点信息的机制。用来完成以上这些工作的核心方法很简单,就是向各个节点发送isMaster命令。

       话说本博主在看mgo的源代码前,根本没想到一条简单的isMaster命令可以做这么多事情。究其原因就是因为isMaster命令在不同类型的mongo实例上,其执行结果存在不小的差异。于是乎本博主做了一点体力工作,在不同mongo实例上都跑了一下isMaster命令,现总结执行结果如下,供各位看客们参考。

1、单点MongoDB实例
> db.isMaster()
{
"ismaster" : true,
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-05-11T02:02:57.263Z"),
"maxWireVersion" : 3,
"minWireVersion" : 0,
"ok" : 1
}

2、复制集中Primary实例
testReplSet:PRIMARY> db.isMaster()
{
"hosts" : [
"192.168.100.9:57017",
"192.168.100.10:57017",
"192.168.100.11:57017"
],
"setName" : "testReplSet",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.100.11:57017",
"me" : "192.168.100.11:57017",
"electionId" : ObjectId("7fffffff0000000000000001"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-05-11T02:06:34.630Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}

3、复制集中Secondary实例
testReplSet:SECONDARY> db.isMaster()
{
"hosts" : [
"192.168.100.9:57017",
"192.168.100.10:57017",
"192.168.100.11:57017"
],
"setName" : "testReplSet",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.100.11:57017",
"me" : "192.168.100.9:57017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-05-11T02:07:46.497Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}

4、分片集群中mongos实例
mongos> db.isMaster()
{
"ismaster" : true,
"msg" : "isdbgrid",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-05-16T02:14:05.036Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}

5、分片集群中configsvr实例(镜像方式部署,MongoDB 3.2之后configsvr可部署为复制集
configsvr> db.isMaster()
{
"ismaster" : true,
"configsvr" : 0,
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-05-16T02:22:53.447Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}

       从以上结果可知,单点mongod实例、mongos实例和configsvr实例几乎是相同的,因为三者虽然角色不同,但本质上都是单点实例,这三类实例返回的isMaster字段均为true,区别在于mongos实例多了一个类型为字符串的msg字段,该字段的值永远为isdbgrid,而configsvr实例多了一个整数型的configsvr字段,该字段代表了配置服务器使用的协议类型,其中0代表了旧版本的SCCC协议,而1则代表了新版本的CSRS协议。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有