Проблема: каталог з довільними атрибутами «ламає» реляційну модель
Ми налаштовували MongoDB для інтернет-магазину електроніки: кожна категорія має унікальний набір характеристик (діагональ, кількість ядер, об'єм пам'яті). У PostgreSQL довелося б городити EAV або JSON-поля — складні запити та падіння продуктивності при 500 товарах. MongoDB вирішила це без болю: схема не фіксована, а BSON-документи ідеально лягають на структуру товару. Наш клієнт — магазин з 5000 товарів у 20 категоріях — отримав час відповіді запитів під 10 мс без спеціальної оптимізації. Розповімо, як налаштувати таку базу під ключ.
Проблеми, які вирішуємо
- N+1 запитів при роботі з документами — типова помилка, коли замість вкладених масивів дістають пов'язані документи окремими запитами. Рішення: використовувати
$lookupв агрегації або зберігати вкладені підмасиви. - Повільний запис без реплікації — при падінні єдиного вузла втрачаються дані за хвилини. Replica Set з трьох серверів дає RPO=0 та автоматичне перемикання.
- Індекси не покривають запити — без часткових та складених індексів агрегації за статусом і датою виконуються за секунди замість мілісекунд. З правильно налаштованими індексами продуктивність запитів зростає в 10–100 разів.
Як ми налаштовуємо MongoDB: кейс з Replica Set
Для того ж інтернет-магазину ми розгорнули кластер на трьох серверах (MongoDB 7.0, Ubuntu 22.04). Налаштували Replica Set з двома звичайними вузлами та одним прихованим для бекапів. Connection string застосунку: mongodb://myapp:password@mongo1:27017,mongo2:27017/myapp?replicaSet=rs0&readPreference=secondaryPreferred. У результаті — відмовостійкість та балансування читання на вторинні вузли. Навантаження 10 000 запитів на секунду тримається без затримок.
Встановлення та конфігурація
# Установка MongoDB 7.0 curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-7.0.list apt update && apt install -y mongodb-org systemctl enable mongod && systemctl start mongod # /etc/mongod.conf (основные настройки) net: port: 27017 bindIp: 127.0.0.1 # для продакшена замените на внутренний IP security: authorization: enabled storage: dbPath: /var/lib/mongodb wiredTiger: engineConfig: cacheSizeGB: 2 # 50% RAM replication: replSetName: "rs0" operationProfiling: slowOpThresholdMs: 100 mode: slowOp Індекси під типові запити
// Создаём индексы сразу при проектировании схемы // Уникальный индекс по email db.users.createIndex({ email: 1 }, { unique: true, background: true }) // Составной для сортировки заказов пользователя db.orders.createIndex({ userId: 1, createdAt: -1 }) // Частичный — только активные сессии db.sessions.createIndex( { userId: 1, expiresAt: 1 }, { partialFilterExpression: { revokedAt: { $exists: false } } } ) // TTL-индекс — автоудаление логов через 30 дней db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 2592000 }) // Текстовый поиск с русским языком db.articles.createIndex({ title: "text", body: "text" }, { default_language: "russian" }) // Wildcard для каталога с произвольными атрибутами db.products.createIndex({ "attributes.$**": 1 }) Агрегація: виручка за категоріями
db.orders.aggregate([ { $match: { createdAt: { $gte: ISODate("2024-01-01"), $lt: ISODate("2024-04-01") }, status: "paid" } }, { $unwind: "$items" }, { $lookup: { from: "products", localField: "items.productId", foreignField: "_id", as: "product" } }, { $unwind: "$product" }, { $group: { _id: "$product.category", revenue: { $sum: { $multiply: ["$items.price", "$items.quantity"] } }, orders: { $addToSet: "$_id" } } }, { $project: { category: "$_id", revenue: { $round: ["$revenue", 2] }, orderCount: { $size: "$orders" } } }, { $sort: { revenue: -1 } } ]) Як обрати топологію MongoDB для вашого проекту?
| Топологія | Навантаження | Об'єм даних | Відмовостійкість | Складність адміністрування |
|---|---|---|---|---|
| Одиночний вузол | до 10 000 оп/с | до 100 ГБ | Немає | Низька |
| Replica Set | до 50 000 оп/с | до 10 ТБ | Автоматичне перемикання | Середня |
| Шардований кластер | >50 000 оп/с | >10 ТБ | Висока (горизонтальне масштабування) | Висока |
Чому Replica Set обов'язковий для продакшену?
Replica Set — мінімальна конфігурація для production. Одиночний вузол не забезпечує відмовостійкість: при збої в роботі сервера дані недоступні до відновлення. Replica Set з трьох вузлів гарантує автоматичне перемикання на вторинний вузол протягом секунд. RPO (точка відновлення) прямує до нуля. Для більшості застосунків це оптимальний баланс надійності та вартості. Зв'яжіться з нами — ми проведемо аудит вашої поточної схеми та запропонуємо оптимальну топологію.
Процес роботи
| Етап | Що робимо | Строк |
|---|---|---|
| Аналітика | Вивчаємо навантаження, схеми, типові запити. Визначаємо необхідність шардування. | 1 день |
| Проектування | Обираємо топологію (Replica Set, шардування), конфігурацію серверів, індекси. | 1 день |
| Реалізація | Розгортаємо сервери, налаштовуємо реплікацію, створюємо індекси, пишемо міграції. | 1–3 дні |
| Тестування | Навантажувальне тестування, перевірка failover, моніторинг. | 1 день |
| Деплой | Перемикання на продакшен, документація, навчання команди. | 1 день |
Що входить в роботу
- Конфігурація сервера та мережі (авторизація, TLS)
- Налаштування Replica Set або шардованого кластера
- Створення індексів під навантаження (часткові, TTL, текстові)
- Оптимізація агрегаційних запитів
- Інтеграція з Mongoose/Node.js (схеми, хуки, віртуальні поля)
- Налаштування моніторингу (MongoDB Atlas, Prometheus + Grafana)
- Резервне копіювання (mongodump + автоматизація)
- Документація та інструкції для команди
Типові помилки при налаштуванні MongoDB
- Відсутність індексів для сортування —
sort()без індексу призводить до сканування колекції (колапс продуктивності). - Ігнорування розміру WiredTiger cache — за замовчуванням 50% RAM, для великих робочих наборів потрібно збільшувати до 70%.
- Глобальний
uniqueіндекс на email — блокує реєстрацію однакових email в різних статусах. Використовуйте часткові індекси. - Запис у Replica Set без
writeConcern: majority— при відкаті первинного вузла дані можуть бути втрачені.
Строки та вартість
Базове налаштування Replica Set з індексами та моніторингом — від 2 до 5 днів. Вартість розраховується індивідуально і залежить від складності схеми та кількості вузлів. Зв'яжіться з нами для оцінки вашого проекту — ми підготуємо комерційну пропозицію за один робочий день. Замовте налаштування MongoDB у сертифікованих спеціалістів з 10-річним досвідом.
Чому варто замовити налаштування у нас?
Ми сертифіковані спеціалісти MongoDB (понад 10 років досвіду в адмініструванні NoSQL). За цей час налаштували понад 50 кластерів для проектів з навантаженням до 100 000 запитів на секунду. Надаємо гарантію на всі роботи — від 3 до 12 місяців залежно від SLA. Отримайте консультацію прямо зараз — ми безкоштовно оцінимо вашу поточну архітектуру.







