Replica Set
Состав:
Primary— единственный узел с RW;Secondary— реплицирует через oplog (capped collection вlocal.oplog.rs);Arbiter— голосует, но не хранит данные (использовать осторожно: PSA-конфигурация снижает durability).
Election — Raft-подобный протокол с большинством голосов. Триггер по умолчанию: electionTimeoutMillis = 10000 (10 секунд без heartbeat от primary). Лимиты: до 50 узлов в replica set, до 7 голосующих.
Write concern
writeConcern определяет, сколько узлов должно подтвердить запись:
{ w: 1 }— только primary; запись может быть потеряна при failover.{ w: "majority" }— подтверждение от рассчитанного большинства; при обычной конфигурации защищает от rollback majority-committed данных.{ w: "majority", j: true }— дополнительно требует запись в журнал у подтверждающих узлов; сильнее durability, но выше latency.wtimeout— таймаут ожидания подтверждений (не отменяет запись на primary, только освобождает клиента).
Для критичных данных — { w: "majority", j: true }.
Read preference и read concern
readPreference:
primary(default) — свежие данные, нет масштабирования чтения;primaryPreferred— primary, fallback на secondary;secondary— только secondary (возможен replication lag);secondaryPreferred— secondary с fallback на primary;nearest— узел с минимальной сетевой задержкой.
readConcern:
local(default) — локальное состояние узла;available— sharded-only, без consistency-гарантий;majority— данные, реплицированные на большинство;linearizable— строжайшая, только сprimary+w: "majority";snapshot— для multi-document транзакций.
Чтение с secondary без causal consistency может вернуть stale data.
Failover
При недоступности primary replica set проводит election. Драйвер должен иметь корректные serverSelectionTimeoutMS, retryable writes (по умолчанию on с 3.6) и retryable reads (с 4.2). Во время переключения возможны кратковременные ошибки записи.
Анти-паттерны
- слабый
w: 1для критичных транзакций; - secondary reads там, где нужна свежесть;
- PSA (primary-secondary-arbiter) для durability-чувствительных данных;
- отсутствие drills failover в staging.
Практика
Статус replica set
rs.status()
rs.printReplicationInfo()
rs.printSecondaryReplicationInfo()
Write concern в connection string
mongodb://db1,db2,db3/?replicaSet=rs0&readPreference=primary&w=majority&journal=true
Запись с явным write concern
db.orders.insertOne(
{ orderId: 42, status: 'open' },
{ writeConcern: { w: 'majority', j: true, wtimeout: 5000 } }
)