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

Рейтинг: 64% · 20 голосов
SQL и NoSQL: PostgreSQL, MySQL, Redis, MongoDB, ClickHouse, ElasticSearch — проектирование схем, индексы, репликация и оптимизация запросов.
Аватара пользователя
jbosco
Сообщения: 60
Зарегистрирован: 11 май 2026, 02:28

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

Сообщение jbosco »

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

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

Сообщение ronox »

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

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

Сообщение asynclover »

Часть данных реально старше года и почти не читается. TTL вариант, но удалять жалко, нужно для аудита.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
kernel_veteran
Сообщения: 63
Зарегистрирован: 11 май 2026, 06:09

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

Сообщение kernel_veteran »

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

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

Сообщение tatiankake »

А не проще ли просто на постгрес с партиционированием уехать раз уж данные аудитные и схема стабильная?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
qcdeed
Сообщения: 57
Зарегистрирован: 11 май 2026, 20:16

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

Сообщение qcdeed »

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

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

Сообщение pythonfan »

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

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

Сообщение TcpAdmin »

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

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

Сообщение tiger31 »

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

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

Сообщение grahamd »

✔ Лучший ответ — сформирован автоматически
Шардинг при ограниченном бюджете — боль, потому что нужны минимум 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
Похожие запросы: частичный и покрывающий индекс в postgresql когда нуженjsonb в postgresql операторы и индексацияпартиционирование таблиц postgresql по датематериализованное представление postgresql как обновлятьpostgresql не использует индекс делает seq scanpostgresql какой индекс выбрать btree gin gist brin

Вернуться в «Базы данных»

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

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