Не удается подключиться к 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 ошибка исчезла.

Ответ 5

Доступ к Cassandra с использованием java-драйвера очень сильно зависит от версии драйвера и зависимостей драйвера. Последняя вещь, которая сработала для меня, заключалась в том, чтобы взять lib (jars), которые включены в загрузку сервера. В моем случае это были окна. Но я уверен, что в игровых шарах linux также будут драйвер и зависимости. возьмите банки, отправленные на сервер, загрузите их и используйте их в вашем кластере java client вместо загрузки драйверов отдельно от Интернета.