Устранение неполадок и отладка MongoDB
Какие первые шаги вы предпринимаете, когда приложение MongoDB работает медленно?
Ответ:
Сначала я бы проверил журналы MongoDB на наличие ошибок или медленных запросов. Затем я бы использовал mongostat и mongotop для мониторинга метрик производительности в реальном времени и выявления активных операций или коллекций, потребляющих ресурсы. Наконец, я бы проанализировал db.currentOp(), чтобы увидеть текущие операции.
Как вы определяете медленно выполняющиеся запросы в MongoDB?
Ответ:
Я использую команду db.setProfilingLevel(1, { slowms: 100 }) для включения профилирования базы данных, которое регистрирует запросы, превышающие заданный порог. Альтернативно, я могу использовать db.system.profile.find(), чтобы напрямую запрашивать коллекцию профилировщика для медленных операций. План explain() также имеет решающее значение для понимания выполнения запроса.
Запрос постоянно работает медленно. Какие инструменты и методы вы бы использовали для его оптимизации?
Ответ:
Я бы использовал explain('executionStats') для анализа плана запроса, выявления отсутствующих индексов или неэффективных этапов. На основе вывода explain я бы создал соответствующие индексы. Если индексирования недостаточно, я бы рассмотрел возможность изменения схемы или реструктуризации запроса.
Как вы устраняете высокую загрузку ЦП на сервере MongoDB?
Ответ:
Высокая загрузка ЦП часто указывает на неэффективные запросы, отсутствующие индексы или чрезмерные операции записи. Я бы проверил mongostat на наличие активных операций, db.currentOp() на наличие длительных процессов и профилировщик на наличие медленных запросов. Инструменты на уровне ОС, такие как top или htop, также могут помочь определить использование ЦП процессом mongod.
Каковы распространенные причины высокого использования памяти в MongoDB и как их устранить?
Ответ:
Высокое использование памяти может быть связано с большими рабочими наборами (working sets), неэффективными запросами, извлекающими слишком много данных в ОЗУ, или неоптимизированными конвейерами агрегации. Я бы проверил db.serverStatus().wiredTiger.cache на предмет использования кэша и убедился в наличии надлежащего индексирования для уменьшения объема сканируемых данных. Может потребоваться масштабирование ОЗУ или шардирование.
Опишите, как бы вы отладили репликационный набор, который не синхронизируется должным образом.
Ответ:
Я бы начал с проверки rs.status() на всех узлах, чтобы определить состояние и работоспособность каждого узла. Затем я бы изучил журналы MongoDB на каждом узле на предмет ошибок, связанных с репликацией, проблем с сетью или сбоев применения oplog. Сетевое соединение между узлами также является частой причиной проблем.
Каково назначение профилировщика MongoDB и как его включить?
Ответ:
Профилировщик MongoDB собирает подробную информацию о операциях базы данных, включая время выполнения запросов, блокировки и ввод/вывод. Он помогает выявлять медленные запросы и операции. Вы включаете его с помощью db.setProfilingLevel(level, { slowms: threshold }), где level может быть 0 (выключено), 1 (медленные операции) или 2 (все операции).
Как вы справляетесь с ситуацией, когда экземпляр MongoDB исчерпал дисковое пространство?
Ответ:
Сначала я бы определил, что потребляет пространство, используя db.stats() и db.collection.stats(). Затем я бы поискал большие файлы журналов или старые резервные копии для удаления. Если проблема заключается в росте данных, я бы рассмотрел возможность добавления дискового пространства, внедрения шардирования или архивирования старых данных для уменьшения рабочего набора.
Вы подозреваете, что произошла взаимоблокировка (deadlock). Как бы вы расследовали это в MongoDB?
Ответ:
MongoDB использует оптимистичный контроль параллелизма, поэтому настоящие взаимоблокировки редки. Однако длительные операции, удерживающие блокировки, могут блокировать другие. Я бы использовал db.currentOp() для выявления операций со статусом waitingForLock и определения операции, удерживающей блокировку. При необходимости я мог бы завершить блокирующую операцию.
Какие ключевые метрики вы отслеживаете для здоровья и производительности MongoDB?
Ответ:
Ключевые метрики включают opcounters (чтения, записи, команды), connections (текущие, доступные), network (байты входящие/исходящие), memory (резидентная, виртуальная, отображенная), wiredTiger.cache (грязные байты, прочитанные/записанные страницы) и locks (глобальные, базы данных, коллекции). Они дают представление о рабочей нагрузке и использовании ресурсов.