← Back to notes

MongoDB replica sets: write
concern, read preference, failover


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 } }
)

Ссылки

MongoDB replica sets: write concern, read preference, failover | Aleksandr Suprun