Я пытаюсь разделить коллекцию примерно на 6 миллионов документов. Ниже приведены некоторые подробности о сегментированном кластере.
Mongod версии 2.6.7, два шарда, 40% записи, 60% чтения.
В моей базе данных есть события коллекции с примерно 6 миллионами документов. Обычный документ выглядит так:
{
_id : ObjectId, sector_id : ObjectId, subsector_id: ObjectId, . . . Many event specific fields go here . . created_at: Date, updated_at: Date, uid : 16DigitRandomKey
}
Каждый сектор имеет несколько (1,2, ..100) подсекторов, и каждый подсектор имеет несколько событий. Таких секторов 10 000, подсекторов 30000 и событий 6M. Цифры продолжают расти.
Нормальный запрос чтения включает в себя идентификатор_сектора и идентификатор_подсектора. Каждая операция записи включает в себя идентификатор сектора, идентификатор подсектора, uid (уникальный ключ, сгенерированный случайным образом) и остальные данные.
Я пробовал / рассматривал следующие ключи осколков, и результаты описаны ниже:
а. _id: hashed -> не обеспечивает изоляцию запросов, причина: _id не передается для чтения запроса.
б. Sector_id: 1, subsctor_id: 1, uid: 1 -> Странное распределение: несколько секторов со старым ObjectId попадают в сегмент 1, несколько секторов со средним возрастом (ObjectId) секторов хорошо сбалансированы и равномерно распределены между обоими сегментами. Несколько секторов с недавним ObjectId остаются на шарде 0.
c. subsctor_id: hashed -> результаты были такими же, как и для ключа сегмента b.
d. subsctor_id: 1, uid: 1 -> то же, что и b.
е. subsctor_id: hashed, uid: 1 -> не может создать такой индекс
f. uid: 1 -> записи распределяются, но без изоляции запроса
В чем может быть причина такого неравномерного распределения? Какой может быть правильный ключ осколка на основе заданных данных.