Нужна помощь в выборе ключа шардинга в MongoDB - PullRequest
0 голосов
/ 25 января 2020

Для моего приложения мне нужно отколоть довольно большую коллекцию, вся коллекция будет содержать приложение. 500 миллиардов документов.

У меня есть два потенциальных поля, которые можно использовать в качестве ключа Sharding:

Для вставки любой ключ Sharding будет равномерно распределять документы по кластеру, не имеет значения, какие поле, которое я использую в качестве Sharding Key.

Для query это другое.

  • Поле (1) обычно является частью условия фильтра запроса, поэтому запрос будет обрабатываться обычно только для одного сегмента.

  • Поле (2) обычно не является частью условия фильтра запроса, поэтому запрос будет обрабатываться по всем сегментам, и обычно несколько фрагментов будут вносить вклад в конечный результат запроса.

Какое поле лучше использоваться в качестве ключа шардинга? Я не нашел в документации MongoDB ничего об этом topi c.

Любые поля имеют одинаковый диапазон и очень похожие показатели кардинальности, различий не будет. Обычно количество документов, возвращаемых запросом, очень мало (обычно менее 20-30 документов).

1 Ответ

1 голос
/ 25 января 2020

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

Для вставки либо Sharding Key будет равномерно распределять документы по кластеру, не имеет значения, какое поле я использую в качестве Sharding Key.

При вставке документа он будет иметь ключ шарда, и документ будет сохранен для указанного сегмента.

Поле (1) обычно является частью условия фильтра запроса, поэтому запрос будет обрабатываться обычно только для одного сегмента.

Шард Основными задачами ключа являются (а) равномерное распределение данных по сегментам в кластере и (б) возможность запроса данных таким образом, чтобы запрос предназначался для одного сегмента.

Чтобы запрос был нацелен на один шард, ключ шарда должен быть частью критериев фильтра запроса. Маршрутизатор mongos нацелится на один осколок, используя ключ осколка.

Если ключ осколка не является частью критериев фильтра, это будет операция разброса (длительный запрос). Важно, чтобы наиболее важные операции запроса приложения, использующего сегментированный набор, могли использовать ключ сегмента.

Поле (2) обычно не является частью условия фильтра запроса, поэтому запрос будет обрабатываются для всех сегментов, и, как правило, несколько фрагментов вносят свой вклад в конечный результат запроса.

Когда ключ сегмента не является частью фильтра запроса, операция будет охватывать несколько сегментов (операция разброса-сбора). ) и это будет медленная операция. Маршрутизатор Mongos не сможет определить, какие шарды содержат целевые данные, и все шарды в кластере будут запрошены для получения окончательного результата.

Какой из полей лучше использовать как ключ шардинга?

Можно сделать вывод, что поле (1) должно использоваться как ключ шарда.

См. документацию по ключам шарда и выбору ключа шарда @ Документы MongoDB на Shard Keys .

...