Я на самом деле реализовал это, и это очень выполнимо и приводит к очень хорошей производительности записи. Я предполагаю, что у вас есть те же причины для его реализации, что и у меня (мгновенный таргетинг на сегменты без разогрева / балансировки, пропускная способность записи, отсутствие снижения производительности при перемещении / разбиении фрагментов и т. Д.).
Ваши вопросы:
- Да, если вы правильно его внедрили.
- То, что я делаю на нашем собственном слое ORM, - помечаю определенные поля в документе как заштрихованное поле. Наш ORM затем автоматически сгенерирует хеш-значение для этого значения поля непосредственно перед записью или чтением документа. Исходящие запросы затем украшаются тем значением хеша (в нашем случае всегда называемым «хеш»), которое затем использует монтирование MongoDB для нацеливания на шарды. Очевидно, что в этом сценарии «хеш» всегда является единственным ключом шардинга.
- Самым важным на сегодняшний день является создание хороших хэшей. Многие значения полей (чаще всего поле _id на основе ObjectId) являются инкрементными, поэтому ваш алгоритм хеширования должен быть таким, чтобы сгенерированные хэши для инкрементальных значений приводили к хеш-значениям, которые попадают в разные сегменты. Другие проблемы включают выбор подходящего размера куска.
Некоторые недостатки, которые следует учитывать:
- Балансировка чанков MongoDB по умолчанию становится менее полезной, так как вы обычно настраиваете свой первоначальный кластер с большим количеством чанков (это облегчает добавление осколков в ваш кластер при сохранении хорошего распределения чанков по всем осколкам). Это означает, что балансировщик начнет разделение, только если у вас есть достаточно данных в готовых чанках, чтобы потребовать разделения.
- Вероятно, в ближайшем будущем он станет официально поддерживаемой функцией MongoDB, что может сделать все эти усилия немного расточительными. Как и я, вы не можете позволить себе роскошь ждать.
Удачи.
ОБНОВЛЕНИЕ 25/03/2013: Начиная с версии 2.4 MongoDB изначально поддерживает хэш-индексы.