Как установить WriteConcern для очень безопасной записи в реплику MongoDB, установленную в Java

У нас есть требование записать один конкретный бит данных в набор реплик Монго и быть действительно уверенным, что это безопасно (это законное требование). Существует ли стандартный WriteConcern, который инкапсулирует запись на диск в большинстве узлов? Что-то вроде MAJORITY_FSYNCED.

Лучшее, что я придумал, это следующее - это действительно? WriteConcern replicaSetFsyscToMajority = new WriteConcern.Majority(0, true, false);

Глядя на предопределенные уровни в классе WriteConcern драйвера Java, ни один из существующих уровней, как я могу судить, не совсем соответствует тому, что мне нужно:

FSYNCED означает защищенную запись на диск только на основной. (Таким образом, обвал основного узла может привести к потере записи)

REPLICAS_SAFE, по-видимому, означает, что запись была подтверждена как минимум двумя репликами и записана в память, а не обязательно на диск (поэтому отключение питания для всего набора реплик mongo может привести к потере записи). БОЛЬШИНСТВО аналогично - но ((n/2) + 1) реплики.

Дополнительные примечания / комментарии

  • Мы используем драйверы Java 2.11.2 на Java 7.
  • Очевидно, что для этих супер-безопасных записей производительность падает, мы довольны этим (или, точнее, наша нагрузка достаточно низкая, что является преждевременной оптимизацией).
  • Если мы не можем записать в базу данных, мы можем повторить попытку, но если это не удастся, для нас будет лучше * прервать путешествие пользователя, чем продолжать без записи в БД:(Как я уже сказал, это законное требование.

* для данного определения лучше!


РЕДАКТИРОВАТЬ: То, что мы пытались до сих пор...

Мы пробовали использовать:

new WriteConcern.Majority(0, true, false)

и я могу сказать, что он не выдает никаких ошибок (мы можем читать и писать, и все наши тесты пройдены), я понятия не имею, проверяет ли он какие-либо записи, и я не профилировал производительность.

2 ответа

Вы правы в том, что проблема записи, касающаяся вторичных серверов, только подтверждает подтверждение, а не то, что данные были записаны на диск.

Я не знаком с драйвером Java, но вы должны быть в состоянии установить Journaling и WriteConcern отдельно. Но имейте в виду, что даже при J=1 и W=Majority также существует возможность отката, как описано в этом вопросе SO: Может ли откат по-прежнему происходить с репликой MongoDB, установленной с J=1 и W=Majority?

J=1 обеспечит безопасность данных на первичном узле, вторичные также обеспечат некоторую защиту в форме репликации.

Чтобы добавить дополнительную уверенность, рассмотрите возможность использования RAID или аналогичного на жестком диске основного устройства.

Из Javadoc в WriteConcern:

/**
 * Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
 */
public final static WriteConcern REPLICA_ACKNOWLEDGED= new WriteConcern(2);

/**
 * Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation.
 * <p>
 * This field has been superseded by {@code WriteConcern.REPLICA_ACKNOWLEDGED}, and may be deprecated in a future release.
 * @see WriteConcern#REPLICA_ACKNOWLEDGED
 */
public final static WriteConcern REPLICAS_SAFE = new WriteConcern(2);

Поэтому я думаю, что REPLICAS_SAFE или REPLICA_ACKNOWLEDGED - это то, что вам нужно.

Другие вопросы по тегам