2016-11-24 6 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; 
    } 
} 

ローカルのcassandraノードに最初に接続し、それらがダウンしている場合は、リモートノードと話すために必要な設定は何ですか?また、上記のコードで使用しているプーリング設定オプションもここにあります。

答えて

1

デフォルトでは、datastaxドライバはローカルDCのノードにのみ接続します。 withLocalDcを使用しない場合、ローカルデータセンターは、接続可能なコンタクトポイントのDCから識別しようとします。

リモートデータセンター(S)でホストするためにドライバがフェイルオーバーする場合は、withUsedHostsPerRemoteDcを使用する必要があり、すなわち:この構成で

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

、ドライバーは各リモートで3つのホストへの接続を確立しますローカルデータセンターのすべてのホストがダウンしている場合にのみクエリを送信します。

リモートデータセンターへのフェールオーバーには他にも戦略があります。たとえば、C *データセンターと同じ物理データセンターでアプリケーションクライアントを実行し、物理データセンターに障害が発生した場合、ロードバランサなどの上位レベルでフェールオーバーすることができます。

また、上記のコードで使用しているプーリング設定オプションもここにありますか?

私はあなたが持っていると思います。デフォルトも問題ありません。

+0

各データセンターに3つのノードがない場合、そこに「3」を指定するとどうなりますか?またはそれはデータセンター内のマシンの数にする必要がありますか? – john

+0

3は天井ですので、リモートDCに2つのノードしかない場合は、2に接続します。 –

+0

datastax java driver [ここ](http://stackoverflow.com/questions/41757029)に関するもう1つ質問があります。 /バインド方法 - バインド - 値 - バインド - ステートメント - ジェネリック - ウェイ - 使用 - データストア - java-drive)。あなたが私を助けることができるかどうかを知りたいですか? – john

関連する問題