Как выполнить очистку базы данных в Mongodb - PullRequest
8 голосов
/ 18 января 2012

Я использую mongodb для хранения 30-дневных данных, которые поступают мне в виде потока.Я ищу механизм очистки, с помощью которого я могу выбросить самые старые данные, чтобы освободить место для новых данных.Я использовал mysql, в котором я справился с этой ситуацией, используя разделы.Я сохранил 30 разделов, которые основаны на дате.Я удаляю самый старый раздел с датой и создаю новый раздел для хранения новых данных.

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

У меня может быть коллекцияоснованная чистка.У меня может быть 30 коллекций, и я могу выбросить самую старую коллекцию для размещения новых данных.Но есть пара проблем: 1) Если я сделаю коллекции меньше, я не смогу извлечь большую пользу из шардинга, поскольку они делаются для каждой коллекции.2) Мои запросы должны измениться на запрос из всех 30 коллекций и принять объединение.

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

Ответы [ 3 ]

9 голосов
/ 18 января 2012

В MongoDB действительно есть только три способа очистки. Похоже, вы уже определили несколько компромиссов.

  1. Одна коллекция, удалить старые записи
  2. Коллекция за день, отбросьте старые коллекции
  3. База данных в день, отбрасывать старые базы данных

Вариант № 1: одна коллекция

профи

  • Простота реализации
  • Простая в использовании карта / Уменьшает

против

  • Удаление столь же дорого, как и вставки, вызывает много операций ввода-вывода и требует «дефрагментировать» или «компактировать» БД.
  • В какой-то момент вы в конечном итоге обрабатываете удвоенные «записи», так как вам нужно вставить данные за день и удалить данные за день.

Вариант № 2: сбор в день

профи

  • Удаление данных с помощью collection.drop() очень быстро.
  • Still Map / Reduce friendly, поскольку выходные данные за каждый день можно объединять или повторно сокращать по сравнению со сводными данными.

против

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

Опция № 3: база данных в день

профи

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

против

  • Сделает запрос более сложным ( ожидайте написания некоторого кода оболочки ).
  • Не так просто написать Map / Reduce, хотя взгляните на Aggregation Framework, так как в любом случае это может лучше удовлетворить ваши потребности.

Теперь есть опция # 4, но это не общее решение. Я знаю некоторых людей, которые «чистили», просто используя Capped Collections . Определенно есть случаи, когда это работает, но у него есть куча предостережений, поэтому вам действительно нужно знать, что вы делаете.

5 голосов
/ 18 ноября 2012

мы можем установить TTL для сбора с выпуска mongodb 2.2 или выше.это поможет вам истечь старые данные из коллекции.

Перейдите по этой ссылке: http://docs.mongodb.org/manual/tutorial/expire-data/

0 голосов
/ 06 ноября 2012

У меня была похожая ситуация, и эта страница помогла мне, особенно раздел «Полезные сценарии» внизу.http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...