Плагин MongoDB

Мониторинг производительности базы данных MongoDB с подробными метриками, охватывающими соединения, операции, репликацию и хранилище.

Обзор

Плагин MongoDB собирает детальные метрики с серверов MongoDB, включая:

  • Статистика соединений - Активные соединения, доступные соединения, лимиты соединений
  • Счётчики операций - Вставки, запросы, обновления, удаления, getmore, команды
  • Статус репликации - Здоровье replica set, лаг репликации, размер oplog
  • Использование памяти - Резидентная память, виртуальная память, отображённая память
  • Статистика хранилища - Размер данных, размер индексов, размер хранилища
  • Статистика блокировок - Время глобальной блокировки, блокировки баз данных
  • Сетевые метрики - Байты на входе/выходе, запросы в секунду

Требования

Версия MongoDB

  • Минимум: MongoDB 4.0
  • Рекомендуется: MongoDB 5.0 или новее
  • Протестировано с: MongoDB 4.4, 5.0, 6.0, 7.0

Зависимости Python

pip install pymongo>=4.3.0

Устанавливается автоматически при использовании PLUGINS=mongodb во время установки агента.

Доступ к MongoDB

Агенту нужен доступ на чтение к статусу и статистике сервера MongoDB.

Конфигурация

Базовая конфигурация

plugins:
  mongodb:
    enabled: true
    host: localhost
    port: 27017

С аутентификацией

plugins:
  mongodb:
    enabled: true
    host: localhost
    port: 27017
    username: monitor
    password: your-secure-password
    auth_database: admin

С Replica Set

plugins:
  mongodb:
    enabled: true
    host: localhost
    port: 27017
    username: monitor
    password: your-secure-password
    auth_database: admin
    replica_set: rs0

Все параметры конфигурации

plugins:
  mongodb:
    enabled: true                    # Enable/disable plugin
    host: localhost                  # MongoDB host
    port: 27017                      # MongoDB port
    username: monitor                # Username (optional)
    password: password               # Password (optional)
    auth_database: admin             # Auth database (default: admin)
    replica_set: rs0                 # Replica set name (optional)
    ssl: false                       # Use SSL/TLS (default: false)
    ssl_ca_certs: /path/to/ca.pem   # CA certificate path
    timeout: 10                      # Connection timeout (seconds)

Переменные окружения

Конфигурацию можно переопределить переменными окружения:

export MONGODB_HOST="localhost"
export MONGODB_PORT="27017"
export MONGODB_USERNAME="monitor"
export MONGODB_PASSWORD="password"

Настройка MongoDB

Создание пользователя мониторинга

Для MongoDB 4.x и 5.x:

use admin

db.createUser({
  user: "monitor",
  pwd: "your-secure-password",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
})

Для MongoDB 6.x и новее:

use admin

db.createUser({
  user: "monitor",
  pwd: passwordPrompt(),  // Prompts for password securely
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
})

Необходимые роли:

  • clusterMonitor - Чтение статуса и статистики в масштабе кластера
  • read для базы данных local - Чтение oplog для метрик репликации

Проверка прав пользователя

use admin
db.auth("monitor", "your-secure-password")

// Should succeed
db.serverStatus()
db.runCommand({ replSetGetStatus: 1 })

// Should list databases
db.adminCommand({ listDatabases: 1 })

Конфигурация MongoDB

Особая конфигурация MongoDB не требуется. Плагин использует стандартные команды мониторинга:

  • db.serverStatus() - Статистика сервера
  • db.replSetGetStatus() - Статус replica set
  • db.stats() - Статистика базы данных

Эти команды доступны по умолчанию во всех установках MongoDB.

Собираемые метрики

Метрики соединений

Метрика Описание Единица Тип
connections_current Текущее число открытых соединений Количество Gauge
connections_available Доступные соединения Количество Gauge
connections_total_created Всего когда-либо созданных соединений Количество Counter

Счётчики операций

Метрика Описание Единица Тип
opcounters_insert Операции вставки Количество Counter
opcounters_query Операции запроса Количество Counter
opcounters_update Операции обновления Количество Counter
opcounters_delete Операции удаления Количество Counter
opcounters_getmore Операции getmore (курсор) Количество Counter
opcounters_command Операции команд Количество Counter

Метрики памяти

Метрика Описание Единица Тип
mem_resident_mb Резидентная память (RAM) MB Gauge
mem_virtual_mb Виртуальная память MB Gauge

Сетевые метрики

Метрика Описание Единица Тип
network_bytes_in Получено байт Байты Counter
network_bytes_out Отправлено байт Байты Counter
network_num_requests Сетевые запросы Количество Counter

Метрики глобальной блокировки

Метрика Описание Единица Тип
globallock_queue_readers Читатели в очереди блокировок Количество Gauge
globallock_queue_writers Писатели в очереди блокировок Количество Gauge
globallock_active_readers Активные читатели Количество Gauge
globallock_active_writers Активные писатели Количество Gauge

Метрики кэша WiredTiger

Метрика Описание Единица Тип
wiredtiger_cache_bytes Текущий размер кэша Байты Gauge
wiredtiger_cache_mb Текущий размер кэша MB Gauge
wiredtiger_cache_max_bytes Максимальный размер кэша Байты Gauge
wiredtiger_cache_pages_evicted Страницы, вытесненные потоками приложения Количество Counter
wiredtiger_cache_dirty_bytes Отслеживаемые грязные байты в кэше Байты Gauge

Метрики информации о сервере

Метрика Описание Единица Тип
version Версия сервера MongoDB Строка Info
uptime_seconds Время работы сервера Секунды Counter

Метрики дашборда

Дашборд StatusRadar отображает:

Карточка обзора

  • Current Connections - Активные против доступных
  • Operations/sec - Скорость операций в реальном времени
  • Replication Lag - Для replica set
  • Memory Usage - Резидентная память

График соединений

  • Текущие соединения во времени
  • Порог лимита соединений
  • Оповещения о насыщении соединениями

График операций

  • Операции в секунду по типам
  • Разбивка insert/query/update/delete
  • Скорость выполнения команд

График репликации

  • Лаг репликации по участникам
  • Утилизация oplog
  • Статус здоровья replica set

График памяти

  • Использование резидентной памяти
  • Виртуальная память
  • Page faults

График хранилища

  • Рост размера данных
  • Размер индексов
  • Количество коллекций и документов

Установка

Быстрая установка

PLUGINS='mongodb' \
TOKEN='your-agent-token' \
MONGODB_USERNAME='monitor' \
MONGODB_PASSWORD='your-password' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Установите зависимость Python:

    cd /opt/statusradar
    source venv/bin/activate  # If using venv
    pip install pymongo
  2. Включите плагин в конфигурации:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      mongodb:
        enabled: true
        host: localhost
        port: 27017
        username: monitor
        password: your-secure-password
  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  4. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep mongodb

    Ожидаемо:

    INFO: Plugin mongodb: Metrics collected successfully
    INFO: Plugin mongodb: 25 metrics collected

Тестирование

Ручной тест плагина

cd /opt/statusradar
python3 plugins/mongodb_plugin.py

Ожидаемый вывод:

Plugin: mongodb
Enabled: True
Available: True

Collecting metrics...
{
  "connections_current": 52,
  "connections_available": 767,
  "connections_total_created": 1234,
  "opcounters_insert": 123456,
  "opcounters_query": 789012,
  "opcounters_update": 345678,
  "mem_resident": 512,
  "mem_virtual": 1024,
  "data_size": 2048,
  "index_size": 512,
  "repl_lag": 0.5,
  "repl_set_health": 1
}

Тест подключения к MongoDB

# Using mongo shell
mongo -u monitor -p your-password --authenticationDatabase admin

# Using mongosh (MongoDB 5.0+)
mongosh -u monitor -p your-password --authenticationDatabase admin

# Test serverStatus command
use admin
db.serverStatus()

Устранение неполадок

Плагин не собирает метрики

Проверка 1: Запущен ли MongoDB?

sudo systemctl status mongod

Проверка 2: Может ли агент подключиться к MongoDB?

mongo -u monitor -p password --authenticationDatabase admin --eval "db.serverStatus()"

Проверка 3: Установлен ли Python-пакет?

python3 -c "import pymongo; print(pymongo.__version__)"

Проверка 4: Проверьте логи агента

sudo journalctl -u statusradar-agent -n 100 --no-pager | grep mongodb

Распространённые ошибки

"Authentication failed"

Ошибка:

ERROR: Plugin mongodb: Authentication failed

Причины:

  1. Неверные имя пользователя/пароль
  2. Неверная база данных аутентификации
  3. У пользователя нет необходимых ролей

Решение:

// Verify user exists
use admin
db.getUser("monitor")

// Check user roles
db.getUser("monitor").roles

// Re-create user with correct roles
db.dropUser("monitor")
db.createUser({
  user: "monitor",
  pwd: "your-secure-password",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
})

"No module named 'pymongo'"

Ошибка:

ERROR: No module named 'pymongo'

Решение:

pip install pymongo
# Or if using venv:
cd /opt/statusradar && source venv/bin/activate && pip install pymongo

"Connection refused"

Ошибка:

ERROR: Plugin mongodb: Connection refused

Причины:

  1. MongoDB не запущен
  2. Неверный host/port
  3. Файрвол блокирует соединение

Решение:

# Check MongoDB is running
sudo systemctl status mongod

# Check MongoDB is listening
sudo netstat -tlnp | grep 27017

# Check bind address in MongoDB config
sudo grep bindIp /etc/mongod.conf

# If MongoDB only listens on 127.0.0.1, agent must run on same host
# Or configure MongoDB to bind to 0.0.0.0

"Command replSetGetStatus is not allowed"

Ошибка:

WARNING: Plugin mongodb: Cannot get replication status - not a replica set or insufficient permissions

Причина: MongoDB работает как standalone (не replica set)

Решение: Это предупреждение, а не ошибка. Для standalone-экземпляров метрики репликации не собираются. Все остальные метрики работают нормально.

"SSL/TLS error"

Ошибка:

ERROR: Plugin mongodb: SSL handshake failed

Решение:

Включите SSL в конфигурации:

plugins:
  mongodb:
    ssl: true
    ssl_ca_certs: /path/to/ca.pem

Влияние на производительность

На MongoDB

Минимальное влияние:

  • Плагин выполняет команды serverStatus(), replSetGetStatus() и dbStats()
  • Это команды мониторинга только для чтения, специально для этого предназначенные
  • Без операций записи и блокировок
  • Незначительные накладные расходы на CPU/память

Бенчмарк:

  • Накладные расходы MongoDB: < 0.1% CPU за сбор
  • Нет измеримого падения производительности
  • Безопасно запускать на продакшен-серверах

На агент

Использование ресурсов:

  • Память: +20 MB
  • CPU: +4% во время сбора
  • Сеть: +3 KB за сбор

Время сбора: 0.5-2 секунды в зависимости от размера базы данных

Сценарии использования

1. Мониторинг пула соединений

Отслеживайте:

  • Текущие соединения
  • Доступные соединения
  • Утилизацию соединений

Настройте оповещения на:

  • Соединения > 80% от максимума
  • Нет доступных соединений
  • Быстрый рост соединений

2. Производительность операций

Отслеживайте:

  • Операции в секунду
  • Соотношение query и update
  • Скорость выполнения команд

Настройте оповещения на:

  • Внезапный скачок операций
  • Высокую скорость удалений (потенциальная проблема)
  • Сбои команд

3. Здоровье репликации

Отслеживайте:

  • Лаг репликации
  • Здоровье участников replica set
  • Размер и утилизацию oplog

Настройте оповещения на:

  • Лаг репликации > 10 секунд
  • Падение участника replica set
  • Oplog утилизирован > 90%

4. Использование памяти

Отслеживайте:

  • Рост резидентной памяти
  • Размер рабочего набора
  • Page faults

Настройте оповещения на:

  • Память > 80% ОЗУ сервера
  • Высокую частоту page faults (рабочий набор не помещается в ОЗУ)

5. Рост хранилища

Отслеживайте:

  • Скорость роста размера данных
  • Соотношение размера индексов
  • Количество коллекций

Настройте оповещения на:

  • Быстрый рост данных
  • Размер индексов > размера данных (избыточная индексация)
  • Хранилище приближается к ёмкости диска

Лучшие практики

1. Используйте пользователя мониторинга только для чтения

Всегда создавайте выделенного пользователя мониторинга с минимальными правами:

db.createUser({
  user: "monitor",
  pwd: "secure-password",
  roles: [
    { role: "clusterMonitor", db: "admin" },
    { role: "read", db: "local" }
  ]
})

Преимущества:

  • Изоляция безопасности
  • Аудиторский след
  • Отзываемый доступ

2. Мониторьте Replica Set

Для продакшен-MongoDB:

  • Всегда используйте replica set (минимум 3 участника)
  • Мониторьте лаг репликации на всех вторичных узлах
  • Настройте оповещение на лаг > 10 секунд

3. Установите лимиты соединений

Настройте лимиты соединений MongoDB соответствующим образом:

# /etc/mongod.conf
net:
  maxIncomingConnections: 1000

Формула:

maxConnections = (Application pool size × App instances) + 100 (overhead)

4. Мониторьте размер Oplog

Для replica set:

  • Мониторьте утилизацию oplog
  • Убедитесь, что oplog покрывает не менее 24 часов операций
  • Увеличьте размер oplog, если утилизация > 80%

Проверьте часы oplog:

rs.printReplicationInfo()

5. Мониторинг индексов

  • Следите за соотношением размера индексов (должно быть < размера данных)
  • Проверяйте неиспользуемые индексы
  • Настройте оповещение на отсутствующие индексы (высокое время запросов)

6. Регулярные резервные копии

Не полагайтесь только на репликацию:

  • Планируйте ежедневные резервные копии
  • Тестируйте процедуры восстановления
  • Следите за завершением резервного копирования

Расширенная конфигурация

MongoDB Atlas

Для облака MongoDB Atlas:

plugins:
  mongodb:
    enabled: true
    host: cluster0.example.mongodb.net
    port: 27017
    username: monitor
    password: password
    auth_database: admin
    replica_set: atlas-abc123-shard-0
    ssl: true

Шардированный кластер

Мониторьте роутер mongos:

plugins:
  mongodb:
    enabled: true
    host: mongos.example.com
    port: 27017
    username: monitor
    password: password

Мониторьте каждый шард отдельно, развернув агент на primary каждого шарда.

Docker-контейнер

Мониторинг MongoDB в Docker:

plugins:
  mongodb:
    enabled: true
    host: mongodb-container-name  # Docker container name
    port: 27017
    username: monitor
    password: password

Или используйте host networking:

docker run --network host ...

Соображения безопасности

Безопасность паролей

Никогда не хардкодьте пароли:

# ✅ Good - environment variable
export MONGODB_PASSWORD="password"

# ❌ Bad - hardcoded in config
password: "my-password"  # Visible in config file

Сетевая безопасность

Правила файрвола:

# Only allow agent host to connect
sudo ufw allow from <agent-ip> to any port 27017
sudo ufw deny 27017

Bind IP MongoDB:

# /etc/mongod.conf
net:
  bindIp: 127.0.0.1,<private-ip>  # Don't bind to 0.0.0.0 unless necessary

SSL/TLS

Для продакшена всегда используйте SSL:

plugins:
  mongodb:
    ssl: true
    ssl_ca_certs: /etc/ssl/mongodb/ca.pem

Примеры конфигураций

Standalone разработка

plugins:
  mongodb:
    enabled: true
    host: localhost
    port: 27017

Продакшен Replica Set

plugins:
  mongodb:
    enabled: true
    host: mongo-primary.internal
    port: 27017
    username: monitor
    password: ${MONGODB_PASSWORD}  # From environment
    auth_database: admin
    replica_set: rs0
    ssl: true
    ssl_ca_certs: /etc/ssl/certs/ca-bundle.crt

MongoDB Atlas

plugins:
  mongodb:
    enabled: true
    host: cluster0.abc123.mongodb.net
    port: 27017
    username: monitor
    password: ${MONGODB_PASSWORD}
    auth_database: admin
    replica_set: atlas-cluster0-shard-0
    ssl: true

Docker Compose

plugins:
  mongodb:
    enabled: true
    host: mongodb  # Service name from docker-compose.yml
    port: 27017
    username: monitor
    password: monitor-password

Ограничения

Текущие ограничения

  1. Нет метрик по отдельным базам данных - Собирает только общесерверные метрики
  2. Нет анализа медленных запросов - Используйте профайлер MongoDB для медленных запросов
  3. Нет метрик эффективности индексов - Мониторьте через планы explain()
  4. Нет метрик шардинга - Ограниченная видимость шардированного кластера

Масштабируемость

Протестировано с:

  • Standalone-экземплярами до 1 ТБ
  • Replica set с 7 участниками
  • Базами данных с 1000+ коллекций

Производительность:

  • Время сбора слегка растёт с размером базы данных
  • Рекомендуется: < 10,000 коллекций для оптимальной производительности

Лучшие практики мониторинга

Ключевые метрики для наблюдения

Критические:

  1. Доступные соединения < 10
  2. Лаг репликации > 30 секунд
  3. Память > 90% ОЗУ
  4. Oplog заполнен > 95%

Важные: 5. Высокая частота сбоев команд 6. Медленные операции 7. Конкуренция за блокировки 8. Сетевые ошибки

Пороги оповещений

# Recommended alert thresholds
connections_available: < 50
replication_lag_seconds: > 10
memory_percent: > 85
oplog_percent: > 90
operations_per_second: > baseline + 3 std_dev

Устранение проблем с производительностью

Медленный сбор

Симптом: Сбор плагина занимает > 5 секунд

Решения:

  1. Проверьте производительность MongoDB:

    db.currentOp()  // Check for slow operations
    db.serverStatus().opcounters  // Check operation load
  2. Снизьте частоту мониторинга:

    agent:
      interval: 600  # 10 minutes instead of 5
  3. Проверьте сетевую задержку:

    ping mongodb-host

Высокое использование памяти

Симптом: Агент использует чрезмерно много памяти с плагином MongoDB

Решение: Это нормально — pymongo кэширует пулы соединений. Использование памяти должно стабилизироваться после первоначального подключения.

Дальнейшие шаги

On this page