我有以下配置的Mongo数据库集群:
在意外重启应用程序服务器后,我发现当我尝试运行 show collections 时,mongos开始显示错误。
mongos> show collections;
Mon Feb 3 22:50:21.680 error: {
"$err" : "error loading initial database config information :: caused by :: Couldn't load a valid config for database.stats_archive_monthly after 3 attempts. Please try again.",
"code" : 13282
} at src/mongo/shell/query.js:128
但是,所有 mongo 服务器和 mongo config 服务器都运行正常且日志中没有问题。
首先,我尝试重新启动群集中的每个服务器但没有成功。错误仍然存在。
然后在对mongo源进行一点检查之后,我发现这个错误可能是由于碎片键的重叠范围造成的。
查看破碎集合的分片信息,我注意到了这一点:
database.stats_archive_monthly
shard key: { "a" : "hashed" }
chunks:
rs1 6
rs0 6
{ "a" : { "$minKey" : 1 } } -->> { "a" : NumberLong("-7686143364045646500") } on : rs1 Timestamp(2, 0)
{ "a" : NumberLong("-7686143364045646500") } -->> { "a" : NumberLong("-6148914691236517200") } on : rs1 Timestamp(3, 0)
{ "a" : NumberLong("-6148914691236517200") } -->> { "a" : NumberLong("-4611686018427387900") } on : rs1 Timestamp(4, 0)
{ "a" : NumberLong("-4611686018427387900") } -->> { "a" : NumberLong("-3074457345618258600") } on : rs1 Timestamp(5, 0)
{ "a" : NumberLong("-3074457345618258600") } -->> { "a" : NumberLong("-1537228672809129300") } on : rs1 Timestamp(6, 0)
{ "a" : NumberLong("-1537228672809129300") } -->> { "a" : NumberLong(0) } on : rs1 Timestamp(7, 0)
{ "a" : NumberLong(0) } -->> { "a" : NumberLong("7686143364045646500") } on : rs0 Timestamp(7, 1)
{ "a" : NumberLong("1537228672809129300") } -->> { "a" : NumberLong("3074457345618258600") } on : rs0 Timestamp(1, 9)
{ "a" : NumberLong("3074457345618258600") } -->> { "a" : NumberLong("4611686018427387900") } on : rs0 Timestamp(1, 10)
{ "a" : NumberLong("4611686018427387900") } -->> { "a" : NumberLong("6148914691236517200") } on : rs0 Timestamp(1, 11)
{ "a" : NumberLong("6148914691236517200") } -->> { "a" : NumberLong("7686143364045646500") } on : rs0 Timestamp(1, 12)
{ "a" : NumberLong("7686143364045646500") } -->> { "a" : { "$maxKey" : 1 } } on : rs0 Timestamp(1, 13)
有范围
{ "a" : NumberLong(0) } -->> { "a" : NumberLong("**7686143364045646500**") } on : rs0 Timestamp(7, 1)
重叠来自第一个副本集的所有分片键。
有关其他一些统计数据: 第一个副本集包含73个记录,第二个副本集包含0个记录。 (这是上演环境,上帝保佑它......)
rs0:PRIMARY> db.stats_archive_monthly.count();
73
rs1:PRIMARY> db.stats_archive_monthly.count();
0
只有一个与此集合一起使用的查询是: $ mongo_db ['stats_archive_monthly']。update({a:account_id,l_id:location_id,t:time.truncate(interval())},{'$ set'=> {u:data.to_i}},upsert:真)
你对它为什么会发生有任何想法吗?工作期间范围如何重叠?集群运行良好半年,无需任何维护。
我的建议是删除所有收藏并从备份中恢复所有收藏,但我仍然有时间玩损坏的数据库,并为您提供任何信息,以便能够找到这里发生的事情。
答案 0 :(得分:0)
根据您的状态输出,我没有看到它重叠,它表示它从上一个副本集的最后一个变为maxkey,正如您可以看到的那样:
{ "a" : { "$minKey" : 1 } } -->> { "a" : NumberLong("-7686143364045646500") } on : rs1 Timestamp(2, 0)
因此rs1
上的这个块结束于-7686143364045646500
并且:
{ "a" : NumberLong("-7686143364045646500") } -->> { "a" : NumberLong("-6148914691236517200") } on : rs1 Timestamp(3, 0)
此块在-7686143364045646500
之后开始。
rs0上的块实际上从NEGATIVE 7686143364045646500
开始,rs1上的块从POSITIVE 7686143364045646500
开始。
返回0
行的查询看起来也是正确的。如果存在重叠或重复的块,则不会返回0
行。
如果你告诉MongoDB对它进行分片,那么收集仍然会在那里,它只是空的。
至于你的配置服务器为什么表现得很奇怪,嗯。
没有看到确实做到这一点的中间块,编辑了问题以使其清楚。