Проблема с обновлением в приложении, запрашивающем schema_keyspaces и использующим политику RoundRobin - PullRequest
0 голосов
/ 06 ноября 2018

В нашем java-приложении версии 1, которое использует cassandra 2.1

При запуске мы выполняем запрос: "* SELECT * from system.schema_keyspaces; *", чтобы получить информацию о пространстве ключей (если это не удастся, приложение не запустится)

Однако новый код мы получаем информацию о пространстве клавиш из экземпляра драйвера cluster.metadata, который использует cassandra 3.11

Мы используем политику балансировки нагрузки RoundRobin, поддерживающую DC Драйвер Datastax.

Теперь рассмотрим сценарий с обновлением 3 узлов: A, B и C, где A обновляется (новое приложение + Cassandra 3.11), обновление на B находится в процессе (Cassandra здесь внизу), а C не обновляется (старый приложение + Кассандра 2.1). и ваше клиентское приложение на узле C перезапускается.

Я получаю InvalidQueryException, если старый запрос, присутствующий на клиенте java узла C, выполняется на A (так как клиент будет отправлять запрос циклически). если это не удается, в старом приложении нет обработки. Как мы можем решить эту проблему?

com.datastax.driver.core.exceptions.InvalidQueryException: un-configured table schema_keyspaces

Один из способов выяснить, как удалить Ip А из точек контакта клиентского приложения + таблица пиров на узле C Cassandra. Теперь перезапустите клиентское приложение. а затем Кассандра, чтобы восстановить запись таблицы сверстников.

Другой способ - продолжать перезапускать клиентское приложение на C до тех пор, пока запрос клиентского приложения не попадет на Cassandra 2.1 и не будет успешно перезапущен. Но это кажется мне уродливым.

1 Ответ

0 голосов
/ 06 ноября 2018

В вашем приложении лучше явно установить версию протокола, соответствующую Cassandra 2.1, вместо того, чтобы пытаться полагаться на функции автосогласования. Документация водителя прямо говорит об этом .

В соответствии с матрицей совместимости вам необходимо явно установить версию протокола V3, но это также зависит от версии драйвера, поэтому вам может потребоваться придерживаться версии 2.

Cluster cluster = Cluster.builder()
    .addContactPoint("xxxx")
    .withProtocolVersion(ProtocolVersion.V3)
    .build();

После завершения обновления до 3.11 вы можете переключиться на протокол версии 4.

...