Ошибка при попытке подключиться с помощью Astyanax к Cassandra, размещенной на экземпляре EC2

Я получаю следующую ошибку "astyanax.connectionpool.exceptions.PoolTimeoutException:" при попытке использовать клиент Astyanax для подключения к Cassandra на экземпляре EC2. Нужна помощь

Following is my code snippet.
   import org.mortbay.jetty.servlet.Context;

  import com.netflix.astyanax.AstyanaxContext;
  import com.netflix.astyanax.Keyspace;
  import com.netflix.astyanax.MutationBatch;
  import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
  import com.netflix.astyanax.connectionpool.OperationResult;
  import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
  import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
  import com.netflix.astyanax.connectionpool.impl.ConnectionPoolType;
  import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
  import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
  import com.netflix.astyanax.model.Column;
  import com.netflix.astyanax.model.ColumnFamily;
  import com.netflix.astyanax.model.ColumnList;
  import com.netflix.astyanax.model.CqlResult;
  import com.netflix.astyanax.serializers.StringSerializer;
  import com.netflix.astyanax.thrift.ThriftFamilyFactory;


  public class MetadataRS {


    public static void main(String args[]){
    AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
    .forCluster("ClusterName")
    .forKeyspace("KeyspaceName")
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()   
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
        .setConnectionPoolType(ConnectionPoolType.ROUND_ROBIN)
    )
    .withConnectionPoolConfiguration(new     ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9042)
        .setMaxConnsPerHost(40)
        .setSeeds("<EC2-IP>:9042")
        .setConnectTimeout(5000)
    )
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    Keyspace keyspace = context.getEntity();
    System.out.println(keyspace);

    ColumnFamily<String, String> CF_USER_INFO =
              new ColumnFamily<String, String>(
                "Standard1",              // Column Family Name
                StringSerializer.get(),   // Key Serializer
                StringSerializer.get());  // Column 

    OperationResult<ColumnList<String>> result = null;
    try {
        result = keyspace.prepareQuery(CF_USER_INFO)
            .getKey("user_id_hash")
            .execute();
    } catch (ConnectionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
            ColumnList<String> columns = result.getResult();

            // Lookup columns in response by name 

            String uid   = columns.getColumnByName("user_id_hash").getStringValue();

            System.out.println(uid);
            // Or, iterate through the columns
            for (Column<String> c : result.getResult()) {
              System.out.println(c.getName());
            }
 }
 }

Ошибка com.netflix.astyanax.thrift.ThriftKeyspaceImpl@1961f4 com.netflix.astyanax.connectionpool.exceptions.PoolTimeoutException: PoolTimeoutException: [host=():9042, latency=5001(5001), попытки =1] Время ожидания ожидания подключения по адресу com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.waitForConnection(SimpleHostConnectionPool.java:201) по адресу com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.borrowConnection.connect подключения.соединение.impl.RoundRobinExecuteWithFailover.borrowConnection(RoundRobinExecuteWithFailover.java:60) при com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:50) в com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:229) на com.netflix.astyanax.thrift.ThriftColumnFamilyQueryImpl$1.execute(ThriftColumnFamilyQueryImpl.java:180) на com.rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:57) Исключение в потоке "main" java.lang.NullPointerException в com.rjil.jiodrive.rs.MetadataRS.main(MetadataRS.java:62)

3 ответа

Решение

Поскольку вы запускаете Cassandra на экземпляре EC2, проверьте, что порт Cassandra №. (который вы выбрали как 9042) находится в списке разрешенных групп безопасности ec2 и у вас есть к нему доступ. Если нет, добавьте номер порта. во входящем списке группы безопасности ec2 и установите диапазоны ip как 0.0.0.0. Алос проверить, что брандмауэр на ec2 выключен. По умолчанию это false, но в любом случае это хорошо.

Если вы сделали это, то ваш клиент может находиться за брандмауэром, который предотвращает исходящий трафик на выбранный вами порт (9042).

Наконец, если вы не использовали эластичный ip, лучше использовать имя dns экземпляра ec2 как в разделе setSeeds, так и в rpc_address файла cassandra.yaml.

Ваша проблема не в вашем коде. У вас проблема с подключением к узлу, который вы указали в качестве начального числа. Так что либо этот узел не работает, либо вы не можете получить к нему доступ с компьютера, на котором работает ваш клиент.

Я наконец обновил libthrift до 0.9 и изменил свой код на следующий, и теперь он работает нормально.

public Keyspace getDBConnection() {



    if (poolConfig == null) {

        poolConfig = new ConnectionPoolConfigurationImpl(
                "CassandraPool").setPort(port).setMaxConnsPerHost(1)
                .setSeeds((new StringBuilder(seedHost).append(":").append(port).toString()))
                .setLatencyAwareUpdateInterval(latencyAwareUpdateInterval) // Will resort hosts per
                                                        // token partition every
                                                        // 10 seconds
                .setLatencyAwareResetInterval(latencyAwareResetInterval) // Will clear the latency
                                                        // every 10 seconds. In
                                                        // practice I set this
                                                        // to 0 which is the
                                                        // default. It's better
                                                        // to be 0.
                .setLatencyAwareBadnessThreshold(latencyAwareBadnessThreshold) // Will sort hosts if a host
                                                    // is more than 100% slower
                                                    // than the best and always
                                                    // assign connections to the
                                                    // fastest host, otherwise
                                                    // will use round robin
                .setLatencyAwareWindowSize(latencyAwareWindowSize) // Uses last 100 latency
                                                // samples. These samples are in
                                                // a FIFO q and will just cycle
                                                // themselves.
                .setTimeoutWindow(60000)
        ;
    }

    AstyanaxContext<Keyspace> context = new AstyanaxContext.Builder()
            .forCluster(clusterName)
            .forKeyspace(keyspaceName)
            .withAstyanaxConfiguration(
                    new AstyanaxConfigurationImpl().setDiscoveryType(
                            NodeDiscoveryType.NONE)
                            .setConnectionPoolType(
                                    ConnectionPoolType.ROUND_ROBIN)
                            .setCqlVersion("3.0.0")
                            .setTargetCassandraVersion("2.0"))
            .withConnectionPoolConfiguration(poolConfig)
            .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
            .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    return context.getClient();
}
Другие вопросы по тегам