MongoDb Replica Set中使用的地址
Unable to connect to a member of the replica set matching the read preference Primary
今天尝试使用MongoDB Replica Set提供的自动故障恢复功能一直无法成功,总是遇到上面这个错误。好一顿整终于找到的原因,由于这里还比较有迷惑性,特此记录一下供其他人参考。
其实Google一下这个错误,在前几条结果中就有答案,但是该死的GFW屏蔽了Google Group,导致我跳过了那条结果而一直没有找到正确答案,我可以骂脏话吗?
进入正题,我们知道使用Replica Set是要在连接字符串中加入所有结点的地址(建议这么做,但并不是强制。关于连接字符串参考这里)。以我为机器为例,我的Windows在虚拟机192.168.122.100上,MongoDB运行在物理机192.168.122.1中的三个实例上,分别是:
192.168.122.1:
192.168.122.1:
192.168.122.1:
因此我的连接字符串大概会是这个样子(ReplicaSet为rs0):
mongodb://192.168.122.1,192.168.122.1:27011,192.168.122.1:27012/Cart?replicaSet=rs0
然后我到MongoDB的实例上建立了Replica Set:
yaoxing@YX-ARCH ~ $ mongo localhost
MongoDB shell version: 2.4.
connecting to: test >rs.initiate()
然后尝试把其他两个实例添加到Replica Set中:
rs.add("localhost:27011");
rs.add("localhost:27012");
发生了错误:
{
"errmsg" : "exception: can't use localhost in repl set member names except when using it for all members",
"code" : 13393,
"ok" : 0
}
最容易想到的就是把localhost更换成机器名了,于是
rs.add("YX-ARCH:27011")
rs.add("YX-ARCH:27012")
成功,一切看起来都很美好,但其实问题就已经在这里发生了。如果尝试关闭Primary,就会有另外一个实例从Secondary变为Primary,这点没有问题。但客户端始终会抛出本文开头那个异常,无法自动切换到新的Primary上。原因如下:
如果仔细看MongoDB的文档,你会发现其实在连接字符串中写进所有的结点并不是必要的,但如果只写一个结点的话,必须要加上?replicaSet=[set name]参数(原因参考文档)。为什么可以只写一个结点?因为当Driver连接上一个结点之后会从该结点获取其他结点的信息,这样做是为了以后动态添加新结点的时候Driver可以从结点信息中自动识别,而不必每次都修改连接字符串。当然如果只写一个结点的话,坏处就是当这个结点挂了的时候Driver就不知道去哪找其他结点的信息了。
由此我们可以发现,有几台服务器并不是从你的连接字符串中发现的,而是当Driver连接上某一台服务器后,从中获取的。所以从以上的例子中获取了什么东西?
rs0:PRIMARY> rs.conf()
{
"_id" : "rs0",
"version" : 7,
"members" : [
{
"_id" : 0,
"host" : "YX-ARCH:27017",
"priority" : 20
},
{
"_id" : 1,
"host" : "YX-ARCH:27011",
"priority" : 30
},
{
"_id" : 2,
"host" : "YX-ARCH:27012",
"priority" : 20
}
]
}
一共三个HOST
YX-ARCH
YX-ARCH:27011
YX-ARCH:27012
明眼人应该看出来了,YX-ARCH这个东西在我的虚拟机中不存在,因此C# Driver发现连接字符串最终无法连接到成为新Primary的YX-ARCH:27011,而唯一可以连接的192.168.122.1是Secondary身份,我又没有指定readPreference,因此不可读。悲剧就这么发生了。
当然知道了原因,解决方案也很简单:
在replica set中和连接字符串中使用相同的HOST地址就可以完美解决问题
希望对遇到同样问题的人有所帮助。
MongoDb Replica Set中使用的地址的更多相关文章
- MongoDB Replica Set搭建集群
MongoDB做集群,版本3.2官网推荐的集群方式Replica Set 准备服务器3台 两个standard节点(这两个节点直接可以互切primary secondary). 一个arbiter节点 ...
- mongodb replica set 和 nodejs中使用mongoose连接replica
一.mongodb replication 介绍 官网上的第一句话就是Replication is the process of synchronizing data across multiple ...
- MongoDB Replica Set 选举过程
什么是选举? 选举是副本集选择某个成员成为primary的过程.primary是一个副本集中唯一能够接收写操作的成员. 下面的事件能够引发一次选举: 第一次初始化一个副本集 Primary失效.rep ...
- 关于MongoDb Replica Set的故障转移集群——实战篇
如果你还不了解Replica Set的相关理论,请猛戳传送门阅读笔者的上一篇博文. 因为Replica Set已经属于MongoDb的进阶应用,下文中关于MongoDb的基础知识笔者就不再赘述了,请参 ...
- (转载)MongoDB C#驱动中Query几个方法
MongoDB C#驱动中Query几个方法 Query.All("name", "a", "b");//通过多个元素来匹配数组 Query ...
- MongoDB 学习笔记(三) MongoDB (replica set) 集群配置
MongoDB Replica Sets的结构类似于以集群,完全可以把他当成一个集群,因为他确实与集群实现的作用是一样的:如果其中一个节点出现故障,其他的节点会马上将业务接管过来.而无需停机操作 Mo ...
- MongoDB数据库设计中6条重要的经验法则
Part 1 原文:6 Rules of Thumb for MongoDB Schema Design: Part 1 By William Zola, Lead Technical Support ...
- (1)解锁 MongoDB replica set核心姿势
副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移. 这样的结构通常需要具有奇数 ...
- java正则表达式获得html字符串中<img src>的src中的url地址
/** * 得到网页中图片的地址 */ public static Set<String> getImgStr(String htmlStr) { Set<String> pi ...
随机推荐
- POJ 1703
种类并查集,基本思想是每次压缩路径都必须同时更新子节点和根节点的关系,这种关系是通过子节点和父亲节点的关系,以及父亲节点与根节点的关系运算出来. 压缩路径的findme();参考了大神的代码,做的第二 ...
- poj 3026 Borg Maze 最小生成树 + 广搜
点击打开链接 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7097 Accepted: 2389 ...
- Mplayer 官方中文手册
MPlayer 名称总览描述交互式控制用法配置文件配置集通用选项播放器选项(仅适用于MPLAYER)分离器/媒体流选项OSD/字幕选项音频输出选项(仅适用于MPLAYER)音频输出驱动(仅适用于MPL ...
- 《Code Complete》ch.16 控制循环
WHAT? 反复执行的代码片段(你是第一天学编程吗) WHY? 知道如何使用及何时使用每一种循环是创建高质量软件的一个决定性因素 HOW? 检测位于循环开始/循环结尾 带退出的循环 进入循环 只从一个 ...
- Android:Activity的跳转
// 实际开发中常用的方法 Intent intent = new Intent(); intent.setClass(MainActivity.this, LoginActivity.class); ...
- opencv基于HSV的肤色分割
//函数功能:在HSV颜色空间对图像进行肤色模型分割 //输入:src-待处理的图像,imgout-输出图像 //返回值:返回一个iplimgae指针,指向处理后的结果 IplImage* SkinS ...
- windows下忘记mysql密码怎么办
长时间不用mysql,密码忘记了怎么办,按照下面的步骤可以重新设置密码: 1.先把mysql服务停了,右键计算机-->选择管理-->选择服务和应用程序-->选择服务-->找到m ...
- 性能测试脚本新玩法---fiddler&&Jmeter
飞测说:最近接触移动项目,测试app,需要做移动app的性能测试,想通过代理来录制,但是jmeter的代理录制效果真心不是很好,自己一个个请求来写代码,太浪时间了,那么有没有其他的办法呢? 我们都知道 ...
- 【LeetCode】21. Merge Two Sorted Lists
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- 【测试】使用hr用户下的employees和departments表写一条SQL语句,(MG连接)
SQL> select * from employees d, departments t where d.department_id=t.department_id; rows selecte ...