Как установить 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 - это то, что вам нужно.