Мы хотим запустить MapReduces в нашей действующей базе данных Mongo, в основном для того, чтобы мы могли извлекать метрики. Тем не менее, у нас были серьезные сбои, вызванные тем, что эти MR блокировали сервер Mongo (в частности, 100% дисковый ввод-вывод). Мы думаем, что это из-за отсутствия индексов.
Можно ли выполнять подобные пакетные процессы с низким приоритетом, чтобы не сделать базу данных недоступной для нашего живого приложения?
Невозможно «улучшить» выполняемые вами MR-задания - они будут давать результат и т. Д., Но в конце (особенно если у вас плохо выбраны индексы) вы собираетесь повлиять на первичный, удалив его рабочий набор из ОЗУ, в результате чего диск Конкуренция ввода-вывода и т. Д. Поэтому я определенно рекомендую оптимизировать ваши индексы, чтобы избежать этого как можно больше.
С точки зрения облегчения нагрузки, вы можете запускать MR-задания в памяти на вторичных, а не на первичных. Таким образом можно запустить все, что не требует вывода в базу данных (нет возможности записывать на вторичный сервер).
Если это не вариант, то другой подход, который я видел, включает предоставление данных в «аналитический» кластер специально для выполнения заданий MR, оставляя производственные БД нетронутыми. Существует несколько подходов к обновлению второго кластера: от моментальных снимков файловой системы и других методов пакетного типа до использования mongooplog или пользовательское приложение и настраиваемые курсоры воспроизвести.
Другой подход, который вы могли бы использовать, - это сегментирование, чтобы увеличить вашу емкость на ваших основных серверах. Если вы собираетесь пойти по этому пути, убедитесь, что вы используете как минимум 2.2 (2.2.2 на момент написания этой статьи), поддержка сегментированного MR была значительно улучшена с выпуском 2.2.
Как заявил Адам, на mongodb невозможно запускать задания с более низким приоритетом. У нас была такая же проблема с дорогими заданиями, из-за которых другие запросы становились очень медленными. Мы решили эту проблему, скопировав данные, которые должны были обрабатываться MR-заданиями, в выделенную базу данных обработки данных на другом хосте.
Помимо методов mongooplog и настраиваемого курсора для копирования данных между базами данных, упомянутых Адамом, вы также можете сделать это напрямую через javascript для копирования только необходимых вам данных (возможно, поэтапно). См. Это сообщение в блоге для получения дополнительной информации: Качество обслуживания в MongoDB. Вы также можете использовать mongodump и mongorestore mongodump.