MongoDB分片范围重叠

时间:2014-02-04 07:10:00

标签: mongodb sharding

我有以下配置的Mongo数据库集群:

  • 已安装 mongos
  • 的应用服务器
  • 已安装 mongoc 的3台不同服务器(mongoc0,mongoc1,mongoc2)
  • 2个副本集,每组3个服务器运行 mongod (rs:mongodb0-0,mongodb0-1,mongodb0-2; rs1:mongodb1-0,mongodb1-1,mongodb1-2)

在意外重启应用程序服务器后,我发现当我尝试运行 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:真)

你对它为什么会发生有任何想法吗?工作期间范围如何重叠?集群运行良好半年,无需任何维护。

我的建议是删除所有收藏并从备份中恢复所有收藏,但我仍然有时间玩损坏的数据库,并为您提供任何信息,以便能够找到这里发生的事情。

1 个答案:

答案 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对它进行分片,那么收集仍然会在那里,它只是空的。

修改

至于你的配置服务器为什么表现得很奇怪,嗯。

修改

没有看到确实做到这一点的中间块,编辑了问题以使其清楚。