设为首页 加入收藏

TOP

mongodb常见问题 (一)
2014-11-23 22:58:32 来源: 作者: 【 】 浏览:16
Tags:mongodb 常见问题
一、
1. addshard 遇到的错误db.runCommand({addshard:”172.16.5.104:20000″}) { “ok”: 0, “errmsg”: “can’t use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs host: 172.16.5.104:20000 isLocalHost:0″} 遇到这样的错误是由于某些服务启动在localhost 地址。 经过检查发现route 启动时,读取config 服务是读取的localhost 地址:./mongos –port 40000 –configdb localhost:30000 –fork [...]

1. addshard 遇到的错误

db.runCommand({addshard:”172.16.5.104:20000″})
{
“ok” : 0,
“errmsg”: “can’t use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs host: 172.16.5.104:20000 isLocalHost:0″
}

遇到这样的错误是由于某些服务启动在localhost 地址。
经过检查发现route 启动时,读取config 服务是读取的localhost 地址:

./mongos –port 40000 –configdb localhost:30000 –fork –logpath /data/route/log/route.log –chunkSize 1

将localhost 修改为IP 地址,问题解决。

2. 为什么要同时有config 和route

一开始看到config 和route 的逻辑结构有一点疑惑。既然一个 数据库查询的过程是:

客户端
|
route
|
config
|
Database

而config 的作用就是告诉route 应该去哪一个Database 取数据。那么为什么不能直接由客户端向config 发起请求呢?这时route 的存在岂不是多余?
简单的思考之后,得出了以下结论:

在有多个route 和多个config 的情况下,route 与route 之间是平行的存在,也就是说,一个route 并不知道另外一个route 的存在。但是一个route 知道所有config 的存在。
那么当要写入数据时,只要你是通过了route,route 就会通知到所有的config,那么每一个config 便会知道数据是如何分片的。
如果将route 这层去掉,那么config 与config 之间并不知道彼此的存在。客户端的请求很可能会只发向其中的一个config,那么也只有这一个config 知道最新的分片状态。

这个答案其实经不起太多的推敲,比如:

config 是可以从客户端那里拿到所有config 的列表的,一旦有了列表之后,config 就可以彼此相互通信了。可以解决数据同步的问题。

我还要看多一些文档。

3. Replica Set 启动顺序
在启动两个rs 机器时,我先启动了second,后启动了Primary。这是一台机器上显示自己为second,另外一台为unreachable。而另外一台机器显示两台机器均在second。

这个现象需要验证,是否Replica Set 是有启动顺序限制。

二、

昨天到今天一直在尝试在同一台机器上用多个IP地址来创建Replica Set + Shard。 由于MongoDB 官方用户验证方面的文档说的也不太细。所以走了一些回头路。 下面整理一些常见的错误,以及他们可能表达的意思。描述的顺序是按照排错的逻辑:1. route 启动的时候,连接config 不可以以localhost 为地址链接。不然会遇到以下错误: “errmsg”: “can’t use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs host: 172.16.5.104:20000 isLocalHost:0″2. 如果不以localhost 为地址链接,那么config 启动的时候不能加 –auth 选项,不然会在log文件中遇到以下错误:ERROR: [...]

昨天到今天一直在尝试在同一台机器上用多个IP地址来创建Replica Set + Shard。
由于MongoDB 官方用户验证方面的文档说的也不太细。所以走了一些回头路。
下面整理一些常见的错误,以及他们可能表达的意思。描述的顺序是按照排错的逻辑:

1. route 启动的时候,连接config 不可以以localhost 为地址链接。不然会遇到以下错误:

“errmsg”: “can’t use localhost as a shard since all shards need to communicate. either use all shards and configdbs in localhost or all in actual IPs host: 172.16.5.104:20000 isLocalHost:0″

2. 如果不以localhost 为地址链接,那么config 启动的时候不能加 –auth 选项,不然会在log文件中遇到以下错误:

ERROR: config servers not in sync! not authorized, did you start with –keyFile

此时进程无法启动

3.在route 和config 准备完毕后,通过route 以远程IP 为地址添加shard,则报错:(有 –auth 参数)

db.runCommand({addshard:’a1:28010′})
{
“ok” : 0,
“errmsg”: “failed listing a1:28010′s databases:{ errmsg: \”need to login\”, ok: 0.0 }”
}

4. 去掉 –auth 参数,添加shard,成功!

5. 依旧保留 –auth 参数,添加用户后,再添加shard。报错:

“errmsg” : “couldn’t connect to new shard DBClientBase::findN: transport error: a1:28010 query: { getlasterror: 1 }”

总结:MongoDB 2.0 的认证方式

1.Replica Set 之间通过key 来相互认证。
2.Route 与Config 之间不存在认证关系,Route 连接Config 时不能以localhost 连接。
3.单个Mongod进程启动后,如果无 –auth 选项且无用户,则必须通过localhost 连接才能添加用户和做其他操作。如果通过远程(非127.0.0.1的IP地址)连接,则必须要输入用户名、密码。此时如果还无用户存在,则无法连接。
4.添加Shard 时,mongod 不可以带 –auth
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇PostgreSQL的连接问题汇总 下一篇10g即时客户端在不同系统环境下的..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: