Подтвердить что ты не робот

Почему моя копия MongoDB продолжает отставать?

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

Поскольку это облако, в конце концов, я создал образ моего основного (который должен копировать все данные), хотя я не мог запустить db.fsyncLock() в то время, потому что он брал некоторые записи, Новое изображение заканчивается, и я запускаю новый сервер на основе этого образа, добавляю его в свой набор реплик, удаляю старую вторичную, и жизнь хороша, не так ли? Не совсем - новая средняя отстает примерно на час назад, и в течение дня (и сегодня) в конечном итоге доходит до точки, где она отстает на 14 часов (хотя, как ни странно, все еще в окне oplog).

Я делаю следующий шаг от "повторной синхронизации устаревшей страницы участника". Завершите mongod на обоих серверах, gzip и скопируйте папку моих данных с первичной на вторичную, разархивируйте, запустите их обоих, db.fsyncLock() мой основной. Что заставляет меня думать, что даже с ТОЛЬКО ДАННЫМИ, после инициализации, мой второстепенный говорит об этом на 1 час. Я добавляю его обратно в набор реплик, и он быстро добирается до 5 минут.

Все хорошо, правда? Нет - флеш вперед, вторично продвигается sloooooowly, и теперь на 20 минут отстает. Mongostat имеет вторичный привязку с 95 + заблокированными%, iostat -xm 2 не показывает ничего сумасшедшего - первичный в настоящее время не работает, не беря записи, вторично, конечно, совсем не делает (0,04 wMB/second). Не уверен, стоит ли упоминать об этом, но в настоящее время в нем чувствуется медленная собака, не реагирующая на запись в оболочку монго и т.д.

Что дает, Монго? Почему ты не можешь догнать? Что я делаю неправильно, пытаясь заставить меня вторгаться?

ИЗМЕНИТЬ Ответы на вопросы:

  • Версия: 2.0.4
  • Аппаратное обеспечение. Оба узла - это одно и то же аппаратное обеспечение, как я могу сказать - 8 ГБ оперативной памяти, четырехъядерный процессор. Я предполагаю, что это что-то виртуализованное.
  • Скорость записи: она меняется. Как уже упоминалось, прошлой ночью я переходил на ограниченную коллекцию, которая вызвала все это. В одночасье был процесс, который записывал около нескольких сотен небольших документов (~ 155 байт каждый) несколько раз в час, поэтому макс я бы оценил около 100-200 кбайт/час. В течение дня обработка была более интенсивной, обновляя сотни тысяч 500-байтных документов и записывая еще пару сотен тысяч. Тем не менее, речь не идет об огромных количествах данных. РЕДАКТИРОВАТЬ нашел один выход из iostat с сегодняшнего дня:
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              1.00  2564.50  243.50  282.50  8986.00 11388.00    77.47    11.32   21.46    2.36   37.93   0.50  26.50

Этот был особенно раздираем в 11 wMB/s, видел, что использование% составляло 34% с 7 wMB/s и 72% при 52 rMB/s. Так что не насыщенный, но, безусловно, тяжелая рабочая нагрузка утром. Интересно, хотя, несмотря на то, что имеет объект. размер ~ 5 ГБ и индексы ~ 1 ГБ (см. ниже), так много активности диска. Не должно ли это быть в ОЗУ?

  • Рабочий набор: я до сих пор не нашел принятую методологию расчета рабочего набора, но если это помогает:
    "collections" : 21,
    "objects" : 15540092,
    "avgObjSize" : 325.26198326238995,
    "dataSize" : 5054601144,
    "storageSize" : 5874327552,
    "numExtents" : 132,
    "indexes" : 43,
    "indexSize" : 864366720,
    "fileSize" : 10666115072,
    "nsSizeMB" : 16,
    "ok" : 1

Я не могу себе представить, что это огромная 8 ГБ ОЗУ, хотя я мог ошибаться.

  • некоторые недавние образцы мангостата из вторичных:
insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn    set repl       time 
    *0     *0     *0     *0       0     1|0       0  22.2g  44.9g   912m      0     99.2          0       0|0     0|1     2k   303b   151 mySet  SEC   03:47:54 
    *0     *0     *0     *0       0     1|0       0  22.2g  44.9g  1.85g      0      101          0       0|0     0|1     3k   303b   151 mySet  SEC   03:48:04 

ИЗМЕНИТЬ

Пробовал больше вещей. Я отключил основной (теперь называемый A, вторичный будет B), удалил его данные и разархивировал его снимок (теперь пару часов назад, но на данный момент мы ничего не пишем). Начинал A up с - fastsync, и он все еще как 45 секунд позади B (теперь первичного) optime, который болтался приблизительно в 02: 19: 52UTC. Наконец, примерно через час, A догоняет, поэтому я вызываю rs.stepDown() на B. Мгновенно, rs.status() показывает мне, что оба сервера имеют опционы около 04:08 UTC, но B (теперь вторичный) снова отстает на 17 секунд... затем 30 секунд... теперь 7 минут...

ИЗМЕНИТЬ

Через несколько минут после принятия предложения @matulef и повторного создания индексов в моих закрытых коллекциях, а также повторного запуска вторичного процесса mongod, его optime только увеличился на несколько секунд. Вторичная блокировка% от монгостата по-прежнему колеблется от 95-104%, и, что интересно, размер резонатора довольно дико колебался от 100 М до 2 ГБ и обратно до оседания около 1 ГБ.

EDIT (следующий вечер)

Заключение к истории - @matulef был на правильном пути, я должен был быть более осторожным в преобразовании реплицированной коллекции в ограниченную коллекцию. Далее следует, что произошло, хотя я не рекламирую это как безопасное для данных - я свободно признаю, что, возможно, потерял некоторые данные в этом процессе, поэтому YMMV.

Создание индексов для закрытых коллекций первичного (A) не распространялось на вторичное (B), а A произошло с ошибкой (не преднамеренно). Как только B был основным, я вручную создал индексы в закрытых коллекциях там, и операция повторной синхронизации, чтобы привести A в соответствие с B, быстро переместилась. К сожалению, для меня мои окна oplog больше не выстраивались в линию, поэтому мне пришлось делать снимки с B до A. Когда я перезапустил монго с тем же набором данных, A и B снова были счастливы, а репликация вернулась синхронизация с тех пор.

4b9b3361

Ответ 1

Проблема заключается в том, что у закрытых коллекций по умолчанию нет индекса _id (а команда "convertToCapped" фактически снижает все индексы для этой коллекции). Это проблема, потому что вторичные пользователи выполняют обновления, применяя ops из oplog, которые ссылаются на документы по их _ids. Если вам не хватает индекса _id, каждое обновление требует полного сканирования таблицы на вторичных устройствах, что приводит к значительному отставанию.

Решение состоит в создании индекса _id в закрытой коллекции. Однако, если вы создаете индекс на первичном, но ваши вторичные пользователи уже отстают, они не получат операцию создания индекса достаточно быстро. Вместо этого лучший способ исправить ситуацию - сначала исправить каждую отстающую вторичную, одну за другой. Для каждого из них закройте его и перезапустите в автономном режиме (на другом порту, без опции --replSet), создайте индекс _id, а затем добавьте его обратно в набор. Наконец, после того, как второстепенные объекты будут исправлены, вы можете уйти с основного и повторить процесс вместе с ним.

Обновить. В mongoDB 2.0.x и более ранних версиях по умолчанию у закрытых коллекций нет индекса _id. Тем не менее, поведение по умолчанию планируется изменить в mongoDB 2.2, так что ограниченные коллекции, созданные в версии 2.2+, будут иметь индекс _id, созданный автоматически, так же как и с коллекциями без ограничений. Для закрытых коллекций, созданных до 2.2, вам все равно придется вручную создавать индекс _id, используя описанные выше шаги, но новые коллекции не должны страдать от проблем, описанных выше.