2016-07-06 3 views
2

операция истекла - получила только 0 ответов ", информации: 'Представляет сообщение об ошибке с сервера', кода: 4608, консистенции: 1, получил: 0, blockFor: 1 , isDataPresent: 0, ...операция Cassandra истекла

Я получаю эту ошибку несколько раз в день, пытаясь сделать запросы SELECT на моем кластере cassandra. У нас есть кластер из 3 узлов в экземплярах m1.large aws. Они преуспевают большую часть времени, но каждый раз мы получаем ошибку выше. Мы еще не в производстве, поэтому все таблицы небольшие. У нас нет таблиц по нескольким тысячам строк, и одни и те же запросы завершаются в разное время. Увеличение времени ожидания - это не вариант, и я не верю, что он решит проблему (запросы должны быть короткими, и запрос в ошибке один и тот же каждый раз)

Может ли это быть какое-то соединение, между узлами или сетевой проблемой? Каков наилучший способ проверить их? Я также вижу эту ошибку только на моей стороне клиента, есть ли где-нибудь, что я должен видеть это в журналах cassandra?

ответ

1

Это на самом деле ошибка, возвращаемая с сервера C *, которая отвечает за обработку вашего запроса (он же «координатор»).

Похоже, что вы запрашиваете уровень согласованности «ONE», поэтому только 1 реплика, содержащая данные, должна отвечать координатору в пределах сконфигурированного read_request_timeout_in_ms в вашем файле cassandra.yaml на сервере (по умолчанию - 5 секунд) , но в течение этого периода ответы не отреагировали.

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

Вот несколько вещей, которые вы должны рассмотрите:

  1. Увеличьте коэффициент репликации в пространстве ключей, с которым вы запрашиваете данные. Если ваш коэффициент репликации равен 1, вы зависите от 1 узла, чтобы быть доступным для ответа на запросы для определенного раздела. Увеличение вашего RF до уровня 3 сделает ваше приложение более устойчивым к плохо работающим узлам или узлам.
  2. Настройте свой RetryPolicy, чтобы повторить чтение в зависимости от того, как вы хотите, чтобы он себя вел. По умолчанию с nodejs-драйвером следует только один раз повторить чтение, и только если received>blockFor (что в вашем случае это не так).
  3. Увеличение read_request_timeout_in_ms в вашей cassandra.yaml. Я бы обескуражил это, хотя 5000ms должно быть более чем достаточно, если у вас нет плохой конфигурации/окружения/запросов.
+0

В настоящее время мы используем ВЧ 2, поэтому данные находятся не менее чем на 2 узлах. Я уменьшил таймаут, так как я не верю, что запросы, которые терпят неудачу, когда-либо будут успешными. Таким образом, мы можем потерпеть неудачу раньше. По умолчанию это похоже на тайм-аут запросов по диапазонам за 10 секунд. Я понимаю, что мы должны справляться с ошибками, и мы ловим ошибки, но задержка в запросе является проблемой для нас. Я не думаю, что кластер из 3-х узлов должен испытывать таймауты с нашей нагрузкой (малыми). Это моя главная проблема. Я не хочу больше тайм-аутов с большим количеством пользователей, но это, похоже, не связано с нагрузкой. –

+0

Выполняете ли вы какой-либо мониторинг на стороне C *, чтобы узнать, может ли быть какое-либо возможное объяснение в отношении задержек? Я бы порекомендовал взглянуть на nodetool cfstats, чтобы узнать, показывает ли это что-либо, и отслеживать любую статистику os, чтобы узнать, дает ли это представление.Еще одна вещь, которая может быть интересной, - это включить трассировку запроса, которая поможет объяснить, почему запросы иногда могут занять некоторое время. –

+0

Мы используем новую реликвию для мониторинга сервера и статистики os, но ничего напрямую связанного с cassandra, но все выглядит нормально. Я нашел актуальную проблему сегодня, мы создаем длинный канал, и определенный запрос с использованием плагина cassandra lucene занимает много времени, и мы снимали много из них за один раз. Это происходит только раз в то время, поэтому было трудно отследить. Я изменил запрос, чтобы не использовать плагин и фильтр в нашем процессе, и теперь он работает хорошо. Благодаря! –