подключиться к локальным узлам cassandra с помощью java-драйвера datastax?

Я использую java-драйвер datastax 3.1.0 для подключения к кластеру cassandra, а моя версия кластера cassandra — 2.0.10.

Ниже приведен класс singleton, который я использую для подключения к кластеру cassandra.

public class CassUtil {
  private static final Logger LOGGER = Logger.getInstance(CassUtil.class);

  private Session session;
  private Cluster cluster;

  private static class Holder {
    private static final CassUtil INSTANCE = new CassUtil();
  }

  public static CassUtil getInstance() {
    return Holder.INSTANCE;
  }

  private CassUtil() {
    List<String> servers = TestUtils.HOSTNAMES;
    String username =
        TestUtils.loadCredentialFile().getProperty(TestUtils.USERNAME);
    String password =
        TestUtils.loadCredentialFile().getProperty(TestUtils.PASSWORD);

    // is this right setting?
    PoolingOptions poolingOptions = new PoolingOptions();
    poolingOptions.setConnectionsPerHost(HostDistance.LOCAL, 4, 10).setConnectionsPerHost(
        HostDistance.REMOTE, 2, 4);

    Builder builder = Cluster.builder();
    cluster =
        builder
            .addContactPoints(servers.toArray(new String[servers.size()]))
            .withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE)
            .withPoolingOptions(poolingOptions)
            .withReconnectionPolicy(new ConstantReconnectionPolicy(100L))
            .withLoadBalancingPolicy(
                DCAwareRoundRobinPolicy
                    .builder()
                    .withLocalDc(
                        !TestUtils.isProduction() ? "DC2" : TestUtils.getCurrentLocation()
                            .get().name().toLowerCase()).build())
            .withCredentials(username, password).build();

    try {
      session = cluster.connect("testkeyspace");
      StringBuilder sb = new StringBuilder();
      Set<Host> allHosts = cluster.getMetadata().getAllHosts();
      for (Host host : allHosts) {
        sb.append("[");
        sb.append(host.getDatacenter());
        sb.append(host.getRack());
        sb.append(host.getAddress());
        sb.append("]");
      }
      LOGGER.logInfo("connected: " + sb.toString());
    } catch (NoHostAvailableException ex) {
      LOGGER.logError("error= ", ExceptionUtils.getStackTrace(ex));
    } catch (Exception ex) {
      LOGGER.logError("error= " + ExceptionUtils.getStackTrace(ex));
    }
  }

  public void shutdown() {
    LOGGER.logInfo("Shutting down the whole cassandra cluster");
    if (null != session) {
      session.close();
    }
    if (null != cluster) {
      cluster.close();
    }
  }

  public Session getSession() {
    if (session == null) {
      throw new IllegalStateException("No connection initialized");
    }
    return session;
  }

  public Cluster getCluster() {
    return cluster;
  }
}

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


person john    schedule 24.11.2016    source источник


Ответы (1)


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

Если вы хотите, чтобы драйвер перешел на хост в удаленных центрах обработки данных, вы должны использовать withUsedHostsPerRemoteDc, то есть:

cluster.builder()        
  .withLoadBalancingPolicy(DCAwareRoundRobinPolicy.builder()
    .withLocalDc("DC1")
    .withUsedHostsPerRemoteDc(3).build())

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

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

Также здесь находятся мои параметры конфигурации пула, которые я использую в приведенном выше коде?

Я думаю, что у вас все в порядке. По умолчанию тоже все в порядке.

person Andy Tolbert    schedule 29.11.2016
comment
Скажем, если у нас нет 3 узлов в каждом центре обработки данных, что произойдет, если мы укажем там 3? или это должно быть количество машин в датацентре? - person john; 29.11.2016
comment
3 — это потолок, поэтому если у вас всего 2 узла в удаленном ДЦ, он будет подключаться к 2. - person Andy Tolbert; 29.11.2016
comment
У меня есть еще один вопрос, связанный с java-драйвером datastax здесь. Хотел узнать, сможешь ли ты мне помочь? - person john; 20.01.2017