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

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

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

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

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

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

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

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

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


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

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

new WriteConcern.Majority(0, true, false)

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


person Andrew M    schedule 15.10.2013    source источник


Ответы (2)


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

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

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

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

person Max    schedule 20.03.2014

Из 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 — это то, что вам нужно.

person evanchooly    schedule 15.10.2013
comment
Спасибо, но я почти уверен, что REPLICA_ACKNOWLEDGED и REPLICAS_SAFE обеспечивают запись в памяти (без ошибок) на две машины. Мне нужно иметь запись на диск на большинстве машин. Если вы будете следовать конструкторам в этих двух статических методах, они оба оценивают одну и ту же проблему записи - (две записи, бесконечный тайм-аут, fsync = false) - person Andrew M; 16.10.2013
comment
docs.mongodb.org/manual/reference/write-concern Число больше 1: гарантирует, что операции записи были успешно распространены на указанное количество членов набора реплик, включая первичный. Если вы присвоите w значение, превышающее количество элементов набора, содержащих данные, MongoDB будет ждать, пока станут доступными несуществующие элементы, что означает блокировку MongoDB на неопределенный срок. Я думаю, что это так близко, как вы собираетесь получить. - person evanchooly; 16.10.2013
comment
Проблема не в количестве реплик, а в том, что нам нужно подтверждение записи на диск, а не просто безошибочное подтверждение (которое, по сути, является записью в памяти). (Если вы посмотрите на следующий абзац этой страницы, там есть волшебное значение, называемое большинством, которое нам нужно, тогда как REPLICA_ACKNOWLEDGED жестко запрограммировано на 2) - person Andrew M; 16.10.2013