Что произойдет, если узел в базе данных Cassandra выйдет из строя при передаче данных клиенту?
Допустим, у нас есть кластер Cassandra из 6 узлов и RF=3. Таким образом, если мы сделаем запрос на извлечение данных из определенного узла и во время обработки или передачи данных, узел потерпит неудачу. Каковы возможные результаты для следующего сценария?
Допустим, что при обработке требуемых данных с диска узел умирает в процессе, отправит ли координатор (узел, получивший наш запрос) запрос на один из реплицированных узлов или просто вернет ошибку клиенту?
Скажем, узел умер, когда он передавал данные. Так будет ли координатор возвращать частичные данные? или координатор поймет, что информация является неполной, и повторно отправит запрос другому узлу (реплике)?
В любом случае, как программисту, мы должны явно кодировать какие-либо условия, чтобы сообщить серверу Cassandra, или все это позаботилось о внутренних?
Заранее спасибо.
PS: мне жаль, если подобный вопрос был задан ранее. Я попытался найти, но не смог найти.
1 ответ
Одним из наиболее важных понятий, которые нужно понять в Cassandra, является его переменная "Уровень согласованности", или CL. Возможно, наиболее распространенным параметром является CL=QUORUM, что означает, что при RF=3 (каждый фрагмент данных реплицируется на 3 узла), Cassandra потребуется два успешных ответа из двух реплик, прежде чем возвращать результат клиенту.
В запросе на конкретный раздел координатор начинает с отправки клиентских запросов в 2 из 3 реплик, которые, как известно, содержат раздел. Cassandra сохраняет оценку средней задержки ответа, и, когда эта оценка прошла, она отправляет третий запрос третьей реплике. Такой таймаут произойдет в тех случаях, которые вы упомянули - если ответ не завершится быстро (не имеет значения, был ли он частично выполнен), отправляется третий запрос. Если два узла не работают одновременно, вы получите полный ответ, и клиенту не нужно ни о чем заботиться. Это особенность "высокой доступности", которой славятся Cassandra и другие базы данных NoSQL.
Обратите внимание, что этот ответ верен даже для очень длинных ответов (сканирование всей таблицы или извлечение очень длинного раздела). Такие длинные ответы разбиты на "страницы" разумной длины, каждая страница извлекается в отдельном запросе и может быть получена из 2 из 3 реплик, не обязательно одной и той же.
Все, что я написал выше, относится и к Сцилле, и к Кассандре.