Повторите попытку UnavailableException в другом центре обработки данных.

Я использую драйвер DataStax Cassandra Java 2.1.2, чтобы клиенты подключались к одному из трех центров обработки данных, например:

.withLoadBalancingPolicy(новая TokenAwarePolicy(новая DCAwareRoundRobinPolicy("DC1",1)))

Это устанавливает DC1 как локальный центр обработки данных, но также заставляет драйвер установить одно соединение с двумя другими удаленными центрами обработки данных.

Теперь, если некоторые из узлов в локальном центре обработки данных не работают, клиент не сможет получить локальный кворум на операторе вставки, и будет выдано исключение UnavailableException. Но в удаленных центрах обработки данных имеется достаточно узлов, чтобы вставка могла получить кворум и завершиться успешно, поэтому я хотел бы, чтобы драйвер повторил попытку вставки в другие центры обработки данных. Но как сказать водителю сделать это?

Похоже, есть способ настроить RetryPolicy на повторную попытку с более низким уровнем согласованности, но я ничего не вижу о повторной попытке в удаленный центр обработки данных.

Если все узлы в DC1 не работают, то драйвер пытается выполнить вставку в удаленном центре обработки данных, где это удается.


person Jim Meyer    schedule 12.12.2014    source источник


Ответы (1)


В итоге я заставил это работать: я сначала пытаюсь вставить эти настройки (обратите внимание, что я использую предложение «ЕСЛИ НЕ СУЩЕСТВУЕТ» во вставке):

statement.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM); statement.setSerialConsistencyLevel(ConsistencyLevel.LOCAL_SERIAL);

Это говорит Cassandra выполнять вставку только в том случае, если она может получить локальный кворум как для проверки «ЕСЛИ НЕ СУЩЕСТВУЕТ», так и для записи. Если живых реплик недостаточно для обеспечения локального кворума, я перехватываю исключения UnavailableException и NoHostAvailableException и изменяю уровень согласованности на:

statement.setConsistencyLevel(ConsistencyLevel.QUORUM); statement.setSerialConsistencyLevel(ConsistencyLevel.SERIAL);

Затем я снова пытаюсь вставить, и на этот раз он попытается получить кворум во всех центрах обработки данных и преуспеет. Таким образом, при таком подходе я получаю приличную производительность для большинства вставок, ограничивая очень дорогую проверку «ЕСЛИ НЕ СУЩЕСТВУЕТ» локальным контроллером домена, в то же время получая надежность, не будучи мертвым в воде, когда некоторые из локальных реплик не работают.

person Jim Meyer    schedule 26.12.2014