2014-02-16 5 views
0

У меня есть система записи журналов в mongodb (около 1kk журналов в день). Еженедельно мне нужно рассчитать некоторую статистику по этим журналам. Поскольку вычисления являются очень процессором и потребляемой памятью, я хочу скопировать коллекцию, которую я работаю на мощную удаленную машину. Как я могу постоянно обновлять коллекции вне офиса без копирования всего? Я изменяю внешний сбор, сохраняя статистику в своих элементах, то есть добавляя поля {"alogirthm_1": "passed"} или {"stat1": 3.1415}. Является ли репликация правильным для моего варианта использования или я должен исследовать другие альтернативы?Обработка большой коллекции mongo offsite

+1

Что такое 1kk logs в день? 1 м строк журнала в день? – Stennie

+0

Как вы собираетесь обрабатывать данные своего журнала? Карта/Уменьшить или у вас есть приложение для расчета? – yaoxing

+0

@Stennie, да, точно. – Moonwalker

ответ

1

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

  1. Наполовину базы данных, путь наполовину приложения.
    Репликация сохраняет ваши данные в актуальном состоянии. Однако он не позволяет вам изменять вторичные узлы (которые вы называете «внесетевой сбор»). Таким образом, вам нужно выполнить вычисления на вторичном и записать данные в основной. Вам нужно, чтобы приложение выполняло aggregation на вторичном сервере и записывало результат обратно в его основной.
    Для этого вам нужно запустить приложение, PHP, .NET, Python, что угодно.

  2. полный сервер путь
    Так как вы собираетесь иметь мульти-серверы каким-либо образом, вы можете рассмотреть возможность использования Sharding для более быстрого хранения и непосредственно делать вычисления в Интернете. Таким образом, вам даже не нужно запускать приложение. Map/Reduce выполняет расчет и запись вывода в новую коллекцию. I НЕТ рекомендуют это решение, хотя из-за Map/Reduce performance issue текущих версий.

  3. Способ полного применения
    В основном вы по-прежнему используете репликацию для чтения, но сервер не выполняет никаких вычислений, кроме запроса данных. Вы можете использовать capped collection или TTL index для удаления истекших данных, и вы просто перечисляете данные один за другим в своем приложении и вычисляете сами.

Смежные вопросы