插入分片 mongodb 数据库时出错

Error while inserting into sharded mongodb database

我有一个当前设置,其中我有 2 个配置服务器和 2 个分片和 1 个路由器。我可以从他们所有的日志中看到他们都已连接。
现在我创建了一个名为 'testdb' 的新数据库。我在 'testdb' 上启用了分片并尝试插入到 'testdb' 中的集合中。当我尝试这样做时,出现错误。另一件奇怪的事情是,当我尝试 'show dbs' 时,我没有看到数据库 'testdb'。下面是终端的视图。

mongos> use testdb
switched to db testdb
mongos> sh.enableSharding("testdb")
{ "ok" : 1 }
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("59d1c43767d73804222be772")
}
  shards:
    {  "_id" : "ReplicaSet",  "host" : "ReplicaSet/192.168.1.3:20011,192.168.1.3:20012",  "state" : 1 }
  active mongoses:
    "3.4.1" : 1
 autosplit:
    Currently enabled: yes
  balancer:
    Currently enabled:  yes
    Currently running:  no
        Balancer lock taken at Mon Oct 02 2017 10:14:40 GMT+0530 (IST) by ConfigServer:Balancer
    Failed balancer rounds in last 5 attempts:  0
    Migration Results for the last 24 hours:
        No recent migrations
  databases:
    {  "_id" : "testdb",  "primary" : "ReplicaSet",  "partitioned" : true }

mongos> db.testcoll.insert({_id:1,name:"testvalue"})
WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 193,
        "errmsg" : "Cannot accept sharding commands if not started with --shardsvr"
    }
})
mongos> show dbs
admin   0.000GB
config  0.000GB
mongos> db
testdb

配置服务器的状态是:

ReplicaSet:PRIMARY> rs.status()
{
    "set" : "ReplicaSet",
    "date" : ISODate("2017-10-02T05:33:42.973Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "configsvr" : true,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1506922413, 1),
            "t" : NumberLong(1)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1506922413, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1506922413, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1506922413, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.1.3:20002",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 3048,
            "optime" : {
                "ts" : Timestamp(1506922413, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-10-02T05:33:33Z"),
            "electionTime" : Timestamp(1506919478, 1),
            "electionDate" : ISODate("2017-10-02T04:44:38Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.1.3:20003",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 2954,
            "optime" : {
                "ts" : Timestamp(1506922413, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1506922413, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-10-02T05:33:33Z"),
            "optimeDurableDate" : ISODate("2017-10-02T05:33:33Z"),
            "lastHeartbeat" : ISODate("2017-10-02T05:33:42.557Z"),
            "lastHeartbeatRecv" : ISODate("2017-10-02T05:33:42.557Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.1.3:20002",
            "configVersion" : 1
        }
    ],
    "ok" : 1
}  

分片状态:

ReplicaSet:PRIMARY> rs.status()
{
    "set" : "ReplicaSet",
    "date" : ISODate("2017-10-02T05:39:08.968Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1506922743, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1506922743, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1506922743, 1),
            "t" : NumberLong(1)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "192.168.1.3:20011",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 3355,
            "optime" : {
                "ts" : Timestamp(1506922743, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-10-02T05:39:03Z"),
            "electionTime" : Timestamp(1506919442, 1),
            "electionDate" : ISODate("2017-10-02T04:44:02Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "192.168.1.3:20012",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 3317,
            "optime" : {
                "ts" : Timestamp(1506922743, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1506922743, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2017-10-02T05:39:03Z"),
            "optimeDurableDate" : ISODate("2017-10-02T05:39:03Z"),
            "lastHeartbeat" : ISODate("2017-10-02T05:39:08.532Z"),
            "lastHeartbeatRecv" : ISODate("2017-10-02T05:39:07.254Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "192.168.1.3:20011",
            "configVersion" : 1
        }
    ],
    "ok" : 1
}

我哪里错了?

我终于找到了答案。错误是我对所有配置服务器和分片服务器使用了相同的副本集名称。在这种情况下,路由器试图将文档插入配置服务器而不是分片服务器,因此它抛出了服务器未使用选项 --shardsvr 启动的错误。

我在使用 mongo 4.2 时遇到了同样的问题,我的副本集名称不一样,类似于:rs_dbname_01、rs_dbname_02、rs_dbname_03 所以我通过以下方式更改名称:rs1、rs2、rs3,我终于修复了它……也许 mongo 可以截断副本集名称的长度或用符号“_”剪切它