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

我使用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 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 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节点的设置是什么,如果它们关闭,那么只能与远程节点通信。 我的池配置选项就在这里,我在上面的代码中使用?

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

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

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

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

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

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

我觉得你有什么好。 默认也很好。