Использование уровня согласованности LOCAL_QUORUM в драйвере Datastax

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

Возвращает запись после кворума реплик в текущем центре обработки данных, как сообщил координатор. Избегает задержек при обмене данными между центрами обработки данных.

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

Скажем, у меня есть два DC со следующими узлами:

DC1: 172.0.1.1, 172.0.1.2
DC1: 172.0.2.1, 172.0.2.2

Итак, для работы с DC1 я строю кластер как:

Cluster cluster = Cluster.builder().addContactPoint("172.0.1.1").build();
Session session = cluster.connect();
Statement statement = session.prepare("select * from ...").bind().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
ResultSet resultSet = session.execute(session);

Это правильный способ сделать это?


person Andremoniy    schedule 30.01.2018    source источник


Ответы (2)


Сам по себе DCAwwareRoundRobinPolicy выберет центр обработки данных, который найдет с помощью алгоритма «наименьшего сетевого расстояния». Чтобы обеспечить подключение там, где вы хотите, вы должны указать DC в качестве параметра.

Вот как я говорю нашим командам разработчиков:

Builder builder = Cluster.builder()
  .addContactPoints(nodes)
  .withQueryOptions(new QueryOptions()
    .setConsistencyLevel(ConsistencyLevel.LOCAL_ONE))
  .withLoadBalancingPolicy(new TokenAwarePolicy(
    new DCAwareRoundRobinPolicy.Builder()
      .withLocalDc("DC1").build()))
  .withPoolingOptions(options);

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

person Aaron    schedule 30.01.2018
comment
Вау :) Большое спасибо - person Andremoniy; 30.01.2018
comment
Без проблем! Хотя в моем примере я указал уровень согласованности LOCAL_ONE, поэтому вы тоже захотите его настроить. - person Aaron; 30.01.2018

Согласно классу Cluster документация:

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

Кроме того, поскольку политика балансировки нагрузки по умолчанию является DCAwareRoundRobinPolicy этот подход должен работать нормально, как и ожидалось.

person Andremoniy    schedule 30.01.2018