Не удается подключиться к cassandra - NoHostAvailableException
Я знаю, что в NoHostAvailableException
есть несколько потоков, но они просто не обеспечивают решение моей проблемы.
Я не могу подключиться к Cassandra с драйвером Datastax Java Cassandra. Я получаю сообщение об ошибке:
com.datastax.driver.core.exceptions.NoHostAvailableException: все хост (ы), попробованный для запроса, не удалось (попытался: [/54.221.241.107])
Я уверен, что конфигурация верна. Я установил конфигурацию в cassandra.yaml:
start_native_transport: true
# port for the CQL native transport to listen for clients on
native_transport_port: 9042
Установка My Cassandra - это стандартная установка на экземпляр EC2 на AWS. Я настроил AWS, чтобы разрешить порт 9042.
Cassandra работает на Windows Server 2008 R2, и я также настроил брандмауэр на входящее и исходящее соединение на 9042.
Мой код выглядит следующим образом:
cluster = Cluster.builder()
.withPort(9042)
.addContactPoint("54.221.241.107").build();
Я не знаю, что делать дальше, так как я всегда получаю эту ошибку. Любые предложения?
Ответы
Ответ 1
Проверьте файл casssandra.yaml. В native_transport используется тот же адрес, что и адрес rpc_address. Если он связан с другим адресом, чем "54.221.241.107", вы получите эту проблему.
Попробуйте настроить его на
rpc_address: 0.0.0.0
или
rpc_address: 54.221.241.107
и посмотреть, помогает ли это. Имейте в виду, что ec2-ips может измениться при перезагрузке.
Я предполагаю, что это связано с внутренним ip ec-2. И не забудьте добавить некоторую безопасность, если вы открываете свою базу данных для публики следующим образом: -)
Ответ 2
Измените public IP to private IP
.
-
Если ваша cassandra находится в EC2, вам необходимо настроить собственный IP-адрес в yaml
конфигурации rpc_address: PRIVATE_IP
.
-
Если ваша клиентская программа (приложение java, используемая для подключения cassandra), также находится в EC2, тогда вы должны добавить частный IP-код в свой код .addContactPoint("PRIVATE_IP").build();
.
-
Если ваша кассандра находится в EC2, а ваше клиентское приложение находится вне EC2 (это означает, что клиентское приложение java в локальной сети), вам нужно настроить private IP in yaml configurations
и public IP in your java app
Затем важно указать native_transport_port: 9042
, разрешить access for port 9042
и Firewall configurations
. Я думаю, что эти вещи вы сделали правильно. Кроме того, убедитесь, что вы правильно настроили свою конечную точку snitch endpoint_snitch: Ec2Snitch
в своем файле yaml. Я надеюсь, что это сработает, если вы выполните следующие шаги...
Ответ 3
Я также наткнулся на эту проблему недавно. Моя среда была другой, и причина была другая.
Мы использовали SpringBoot 1.5.3.RELEASE как родительскую библиотеку и драйвер Datastax cassandra версия 3.3.0:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
............
<dependencies>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.3.0</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
</exclusion>
</exclusions>
</dependency>
.......
Библиотека Netty, унаследованная от родительского POM-объекта SpringBoot и Datastax, столкнулась. После исключения Netty ошибка исчезла.
Ответ 4
Имел ту же проблему. Более подробно выяснилось, что версия драйвера и версия CQL несовместимы. Получите последнюю версию 3.0 Driver в соответствии с диаграммой совместимости
http://www.datastax.com/dev/blog/java-driver-2-1-2-native-protocol-v3
Ответ 5
Доступ к Cassandra с использованием java-драйвера очень сильно зависит от версии драйвера и зависимостей драйвера. Последняя вещь, которая сработала для меня, заключалась в том, чтобы взять lib (jars), которые включены в загрузку сервера. В моем случае это были окна. Но я уверен, что в игровых шарах linux также будут драйвер и зависимости. возьмите банки, отправленные на сервер, загрузите их и используйте их в вашем кластере java client вместо загрузки драйверов отдельно от Интернета.