Коротка відповідь
seniorКластер MongoDB – це група вузлів, що працюють як один логічний сервер. Він забезпечує реплікацію (primary + secondaries) для високої доступності та горизонтальне масштабування через шардінг. При проектуванні слід визначити кількість реплікаційних наборів, розподіл шард‑ключа та політику резервного копіювання.
Повне пояснення
Що це і навіщо
- Кластер MongoDB – сукупність вузлів, що працюють як єдиний логічний сервер. Він забезпечує high availability через реплікаційні набори (replica sets) і масштабованість за рахунок шардінгу.
Ключові принципи/терміни
- Replica set – primary + secondaries, автоматичний fail‑over.
- Shard – окремий вузол або реплікаційний набір, що зберігає частину даних.
- Shard key – поле, за яким розподіляються документи між шард‑ами.
- Config servers – зберігають метадані кластера (шард‑ключі, розподіл).
- mongos – роутер, який приймає запити від клієнтів і пересилає їх до відповідних шард‑ів.
Як це працює
- Клієнт підключається до mongos.
- mongos читає метадані з config servers, визначає, до якого шард‑у слід направити запит.
- Запит надсилається до primary шард‑у, який реплікує дані на свої secondaries.
- При збій primary – автоматичний вибір нового primary.
Практика й реалізація
- Replica set:
rs.initiate({ _id: "rs0", members: [{_id:0, host:"node1:27017"},{_id:1, host:"node2:27017"}] }) - Шардінг:
sh.addShard("rs0/node1:27017"), потімsh.enableSharding("mydb")іsh.shardCollection("mydb.mycoll", {userId: "hashed"}). - Config servers: 3 вузли,
mongod --configsvr. - mongos:
mongod --configdb rsConfig/host1,host2,host3 --shardsvr.
Тестування
- Unit:
jest+mongodb-memory-serverдля ін‑меморі тестів. - Integration: підключення до реального кластера, перевірка реплікації (
rs.status()) і шардінгу (sh.status()).
Оптимізація запитів
- Індекси на шард‑ключі та часто використовуваних полях.
- Використання
explain()для аналізу плану виконання. - Пагінація через
limit/skipабо курсори ($batchSize).
Масштабування
- Горизонтальне: додавання нових шард‑ів.
- Вертикальне: збільшення ресурсів вузлів (CPU, RAM).
Безпека
- Аутентифікація через SCRAM (
mongod --auth). - Ролі: readWrite, clusterAdmin.
- Шифрування на рівні диску (TLS/SSL) і шифрування даних.
Особливості в контексті ORM
- Mongoose:
mongoose.connect('mongodb://mongos-host/mydb')– підключення через роутер. - Prisma:
provider = "mongodb"уschema.prisma, підтримка реплікаційних наборів.
Типові помилки та edge cases
- Неправильний shard key → нерівномірний розподіл.
- Відсутність config servers → кластер не стартує.
- Перевантаження primary → затримки, використати read‑preference.
- Відсутність індексів → повнотекстові сканування.
- Неправильна конфігурація TLS → відмови підключення.
- Перевищення розміру shard key → збільшення кількості шард‑ів.
- Відсутність backup policy → ризик втрати даних.
- Неправильне використання
mongosу продакшн‑середовищі → підвищена латентність.
Cheatsheet
rs.initiate()– створити replica set.sh.addShard()– додати shard.sh.enableSharding(db)– включити шардінг для DB.sh.shardCollection(coll, {key: "hashed"})– шардінг колекції.mongod --configsvr– запустити config server.mongod --shardsvr– запустити shard node.mongos --configdb rsConfig/host1,host2,host3– запустити роутер.
Follow‑up питання
- Як вибрати shard key для колекції з великим об’ємом записів?
- Які переваги має
hashedshard key порівняно з range‑sharding? - Як забезпечити консистентність при читанні з secondaries?