У нас есть требование записать один конкретный бит данных в набор реплик монго и быть действительно уверенным, что это безопасно (это юридическое требование). Существует ли стандартный 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)
и я могу сказать, что он не выдает никаких ошибок (мы можем читать и писать, и все наши тесты проходят), я понятия не имею, проверяет ли он записи в какой-либо степени, и я не профилировал его производительность.