В каких случаях возникает потеря согласованности в кластере баз данных?

«В каких случаях возникает потеря согласованности в кластере баз данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Согласованность в распределенной БД теряется при:

  1. Сетевом разделении (Split-Brain) — узлы кластера теряют связь, но продолжают обслуживать запросы на запись, создавая конфликтующие версии данных.

  2. Отказе узла во время фиксации транзакции — если транзакция подтверждена на первичном узле, но не успела реплицироваться на кворум вторичных узлов.

  3. Некорректных настройках согласованности — например, использование WriteConcern.UNACKNOWLEDGED в MongoDB.

    // Риск потери данных: запись без подтверждения от реплик
    collection.withWriteConcern(WriteConcern.UNACKNOWLEDGED)
              .insertOne(document);

Решение: Используйте протоколы с сильной согласованностью:

  • Кворумные записи (WriteConcern.MAJORITY в MongoDB, QUORUM в Cassandra).
  • Распределенные транзакции (2PC — Two-Phase Commit).
  • Модель Raft или Paxos для консенсуса в кластере.