Кассандра пишет уровень согласованности ВСЕ уточнения
Согласно документации Datastax для Cassandra:
"Если координатор не может выполнить запись в достаточное количество реплик для удовлетворения запрошенного уровня согласованности, он создает исключение" Недоступно "и не выполняет никаких записей".
Означает ли это, что во время записи данные, обновленные при записи, не будут доступны для запросов на чтение? Я имею в виду, что возможно, что 4/5 узлов успешно отправили УСПЕХ координатору, что означает, что их данные были обновлены. Но 5-й еще предстоит написать. Теперь, если запрос на чтение поступит и перейдет к одному из этих 4 узлов, он все равно будет показывать старые данные, пока координатор не получит подтверждение от 5-го узла и не отметит новые данные как действительные?
1 ответ
Если координатор знает, что он не может достичь согласованности до того, как попытается выполнить запись, он сразу же провалит запрос перед выполнением записи. (Это описано в приведенной цитате)
Однако, если координатор полагает, что на момент попытки было достаточно узлов для достижения настроенного уровня согласованности, он начнет отправлять свои данные своим партнерам. Если один из пиров не возвращает успешный результат, запрос не будет выполнен, и вы попадете в состояние, когда отказавшие узлы имеют старые данные, а переданные - новые.
Если поступит запрос на чтение, он покажет данные, которые он находит на узлах, к которым он достигает, независимо от того, старый он или новый.
Давайте возьмем ваш пример для демонстрации.
Если у вас есть 5 узлов, и у вас есть репликация 3. Это будет означать, что 3 из этих 5 узлов будут иметь запись, которую вы отправили. Однако один из трех узлов вернул координатору ошибку. Теперь, если вы читаете с уровнем согласованности ВСЕ. Вы прочтете все три узла и всегда получите новую запись (последняя отметка времени всегда побеждает).
Тем не менее, если вы читаете с уровнем согласованности ОДИН, есть вероятность 1/3, что вы получите старое значение.