Как работает балансировщик Mongo в отношении хешированного ключа сегмента

Это хорошо известная концепция балансировки данных между узлами, и она четко описана в руководство. Как работает балансировщик в отношении хешированных фрагментов ключа шарда? Можно ли мигрировать чанк, если по ключу шарда документы из этого чанка принадлежат этому шарду? Если это не так, то почему документы находятся в шарде, которому они не принадлежат? Или балансировщик не имеет значения для хешированного ключа осколка, пока количество осколков не меняется?


person Yuki    schedule 11.01.2020    source источник


Ответы (1)


Хэшированный ключ сегмента по-прежнему работает как обычный ключ сегмента на основе диапазона. Их также можно мигрировать, разделять и т. д., как и обычный ключ сегмента.

Разница в том, что хешированный ключ сегмента имеет дополнительный процесс при первоначальном сегментировании коллекции. Перефразируя страницу документации по адресу Хеширование фрагментов:

При сегментировании заполненной коллекции:

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

При разбиении пустой коллекции:

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

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

За исключением начального разбиения чанка, они функционируют так же, как обычный ключ сегмента.

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

Например: предположим, что алгоритм хэширования — MD5 (размер 128 бит). Потенциально пространство MD5 очень велико. Однако, если базовое (нехешированное) значение ключа может быть только A или B, эти два хешированных с помощью MD5 всегда будут приводить к A -> bf072e9119077b4e76437a93986787ef и B -> 30cf3d7d133b08543cb6c8933c29dfd7, что делает кардинальность чрезвычайно малой.

person kevinadi    schedule 13.01.2020