2015-02-16 2 views
3

Я создаю приложение в Java, используя Cassandra CQL-драйвер. Я могу запустить его правильно, когда я использую локальный сервер cassandra. Однако тот же код, когда я пытаюсь запустить, не работает на удаленном сервере cassandra. Это дает следующее сообщение об ошибке во время инициализации: -Cassandra NoHostAvailableException Java-CQLDriver

Ниже в Maven зависимых пакетов, которые я использую для водителя CQL: -

<dependency> 
     <groupId>com.datastax.cassandra</groupId> 
     <artifactId>cassandra-driver-core</artifactId> 
     <version>2.1.3</version> 
    </dependency> 

    <dependency> 
     <groupId>com.datastax.cassandra</groupId> 
     <artifactId>cassandra-driver-mapping</artifactId> 
     <version>2.1.2</version> 
    </dependency> 

Ниже приводится сообщение об ошибке: -

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: yyyy.yyy.yyy.yyy.yyy-yyy.net/yy.yy.yy.yy:9160 (com.datastax.driver.core.ConnectionException: [yyyy.yyy.yyy.yyy.yyy-yyy.net/yy.yy.yy.yy:9160] Unexpected error during transport initialization (com.datastax.driver.core.ConnectionException: [yyyy.yyy.yyy.yyy.yyy-yyy.net/yy.yy.yy.yy:9160] Operation timed out)), 
    Unexpected error during transport initialization  (com.datastax.driver.core.ConnectionException: [xxxx.xxx.xxx.xxx.xxx-xxx.net/xx.xx.xx.xx:9160] Operation timed out))) 
     at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:220) 
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:78) 
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1231) 
    at com.datastax.driver.core.Cluster.init(Cluster.java:158) 
    at com.datastax.driver.core.Cluster.connect(Cluster.java:246) 

Местного Кассандру сервер, на котором все работает нормально: -

cqlsh 4.1.1, Cassandra 2.0.7 , CQL spec: 3.1.1, Thrift Protocol 19.39.0 

Удаленный сервер cassandra on которое подключается к сети, составляет: -

cqlsh 3.1.8 | Cassandra 1.2.12 | CQL spec 3.0.0 | Thrift protocol 19.36.1 

Я использую следующий код для подключения. Может кто-то прокомментировать, что происходит в случае удаленного подключения?

clusterOBJECT = Cluster.builder().addContactPointsWithPorts(addrs) 
       .withQueryOptions(new  QueryOptions().setConsistencyLevel(ConsistencyLevel.ONE)) 
       .withProtocolVersion(1).withoutJMXReporting() 
       .withPort(port) 
       .withSocketOptions(options) 
       .withRetryPolicy(DefaultRetryPolicy.INSTANCE) 
       .withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy())).build(); 
     session = clusterOBJECT.connect(); 

Я предоставляю действительное имя хоста вместе с портом (9160) в addContactPointsWithPorts. Также имена хостов pingable.

PS: - Следующие свойства уже установлены в cassandra.yaml.

start_native_transport: true 
native_transport_port: 9042 

[EDIT] После изменения номера порта в 9042, я был в состоянии подключиться к Кассандре. НО Я вижу, что соединение скоро будет исключено из этого исключения.

com.datastax.driver.core.TransportException: [/xx.xx.xxx.xx:9042] Cannot connect 
    at com.datastax.driver.core.Connection.<init>(Connection.java:106) 
    at com.datastax.driver.core.PooledConnection.<init>(PooledConnection.java:35) 
    at com.datastax.driver.core.Connection$Factory.open(Connection.java:528) 
    at com.datastax.driver.core.DynamicConnectionPool.<init>(DynamicConnectionPool.java:74) 
    at com.datastax.driver.core.HostConnectionPool.newInstance(HostConnectionPool.java:33) 
    at com.datastax.driver.core.SessionManager.replacePool(SessionManager.java:270) 
    at com.datastax.driver.core.SessionManager.access$400(SessionManager.java:39) 
    at com.datastax.driver.core.SessionManager$3.call(SessionManager.java:303) 
    at com.datastax.driver.core.SessionManager$3.call(SessionManager.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.net.ConnectException: Connection refused: /xx.xx.xxx.xx:9042 
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739) 
    at org.jboss.netty.channel.socket.nio.NioClientBoss.connect(NioClientBoss.java:150) 
    at org.jboss.netty.channel.socket.nio.NioClientBoss.processSelectedKeys(NioClientBoss.java:105) 
    at org.jboss.netty.channel.socket.nio.NioClientBoss.process(NioClientBoss.java:79) 
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318) 
    at org.jboss.netty.channel.socket.nio.NioClientBoss.run(NioClientBoss.java:42) 
    ... 3 more 

Спасибо.

+1

Какова структура Вашей сети? Где находятся ваш клиент и серверы? Существуют ли внутренние/внешние адреса? Можете ли вы использовать telnet для этих портов? –

+0

Каковы значения (в вашем cassandra.yaml) таких вещей, как ваши 'listen_address',' broadcast_address', 'rpc_address' ... В основном, вывести вывод' cat cassandra.yaml | grep address' (минус пропущенные строки). – Aaron

+0

rpc_address и listen_address обе пусты в файле cassandra.yaml. listen_address: rpc_address: – learner

ответ

0

«Я предоставляю действительное имя хоста вместе с портом (9160) в addContactPointsWithPorts. Также имена хостов pingable."

После прочтения этой строки в исходном посте и проверки документации, я думаю, я знаю, что здесь происходит. В About the Java Driver document четко сказано, что:

The Java Driver 2.0 for Apache Cassandra works exclusively with the Cassandra Query Language version 3 (CQL3) and Cassandra's new binary protocol

connection requirements раздел также указывает:

you have configured the following in the cassandra.yaml:

start_native_transport : true 
rpc_address : IP address or hostname 

reachable from the client machines in the cluster can accept connections on port 9042. Note: The client port can be configured using the native_transport_port in cassandra.yaml.

Другими словами, вы не должны использовать бережливость (9160) для подключения к Кассандре с Драйвер Java-CQL. Попробуйте это, не устанавливая порт (inPort или с именами хостов). Он должен попытаться использовать 9042 самостоятельно.

Edit: Хорошо, я просто попытался это самостоятельно, используя .addContactPoints (без портов, указанных с именами хостов) и .withPort(9160), и это сработало. Это, казалось бы, противоречит документации, на которую я ссылался ранее в своем посте. В любом случае, я бы по-прежнему рекомендовал использовать собственный протокол (9042), поскольку протокол Thrift устарел. Кроме того, новые версии Cassandra (2.1) и DataStax CQL драйверы have been shown to out-perform the Thrift-based drivers.

0

Я думаю, что ключ здесь «локальный» и «удаленный». Я задал этот вопрос, но не получил ответа, но я подозреваю, что есть один из 2-х вопросов:

  1. брандмауэр блокирует порты 9160 и 9042 от клиента. Вы пытались подключиться к узлам к портам 9160 и 9042?

  2. Проблема с закрытым/общедоступным адресом, которая обычно наблюдается, когда кластер находится внутри частной сети, а клиент пытается получить доступ к кластеру с использованием внешних IP-адресов. В этом случае кластер не имеет представления о публичных IP-адресах, которые назначаются инфраструктурой. В этом случае ответственность за перевод этого адреса несет водитель. Например, драйвер Java имеет политику AddressTranslater, которую вы можете реализовать для выполнения перевода с внутреннего IP на внешний - например, с помощью AWS API. http://www.datastax.com/drivers/java/2.0/com/datastax/driver/core/policies/AddressTranslater.html Вот ссылка на осуществление (я не использовал его сам): http://docs.hazelcast.org/docs/3.3/javadoc/com/hazelcast/client/spi/impl/AwsAddressTranslator.html

+0

Привет, rtumaykin, Спасибо за ваш ответ. Я могу использовать telnet для этих портов и используя порт 9042, я могу подключиться к cassandra. Но проблема, с которой я сталкиваюсь, заключается в том, что после нескольких минут подключения я вижу следующие журналы. com.datastax.driver.core.TransportException: [/xx.xx.xxx.xx:9042] Не удается подключиться по адресу com.datastax.driver.core.Connection. (Connection.java:106) по адресу com.datastax.driver.core.PooledConnection. (PooledConnection.java:35) Однако я все еще могу использовать cassandra, но эти журналы присутствуют. Для подробных журналов см. Мое редактирование на вопрос. – learner

Смежные вопросы