【问题标题】:When there is a mongod that already has data, data is not visible when configuring a shard当有mongod已有数据时,配置shard时数据不可见
【发布时间】:2020-08-26 00:33:54
【问题描述】:

当有mongod已经有数据时,配置shard时数据不可见 详细地 两个mongod有一个同名的集合,存储如下数据 信息(A,B mongod)

DB : db_test
Collection : test_log

魔神

{ "_id" : ObjectId("5f44cfa372c25aeff48e66d3"), "skey" : 100, "data" : 1 }

B mongod

{ "_id" : ObjectId("5f44cf731eadcef49cd93e7b"), "skey" : 200, "data" : 2 }

在 Mongos 中,我执行了以下命令

mongos> sh.addShard("A.MASTER:21011")
    { "shardAdded" : "shard0000", "ok" : 1 }
    
    mongos> sh.addShard("B.SLAVE1:21011")
    { "shardAdded" : "shard0001", "ok" : 1 }
    
    mongos> sh.addShardTag("shard0000", "master")
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    mongos> sh.addShardTag("shard0001", "slave_1")
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    
    mongos> sh.enableSharding("db_test")
    { "ok" : 1 }
    
    mongos> sh.shardCollection("db_test.test_log", {skey:1})
    { "collectionsharded" : "db_test.test_log", "ok" : 1 }

    mongos> sh.addTagRange("db_test.test_log", {skey:100}, {skey:199},  "master")
    WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1,
        "nModified" : 0,
        "_id" : {
            "ns" : "db_test.test_log",
            "min" : {
                "skey" : 100
            }
        }
    })
    mongos> sh.addTagRange("db_test.test_log", {skey:200}, {skey:299},  "slave_1")
    WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1,
        "nModified" : 0,
        "_id" : {
            "ns" : "db_test.test_log",
            "min" : {
                "skey" : 200
            }
        }
    })

我在 mongos 中查找了数据(执行了“查找,聚合 ..”命令) 结果

mongos> db.test_log.find()
{ "_id" : ObjectId("5f44cfa372c25aeff48e66d3"), "skey" : 100, "data" : 1 }

在分片之前,我执行了 Command (create index (to use shardkey))

mongos> db.test_log.createIndex({ "skey": 1 });
{
    "raw" : {
        "A.MASTER:21011" : {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 1,
            "numIndexesAfter" : 2,
            "ok" : 1
        }
    },
    "ok" : 1
}

我想知道有什么问题 在mongos中创建索引的时候,我也很好奇只分配给A.master的部分。 请..

【问题讨论】:

    标签: mongodb mongoose sharding


    【解决方案1】:

    在对集合进行分片之前,集合数据应全部驻留在 1 个分片上。

    当您运行 shardCollection 时,任何初始块都会在数据库的主分片上创建。

    通过拆分已经存在的块来创建额外的块。

    当平衡器将一个块从一个分片移动到另一个分片时,它首先从目标集合中删除该块覆盖的文档范围。

    当通过 mongos 查询时,路由器会检查配置服务器以找出哪些分片包含查询可能需要的块,并将查询仅定向到这些分片。

    平衡器参考标签和标签范围来确定将块移动到哪里。 mongos 路由器不会参考这些。

    所以在您的场景中发生的情况是您有一个数据库,其中包含一个存在于多个 mongod 节点上的集合,每个节点都有一个索引 {skey: 1}

    然后,您通过将这两个 mongod 节点添加为单独的分片来创建一个分片集群。

    此时,配置服务器将没有关于数据库或集合的任何信息。

    当您运行enableSharding 时,配置服务器为数据库创建了一个配置文档,并将其中一个分片分配为数据库的主分片。 此时,对该数据库中任何未分片集合的任何查询都将由主分片处理。

    当您运行 shardCollection 时,配置服务器为该集合创建了一个文档,用于标识分片键。它还创建了一个从 MinKey 到 MaxKey 的块,被标识为驻留在数据库的主分片上。

    您对数据的后续查询由 mongos 提供服务,mongos 查询了集合的块列表,发现只有 1 个块。然后它将该请求转发到拥有的分片,该分片返回它拥有的数据。永远不会咨询其他分片。

    您可以通过运行sh.status(true) 来检查块的分布情况。

    此时,拆分现有块并让它保持平衡将无济于事,因为在移动块之前范围将被清除。这意味着其他分片上的任何文档都将在空块被移动之前被删除。

    没有简单的方法可以将 2 个已经包含数据的独立副本集连接到一个分片集群中。在这种情况下,最简单的方法是从一个副本集中 mongodump 数据,与另一个副本创建一个分片集群,在所有数据库上启用分片后,然后将剩余的副本集添加为第二个分片,然后 mongorestore 剩余的数据.

    对于包含数据的单个副本集,Convert a Replica Set to a Sharded Cluster 有一个文档化的过程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-13
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      相关资源
      最近更新 更多