2016-11-24 2 views
1

나는 datastax java 드라이버 3.1.0을 사용하여 cassandra 클러스터에 연결했으며 cassandra 클러스터 버전은 2.0.10입니다.datastax java driver를 사용하여 로컬 cassandra 노드에 연결 하시겠습니까?

다음은 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; 
    } 
} 

내가 먼저 지역 카산드라 노드에 연결하는 데 사용할 필요가 다운 된 경우 만 원격 노드 이야기의 설정 무엇입니까. 또한 위의 코드에서 사용하고있는 풀링 구성 옵션이 여기에 있습니다.

답변

1

기본적으로 datastax 드라이버는 로컬 DC의 노드에만 연결합니다. withLocalDc을 사용하지 않으면 연결할 수있는 접점의 DC에서 로컬 데이터 센터를 식별합니다.

당신은 드라이버가이 withUsedHostsPerRemoteDc를 사용해야합니다 원격 데이터 센터 (들)에 호스트로 장애 조치 할 경우, 예 :

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

, 각 원격에서 3 개 호스트에 연결을 설정합니다 드라이버 DC를 사용하고 로컬 데이터 센터의 모든 호스트가 다운 된 경우에만 쿼리를 보냅니다.

원격 데이터 센터로 페일 오버하는 다른 전략이 있습니다. 예를 들어 C * 데이터 센터와 동일한 물리적 데이터 센터에서 애플리케이션 클라이언트를 실행할 수 있으며 물리적 데이터 센터에 오류가 발생하면로드 밸런서와 같이 상위 수준에서 장애 조치를 수행 할 수 있습니다.

내 풀링 구성 옵션은 위의 코드에서 사용하고 있습니다.

나는 당신이 가지고 있다고 생각합니다. 기본값도 괜찮습니다.

+0

각 데이터 센터에 3 개의 노드가없는 경우 '3'을 지정하면 어떻게됩니까? 또는 데이터 센터의 기계 수가 많아야합니까? – john

+0

3은 천장이므로 원격 DC에 노드가 2 개 밖에없는 경우 2에 연결됩니다. –

+0

datastax java driver [여기] (http://stackoverflow.com/questions/41757029)와 관련된 질문이 하나 더 있습니다./바인딩 방법 - 바인드 - 값 - 바인딩 - 문 -에서 - 제네릭 방식 - 사용 - datastax - 자바 드라이브). 네가 나를 도울 수 있는지 알고 싶니? – john