Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB碎片范围重叠_Mongodb_Sharding - Fatal编程技术网

MongoDB碎片范围重叠

MongoDB碎片范围重叠,mongodb,sharding,Mongodb,Sharding,我有以下Mongo DB集群配置: 安装了mongos的应用服务器 安装了mongoc的3台不同服务器(mongoc0、mongoc1、mongoc2) 2个副本集,每组3台服务器运行mongod(rs:mongodb0-0、mongodb0-1、mongodb0-2;rs1:mongodb1-0、mongodb1-1、mongodb1-2) 在应用服务器意外重启后,我发现mongos在我尝试运行show collections时开始显示错误 mongos> show collecti

我有以下Mongo DB集群配置:

  • 安装了mongos的应用服务器
  • 安装了mongoc的3台不同服务器(mongoc0、mongoc1、mongoc2)
  • 2个副本集,每组3台服务器运行mongod(rs:mongodb0-0、mongodb0-1、mongodb0-2;rs1:mongodb1-0、mongodb1-1、mongodb1-2)
在应用服务器意外重启后,我发现mongos在我尝试运行show collections时开始显示错误

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条记录。(这是舞台环境,愿上帝保佑……)

使用此集合的唯一查询是: $mongo_db['stats_archive_monthly'].update({a:account_id,l_id:location_id,t:time.truncate(interval())},{'$set'=>{u:data.to_i}},upsert:true)

你知道为什么会这样吗?工作期间,范围如何重叠?集群可以正常工作半年,无需任何维护


我的建议是删除所有集合并从备份中恢复所有集合,但我仍然有时间处理损坏的数据库,并为您提供任何信息,以便您能够找到此处发生的情况。

根据您的状态输出,我看不到它重叠,它表示从上一个复制集的最后一个复制集到maxkey,正如您在其他复制集中看到的:

{ "a" : { "$minKey" : 1 } } -->> { "a" : NumberLong("-7686143364045646500") } on : rs1 Timestamp(2, 0)
因此,
rs1
上的这个块在
-768614336404564500
处结束,并且:

{ "a" : NumberLong("-7686143364045646500") } -->> { "a" : NumberLong("-6148914691236517200") } on : rs1 Timestamp(3, 0)
此块在
-7686143364045646500
之后开始

rs0上的区块实际上从负值开始,rs1上的区块从正值开始

返回
0
行的查询看起来也正确。如果存在重叠或重复的块,则不会返回
0

在一天结束时,如果您告诉MongoDB将其切分,则该集合仍然存在,它将是空的

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

编辑
没有看到中间的数据块,但它确实起到了作用,编辑了问题以澄清问题。

我认为您被输出搞糊涂了,rs1数据块是负数,而rs0数据块是正数。我不混淆范围的负值和正值。我还看到第一个范围是从$minkey到-768614336404456500,最后一个范围是从768614336404456500到$MAXKEY您使用的MongoDB和主机O/S的具体版本是什么?是的,开始是从-7开始的。。。直到6点。。。但是如果你再看一看-~它从-1开始。。直到0然后从0到7。。。然后再次从1。。。直到3点。。。所以我认为这个{“a”:NumberLong(0)}-->{“a”:NumberLong(“7686143364044564500”)}on:rs0时间戳(7,1)应该是{“a”:NumberLong(0)}>{“a”:NumberLong(“1537228672809129300”)}on:rs0时间戳(7,1),或者我在一个时间戳中包含了最后4个范围。因此,例如,一个键1537228672809129301包含在两个范围内。我在同一数据库中有许多其他集合,与此相比,所有其他集合都具有正常范围collection@nexo好吧,我没有看到你问题的格式,我现在明白你的意思了,我想我可能知道答案answer@nexo您是否一直在删除此文件?rs0最初有数据吗?它没有。由于它正在暂存该集合的所有数据,因此该集合仅在rs1上运行,所以该集合由属性“a”散列,并且所有记录都有{“a”:1}。我从不自己从这个表中删除任何记录,只使用过期索引。这里是如何创建集合的-db.adminCommand({shardCollection:“stats_archive_monthly”,key:{a:“hashed”},numInitialChunks:12})db.stats_archive_monthly.ensureIndex({a:1,“l_id:1,“t”:1})db.stats_archive_monthly.ensureIndex({t:1},{expireAfterSeconds:2678400+604800})
{ "a" : NumberLong("-7686143364045646500") } -->> { "a" : NumberLong("-6148914691236517200") } on : rs1 Timestamp(3, 0)