当前位置:数据库 > mongodb >>

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 参数,不然会添加失败。
 
三、
 
续上篇 笔记2 ,还是说一下关于MongoDB 认证的问题。 在 王文龙 所写的 《MongoDB 实战》 中,写到: 创建主从key 文件,用于标识集群的私钥的完整路径,如果各个实例的key file 内容不一 致,程序将不能正常用。 我误以为 –keyFile 是各个节点之间的认证方式。其实不是的。各个节点之间的确认关系参数是 –replSet。只要此参数后面的内容一致。Replica Set 就可以创建成功。 在官方文档中提到:You do not need to use the –auth option, too (although there’s no harm in doing so), –keyFile implies –auth. –auth does not imply –keyFile. 也就是说keyFile 其实包含了auth 的作用。[...]
 
续上篇 笔记2 ,还是说一下关于MongoDB 认证的问题。
在 王文龙 所写的 《MongoDB 实战》 中,写到:
 
创建主从key 文件,用于标识集群的私钥的完整路径,如果各个实例的key file 内容不一 致,程序将不能正常用。
 
我误以为 –keyFile 是各个节点之间的认证方式。其实不是的。各个节点之间的确认关系参数是 –replSet。只要此参数后面的内容一致。Replica Set 就可以创建成功。
 
在官方文档中提到:
 
You do not need to use the –auth option, too (although there’s no harm in doing so), –keyFile implies –auth. –auth does not imply –keyFile.
 
也就是说keyFile 其实包含了auth 的作用。
 
而当你加了 –keyFile 参数后,如果你要添加Shard,则会收到报错:
 
need to login
 
这和加了auth 的报错一致。
 
以前没接触过MongoDB,直接从2.0 使用,所以里面的有些细节可能还不理解。看到有人说auth 是2.0 的新功能。而之前只能用keyFile 验证。还不太清楚keyFile 下用户登陆的一些细节。  
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,