小编典典

使用datastax java驱动程序连接到本地cassandra节点?

java

我正在使用datastax Java驱动程序3.1.0连接到cassandra集群,而我的cassandra集群版本是2.0.10。

下面是我用来连接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节点,如果它们已关闭,则仅与远程节点通信。我的池配置选项也就在这里,上面的代码中正在使用该选项?


阅读 312

收藏
2020-11-26

共1个答案

小编典典

默认情况下,datastax驱动程序将仅连接到本地DC中的节点。如果您不使用withLocalDc它,它将尝试从它能够连接的接触点的DC识别本地数据中心。

如果您希望驱动程序故障转移到远程数据中心,请使用withUsedHostsPerRemoteDc,即:

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

使用此配置,驱动程序将建立到每个远程DC中3台主机的连接,并且仅在本地数据中心中的所有主机都关闭时才向它们发送查询。

故障转移到远程数据中心还有其他策略。例如,您可以在与C
*数据中心相同的每个物理数据中心中运行应用程序客户端,然后,当物理数据中心发生故障时,可以在更高级别进行故障转移(例如负载均衡器)。

我的池配置选项也就在这里,上面的代码中正在使用该选项?

我想你有什么可以的。默认值也可以。

2020-11-26