8. Production: практики и антипаттерны
Сводка для введения кластера в production: ёмкость (RAM, CPU, диск, IOPS), стратегия бэкапов, rolling updates без простоя кворума. В конце — типичные антипаттерны, которые ломают SLA.
Capacity planning (ёмкость)
| Ресурс | На что смотреть |
|---|---|
| RAM | Рабочий набор + WiredTiger cache (~40–50% от RAM на выделенном узле — ориентир, не догма); рост индексов в memory |
| CPU | Агрегации, маршаллинг BSON, сжатие; всплески при миграции chunks (шарды) |
| Диск | Данные + индексы + oplog + запас под компактацию/миграции; рост с запасом месяцев вперёд |
| IOPS / latency | Пишущий primary чувствителен к «медленному» диску; secondaries — к задержке репликации |
Best practice: моделируйте нагрузку на staging с близким объёмом данных и профилем запросов; смотрите метрики cache hit, queue, opcounters.
Оценка объёма (ориентиры из кластера)
// Размер БД и коллекций (mongosh)
db.stats()
db.getCollectionNames().forEach(function (n) {
const s = db[n].stats()
// Вывести только крупное (порог подберите сами)
if (s.size > 1024 * 1024 * 100) {
print(`${n}: data ${(s.size / 1024 / 1024).toFixed(1)} MB, index ${(s.totalIndexSize / 1024 / 1024).toFixed(1)} MB`)
}
})
Disk sizing (размер и класс диска)
- Запас свободного места: алерты до критического порога (например <15–20% — уточняйте под политику и файловую систему).
- Рост data: TTL/архивация там, где продукт позволяет; шардирование — не замена планирования диска на каждом шарде.
- Тип носителя: NVMe/SSD для production-нагрузки; для secondaries тот же класс, если они обслуживают чтение SLA.
# mongod.conf — ограничение кэша WT освобождает часть RAM под ОС/процессы (пример)
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
Стратегия бэкапов
| Элемент | Смысл |
|---|---|
| RPO | Сколько данных допустимо потерять (интервал бэкапа + oplog для PITR) |
| RTO | За сколько времени восстановиться |
| Где хранить | Другой регион/аккаунт; шифрование; срок хранения |
| Проверка | Раз в квартал — тест restore на изолированный кластер |
Сочетания: снимки томов (быстро на больших данных) + периодический mongodump логических БД; для PITR — политика по oplog / managed backup.
Best practice: «есть скрипт бэкапа» без восстановленного инцидента на staging = непроверенный DR.
Rolling updates (обновление без остановки сервиса)
Типичный порядок для replica set:
- Обновить secondary (один узел): заменить бинарник/образ, перезапуск, дождаться
SECONDARYиrepl lag ≈ 0. - Повторить для остальных secondaries.
rs.stepDown(60)на текущем primary или снять primary последним плановым переключением; обновить бывший primary.- Проверить
featureCompatibilityVersionпо документации релиза (шаг до/после обновления — строго по гайду версии).
// Перед обновлением мажорной версии часто проверяют FCV (читаемость интерфейса зависит от версии)
db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })
// Установка FCV после успешного обновления всех членов — только по официальному чеклисту релиза
// db.adminCommand({ setFeatureCompatibilityVersion: "7.0" })
Production: читайте release notes и upgrade path; на шардированном кластере порядок: config servers → шарды → mongos (уточняйте для вашей версии).
Антипаттерны
| Антипаттерн | Почему больно |
|---|---|
| Нет индексов под реальные запросы | COLLSCAN, рост latency, диск и CPU; конкуренция с репликацией |
| Плохой shard key | Hot shard, перекос, дорогие миграции; broadcast-запросы |
| Один узел в production | Нет отказоустойчивости; обновления и бэкапы без кворума сложнее |
| «Сами себе бэкап» без теста restore | Инцидент = потеря данных или многодневный простой |
Иллюстрация «индекс был нужен»:
// До: полное сканирование коллекции
db.events.find({ type: "error", day: "2025-03-15" }).explain("executionStats")
// После создания составного индекса под фильтр
db.events.createIndex({ day: 1, type: 1 })
db.events.find({ type: "error", day: "2025-03-15" }).explain("executionStats")
Сводный production checklist
| # | Практика |
|---|---|
| 1 | Replica set (или шард) с осознанным writeConcern |
| 2 | Индексы + explain в CI/перед релизом тяжёлых запросов |
| 3 | Мониторинг lag, диск, cache, connections |
| 4 | Бэкапы с проверкой восстановления |
| 5 | Плановые rolling обновления и отдельный runbook на отказ majority |