Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Рейтинг: 64% · 20 голосов
SQL и NoSQL: PostgreSQL, MySQL, Redis, MongoDB, ClickHouse, ElasticSearch — проектирование схем, индексы, репликация и оптимизация запросов.
Ответить
Аватара пользователя
asyncgo9533
Сообщения: 5
Зарегистрирован: Чт май 14, 2026 10:57 pm

Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение asyncgo9533 »

MongoDB 7, коллекция разрослась до 800GB, рабочий набор индексов уже не помещается в RAM сервера (64GB). Запросы по холодным данным проседают в разы. Шардить, апгрейдить железо или резать данные? Бюджет ограничен.
👍 ❤️ 🔥 😄 🤔
✔ Лучший ответ сформирован автоматически — kirill_net
Шардинг при ограниченном бюджете — боль, потому что нужны минимум 3 конфиг-сервера + 2 шарда. Но есть промежуточный вариант: Atlas Online Archive (если готов к облаку) или просто MongoDB Atlas M30 с авто-индексированием. Если self-hosted — смотри на WiredTiger cache size, по умолчанию он берёт 50% RAM минус 1 ГБ, то есть у тебя 31.5 ГБ кэша. Проверь через db.serverStatus().wiredTiger.cache что ev…
Перейти к ответу →
Аватара пользователя
vadim_py69
Сообщения: 4
Зарегистрирован: Пт май 15, 2026 2:56 am

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение vadim_py69 »

800GB на одном инстансе с 64GB RAM — ты уже за пределами комфортной зоны. Либо вертикально докинуть память (это дешевле шардинга в обслуживании), либо TTL-индекс и архивировать старое в холодное хранилище.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
lev_daemon
Сообщения: 2
Зарегистрирован: Пн май 11, 2026 3:40 am

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение lev_daemon »

Часть данных реально старше года и почти не читается. TTL вариант, но удалять жалко, нужно для аудита.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
alex_root87
Сообщения: 2
Зарегистрирован: Сб май 16, 2026 12:04 pm

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение alex_root87 »

Тогда не TTL а online archive: выгружай старьё в S3/Parquet через mongodump или Atlas Online Archive, в горячей базе оставляй только свежак. Аудит по холодному хвосту делается раз в год, ему скорость не нужна.
👍 ❤️1 🔥 😄 🤔1
Аватара пользователя
ruslan_pro
Сообщения: 24
Зарегистрирован: Чт май 14, 2026 3:04 am

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение ruslan_pro »

А не проще ли просто на постгрес с партиционированием уехать раз уж данные аудитные и схема стабильная?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
omegadata6306
Сообщения: 4
Зарегистрирован: Чт май 14, 2026 11:52 am

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение omegadata6306 »

Если схема устаканилась и нужна аналитика по аудиту — да, PostgreSQL с partition by range по дате тут будет уместнее и дешевле в эксплуатации. Старые партиции можно вообще detach и на медленный диск.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
igor_pixel18
Сообщения: 8
Зарегистрирован: Ср май 13, 2026 1:59 pm

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение igor_pixel18 »

Хорошо, план такой: чищу мёртвые индексы прямо сейчас (быстрая победа), а параллельно делаю PoC выгрузки холодного хвоста в архив. Спасибо, разложили по полочкам!
👍3 ❤️ 🔥 😄2 🤔
Аватара пользователя
valera_vector
Сообщения: 32
Зарегистрирован: Пн май 11, 2026 8:23 am

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение valera_vector »

800 ГБ с индексами которые не влезают в 64 ГБ — это сигнал что пора смотреть на архивирование холодных данных ещё до шардинга. Сначала сделай db.collection.stats() и смотри на totalIndexSize. Скорее всего там несколько compound-индексов которые дублируют друг друга или покрывают запросы которые давно не используются. Через explain("executionStats") прогони топ медленных запросов и выброси индексы которые не попадают ни в один IXSCAN. У нас на аналогичном объёме это дало минус 30% от размера индексов.
👍3 ❤️1 🔥1 😄 🤔
Аватара пользователя
nethex8167
Сообщения: 12
Зарегистрирован: Ср май 13, 2026 10:06 am

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение nethex8167 »

Если чистка индексов не помогает — Time-Series collections в MongoDB 7 дают встроенное compressed-хранение для временных данных с гораздо меньшим footprint индексов. Если у тебя есть timestamp-поле и данные старше 6-12 месяцев нужны редко — мигрируй исторические данные в отдельную TS-коллекцию с TTL или просто в архивную без индексов. Горячая коллекция с 90 днями данных влезет в RAM гораздо лучше.
👍 ❤️1 🔥 😄 🤔3
Аватара пользователя
kirill_net
Сообщения: 10
Зарегистрирован: Вт май 12, 2026 1:04 pm

Re: Накопилось 800GB в MongoDB, индексы не лезут в RAM — что делать?

Сообщение kirill_net »

✔ Лучший ответ — сформирован автоматически
Шардинг при ограниченном бюджете — боль, потому что нужны минимум 3 конфиг-сервера + 2 шарда. Но есть промежуточный вариант: Atlas Online Archive (если готов к облаку) или просто MongoDB Atlas M30 с авто-индексированием. Если self-hosted — смотри на WiredTiger cache size, по умолчанию он берёт 50% RAM минус 1 ГБ, то есть у тебя 31.5 ГБ кэша. Проверь через db.serverStatus().wiredTiger.cache что eviction не слишком агрессивный — если "pages evicted by application threads" растёт, это и есть твои просадки.
👍1 ❤️2 🔥 😄 🤔1
Ответить
Поделиться темой: ✈ Telegram VK

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость