MongoDB, могу ли я запускать вторичную репликацию только в заданное время или вручную?

Я не эксперт по mongodb, поэтому сейчас я немного не уверен в настройке сервера.

У меня есть один экземпляр, на котором работает mongo3.0.2 с wiredtiger, принимающий операции чтения и записи. Он собирает журналы с клиента, поэтому нагрузка на запись приличная. Раз в день я хочу обработать эти журналы и рассчитать некоторые показатели, используя структуру агрегации, набор данных для обработки - это что-то вроде всех журналов за последний месяц, и все вычисления занимают около 5-6 часов. Я думаю о разделении записи и чтения, чтобы избежать блокировки моих коллекций (сервер продолжает записывать журналы, пока я читаю, новые записанные журналы могут соответствовать моим запросам, но я могу их пропустить, потому что мне не нужна 100% точность) ).

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

Я делаю всю свою обработку из node.js, поэтому один из вариантов, который я вижу здесь, - это экспортировать данные, созданные в какой-то период, например [вчера, сегодня], и импортировать их, чтобы прочитать экземпляр самостоятельно и выполнить вычисления после завершения импорта. Я искал набор реплик и репликацию master/slave в качестве возможных настроек, но я не понял, как настроить его для достижения описанного сценария. Так что, может быть, я ошибаюсь и что-то упускаю здесь? Есть ли другие варианты для достижения этого?


person levady    schedule 22.04.2015    source источник
comment
Может быть, я постараюсь добавить больше фактов, это не очень просто сделать кратким, потому что у меня есть около 15 различных агрегатов... Но мой вопрос не совсем о них, я немного отредактировал тему. Мой главный вопрос: как я могу получить настройку, при которой репликация на вторичном сервере не выполняется постоянно, а запускается в настроенное время или, лучше, запускается до того, как будут запущены все операции чтения.   -  person levady    schedule 22.04.2015
comment
Вы не можете, вы не должны, и я бы не стал помогать;) как было сказано ранее, вы, возможно, захотите использовать вторичное в первую очередь.   -  person Markus W Mahlberg    schedule 22.04.2015
comment
Когда вы запускаете репликацию только до создания отчетов, вы не будете знать, сколько времени потребуется, пока она не будет синхронизирована. Почему бы не позволить репликации работать постоянно? Дополнительная нагрузка на главный сервер незначительна, и вы получаете дополнительную возможность автоматического перехода на другой ресурс в случае неожиданного выхода из строя основного сервера.   -  person Philipp    schedule 22.04.2015


Ответы (1)


Ваша идея использования набора реплик ошибочна по нескольким причинам.

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

Во-вторых, деактивация репликации и включение ее перед началом создания отчета также не является хорошей идеей. Когда вы включаете репликацию, новое подчиненное устройство не будет немедленно обновлено. Потребуется некоторое время, пока он обработает изменения с момента последнего контакта с мастером. Невозможно сказать, сколько времени это займет (вы можете проверить, насколько далеко вторичный объект отстает от основного, используя rs.status() и сравнение вторичных данных optimeDate с датой lastHeartbeat).

Но если вы хотите выполнить интеллектуальный анализ данных для подмножества ваших документов, выбранных по временному интервалу, есть другое решение.

Перенесите документы, которые вы хотите проанализировать, в новую коллекцию. Вы можете сделать это с конвейером агрегации, состоящим только из $match, который соответствует документам за последний месяц, за которым следует $out. Out-оператор указывает, что результаты агрегации не отправляются в приложение/оболочку, а вместо этого записываются в новую коллекцию (которая автоматически очищается до того, как это произойдет). Затем вы можете выполнять отчеты по новой коллекции, не блокируя фактическую. Это также имеет то преимущество, что теперь вы работаете с гораздо меньшей коллекцией, поэтому запросы будут выполняться быстрее, особенно те, которые не могут использовать индексы. Кроме того, ваши данные не будут меняться между вашими агрегациями, поэтому в ваших отчетах не будет никаких несоответствий между ними из-за изменения данных между ними.

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

person Philipp    schedule 22.04.2015
comment
Вы совершенно правы в том, что репликация — это не то, что мне нужно, когда я выполняю майнинг, и я это понимаю, поэтому я предложил перенести документы в новый экземпляр mongodb. Перенос его в новую коллекцию звучит интересно, спасибо за этот момент. Я думаю, что в конечном итоге я создам правильный набор реплик, и я подумаю о передаче данных во временную коллекцию перед обработкой - все мои агрегации начинаются с {$match: {date: {$gte: begin, $lte: end}} } так или иначе. - person levady; 23.04.2015