Сбой ShardCollection с ошибкой «не удалось найти действительный индекс для ключа шарда» & code: «96» & - PullRequest
0 голосов
/ 07 января 2020

Рассмотрим : у меня есть коллекция "Feeds", "Groups" и "Users", и в них миллионы документов. Скажем, схема «Feeds» выглядит следующим образом:

{
    fromUserRef: <Reference Id from Users collection>,
    toUsersRef: [<Array of Reference Id(s) from Users collection>],
    toGroupsRef: [<Array of Reference Id(s) from Groups collection>],
    text: <String>,
    image: <String>,
    ...
}

Образцы документов:

{
    fromUserRef: ObjectId("5dd4e8b52355555592249596"),
    toUsersRef: [],
    toGroupsRef: [ObjectId("5dd4e8b523594c5592249392")],
    ...
},
{
    fromUserRef: ObjectId("5dd4e8b52355555592249583"),
    toUsersRef: [ObjectId("5dd4e8b52355555592249596"), ObjectId("5dd4e8b52355555592249291")],
    toGroupsRef: [],
    ...
},
{
    fromUserRef: ObjectId("5dd4e8b52355555592249583"),
    toUsersRef: [],
    toGroupsRef: [],
    ...
}

Теперь скажите, что я выбрал ключ шарда с помощью «toUsersRef» & «toGroupsRef» ». Согласно официальным документам должен существовать индекс, поддерживающий ключ шарда.

В моем случае я создал index следующим образом:

db.feeds.createIndex({ 
    "toUserRef" : 1,
    "toGroupsRef" : 1
},
{"name":"toUsersRef_1_toGroupsRef_1"})

Коллекция осколков:

sh.shardCollection("my_db.feeds", {
    "toUsersRef" : 1,   "toGroupsRef" : 1
 });

Ошибка вывода:

{
   "message" : "couldn't find valid index for shard key",
   "ok" : 0,
   "code" : 96,
   "codeName" : "OperationFailed",
   "operationTime" : "Timestamp(1578373028, 5)",
   "$clusterTime" : {
       "clusterTime" : "Timestamp(1578373028, 5)",
       "signature" : {
           "hash" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=",
           "keyId" : 0
       }
   },
   "name" : "MongoError"
}

Не уверен, что здесь не так. Кто-нибудь может пролить свет на это?

PS : чтобы стратегия индекса была такой же, как стратегия шарда, попробуйте тот же ключ шарда в пустой коллекции и скопируйте индекс, созданный для поддержки ключа шарда, и повторно попытался собрать коллекцию в тех случаях, когда данные существуют, но не повезло, они выдают ту же ошибку.

Дополнительная информация : Использование версий MongoDB: 4.2.2 кластер серверов конфигурации / набор реплик, 2 кластера шардов / серверы реплик при создании коллекции индекса / шарда были подключены к mongos


Наконец-то обнаружена причина root

новая коллекция, но не существующая, потому что в индексе создания есть опечатка [ s отсутствует: | ]. & однажды исправил ошибку получения опечатки как cannot index parallel arrays [toUsersRef] [toGroupsRef]

...