java cassandra datastax-java-driver

conectarse a los nodos cassandra locales utilizando el controlador java datastax?



datastax-java-driver (1)

De forma predeterminada, los controladores de datastax solo se conectarán a los nodos en el DC local. Si no utiliza con withLocalDc , intentará discernir el centro de datos local desde el DC del punto de contacto al que puede conectarse.

Si desea que el controlador falle en el host en centros de datos remotos, debe usar withUsedHostsPerRemoteDc , es decir:

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

Con esta configuración, el controlador establecerá conexiones a 3 hosts en cada DC remoto, y solo enviará consultas a ellos si todos los hosts en el centro de datos local están inactivos.

Existen otras estrategias para conmutación por error a centros de datos remotos. Por ejemplo, podría ejecutar los clientes de su aplicación en cada centro de datos físico igual que sus centros de datos C *, y luego, cuando falle un centro de datos físico, puede conmutar por error a un nivel superior (como su equilibrador de carga).

También mis opciones de configuración de agrupación están aquí, y las estoy usando en el código anterior.

Creo que lo que tienes está bien. Los valores predeterminados también están bien.

Estoy usando Datastax Java Driver 3.1.0 para conectarme al cluster de cassandra y mi versión del cluster de cassandra es 2.0.10.

Debajo está la clase de singleton que estoy usando para conectar al cluster de 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; } }

¿Cuál es la configuración que necesito usar para conectarme a los nodos cassandra locales primero y si están caídos, entonces solo hablo con nodos remotos. También mis opciones de configuración de agrupación están aquí, y las estoy usando en el código anterior.