Миграция монгодб-чард 500 ГБ занимает 13 дней - это медленно или нормально?

9

У меня есть кластер осколков mongodb, ключ хэша хэшируется. У этого есть 2 набора точной копии. Каждый набор реплик имеет 2 машины.

Я провел эксперимент, добавив еще 2 набора реплик осколков, и он начал балансировать.

Однако через некоторое время я обнаружил, что миграция чанков будет довольно медленной. Для перемещения 1,4 ГБ данных требуется 1 час.

Это заставляет меня волноваться, это означает, что мне нужно ждать 13 дней, чтобы завершить миграцию фрагментов 500 ГБ!

Я новичок в этом, и у меня нет ощущения бога, будь то медленно, быстро или нормально. Но тем не менее, эти цифры меня не убеждают.

Дополнительные примечания об эксперименте: - использование компьютеров m3 medium aws - другие процессы не выполняются, только миграция чанков - установка шардинга mongodb по умолчанию без дальнейшей настройки - shardkey использует хеширование с идентификатором объекта (_id) - максимальный размер чанка 64 МБ

rendybjunior
источник

Ответы:

10

Обновление: апрель 2018

Этот ответ был верным во время вопроса, но с тех пор все пошло дальше. Начиная с версии 3.4 был введен параллелизм, и билет, на который я ссылался первоначально, был закрыт. Для получения дополнительной информации я расскажу о некоторых деталях в этом более свежем ответе . Оставшуюся часть ответа я оставлю как есть, потому что он остается хорошим справочником по общим вопросам / ограничениям, а также применим для всех, кто работает в более старой версии.

Оригинальный ответ

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

Кроме того, во всем кластере одновременно происходит только одна миграция - параллелизма нет. Таким образом, несмотря на то, что у вас есть два «полных» узла и два «пустых» узла, в любой момент времени происходит не более одной миграции (между осколком с наибольшим количеством кусков и осколком с наименьшим). Следовательно, добавив 2 осколка, вы ничего не получите с точки зрения скорости балансировки и просто увеличите количество кусков, которые должны быть перемещены.

Для самих миграций размер блоков составляет, вероятно, ~ 30 МБ (зависит от того, как вы заполнили данные, но, как правило, это будет ваше среднее значение с максимальным размером блока по умолчанию). Вы можете использовать db.collection.getShardDistribution()эту информацию и посмотреть мой ответ здесь, чтобы узнать, как получить еще больше информации о ваших чанках.

Поскольку никаких других действий не происходит, для выполнения миграции целевой шард (один из вновь добавленных шардов) должен прочитать ~ 30 МБ данных из исходных шардов (один из исходных 2) и обновить серверы конфигурации до отразить новое местоположение чанка, как только это будет сделано. Перемещение 30 МБ данных не должно быть узким местом для нормальной системы без нагрузки.

Если это происходит медленно, существует ряд возможных причин, почему это так, но наиболее распространенными для системы, которая не занята, являются:

  • Исходный дисковый ввод-вывод - если данные не находятся в активной памяти, когда они читаются, они должны быть выгружены с диска
  • Сеть - если есть задержка, ограничение скорости, потеря пакетов и т. Д., Тогда чтение может занять довольно много времени.
  • Целевой дисковый ввод-вывод - данные и индексы должны быть записаны на диск, многие индексы могут ухудшить ситуацию, но обычно это не проблема в слегка загруженной системе
  • Проблемы с миграциями, вызывающими прерывания и неудачные миграции (проблемы с серверами конфигурации, проблемы с удалениями на основных)
  • Задержка репликации - для миграции на наборы реплик, запись с записью w:2или w:majorityиспользуется по умолчанию, и для ее выполнения требуется наличие обновленных вторичных серверов.

Если бы система была занята, то и конфликт памяти, и блокировка обычно бывали и здесь.

Чтобы получить больше информации о том, сколько времени занимает миграция, если она не удалась и т. Д., Взгляните на записи в вашем config.changelog:

// connect to mongos
use config
db.changelog.find()

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

Наконец, чтобы отслеживать / повышать / комментировать запрос функции для улучшения параллелизма миграции чанков, посмотрите SERVER-4355

Адам С
источник
Спасибо, это объясняет механизм миграции чанков намного больше, чем документация mongodb.
rendybjunior
Я обязательно присоединюсь к вашему курсу. :) Что вы думаете о скорости, о которой я упоминал ранее? Это нормально или медленно? Я знаю, что этот вопрос является относительным по многим аспектам. Но я прошу вашего собственного мнения
rendybjunior
Это кажется немного медленным, исходя из вашего описания, но я должен был бы сравнить средние экземпляры, чтобы быть уверенным. Ваша текущая оценка может быть все, на что они способны, или у вас может быть одна из проблем, которые я упомянул в ответе. Один из элементов управления, который вы можете попробовать, - это перемещение фрагмента вручную - выключите балансировщик и, по сути, сделайте это самостоятельно, чтобы увидеть, есть ли какие-либо проблемы и какое влияние это перемещение оказывает на системы источника / цели. Вы можете найти соответствующие подробности о moveChunk здесь: docs.mongodb.org/manual/reference/method/sh.moveChunk
Адам C
Просто добавьте, что зеркалирование чанков имеет низкий приоритет для mongoDB, и даже в высокопроизводительных системах может занять некоторое время, если они заняты.
Антониос
@Antonis - не уверен, что вы подразумеваете под приоритетом, миграция чанков - это чтение из исходного сегмента (как и любое другое чтение) и запись в целевой сегмент (с вышеупомянутой проблемой записи), приоритет этих операций отсутствует. по сравнению с другими. Они будут медленными в загруженных системах, но не из-за какой-либо внутренней разницы в приоритетах.
Адам С