NoHostAvailableError: все хосты попытались выполнить запрос

Я установил Cassandra на один экземпляр EC2, который содержит одно пространство ключей с SimpleStrategy и коэффициентом репликации 1.

Я также сделал порт 9042 доступным из любой точки группы безопасности.

У меня есть приложение Node.js, которое содержит следующий код:

const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['12.34.567.890:9042',], keyspace: 'ks1' });

const query = 'CREATE TABLE table.name ( field1 text, field2 text, field3 counter, PRIMARY KEY (field1, field2));';

client.execute(query)
    .then(result => console.log(result));

которая выдает следующую ошибку:

NoHostAvailableError: Все хосты попытались выполнить запрос. Первый хост попробовал, 12.34.567.890:9042: DriverError: Тайм-аут соединения. Смотрите innerErrors.

Я использую кассандру-драйвер.

Я убедился, что Кассандра бежит.

Редактировать:

Как предложил Аарон, я установил cqlsh на клиентский компьютер. Когда я иду cqlsh 12.34.567.890 9042, он возвращает:

Ошибка подключения: ("Невозможно подключиться к каким-либо серверам", {'12.34.567.890': ошибка (10061, "Попытка подключения к [('12.34.567.890', 9042)]. Последняя ошибка: не удалось установить соединение, так как целевая машина активно от нее отказалась ")})

Как предложил Аарон, я отредактировал Cassandra.yaml на сервере и заменил localhost на 12.34.567.890. Я все еще получаю ту же ошибку, хотя.

1 ответ

Прежде всего, вам не нужно указывать порт. Попробуй это:

const client = new cassandra.Client({ contactPoints: ['12.34.567.890'], keyspace: 'ks1' });

Во-вторых, откуда работает ваше приложение NodeJS? Установить и запустить cqlsh оттуда, просто чтобы убедиться, что соединение возможно. Вы также можете использовать telnet чтобы убедиться, что вы можете подключиться к вашему узлу на 9042.

Кроме того, вы захотите включить аутентификацию и авторизацию и никогда не использовать SimpleStrategy снова. Включение аутентификации и создание ваших ключей NetworkTopologyStrategy хорошие привычки, чтобы получить в.

Я только что заметил, что вы сказали это:

экземпляр, который содержит одно хранилище ключей

Вы имели в виду "пространство ключей" или используете SSL-протокол "клиент-узел"? Если это так, вам необходимо настроить код подключения, чтобы представить сертификат SSL, который совпадает с сертификатом в хранилище ключей вашего узла.

Если у вас по-прежнему возникают проблемы, вам нужно будет убедиться, что вы подключаетесь к правильному IP-адресу. Grep ваш cassandra.yaml чтобы увидеть это:

$ grep "_address:" conf/cassandra.yaml
listen_address: 192.168.0.2
broadcast_address: 10.1.1.4
# listen_on_broadcast_address: false
rpc_address: 192.168.0.2
broadcast_rpc_address: 10.1.1.4

Если они настроены, вы захотите использовать "широковещательный" адрес. Эти разные адреса обычно полезны для развертываний, где у вас есть как внутренний, так и внешний IP-адрес.

$ grep "_address:" conf/cassandra.yaml
listen_address: localhost
# broadcast_address: 1.2.3.4
# listen_on_broadcast_address: false
rpc_address: localhost
# broadcast_rpc_address: 1.2.3.4

Если вы видите вывод, который выглядит следующим образом, это означает, что Cassandra прослушивает ваш локальный IP-адрес 127.0.0.1. В этом случае вам даже не нужно будет указывать это.

grep "_address:" cassandra.yaml возвращает именно то, что вы написали во второй цитате (с локальным хостом). Это хорошо или мне нужно это изменить?

Вам нужно будет изменить это. В противном случае он будет принимать соединения только на 127.0.0.1, что не позволит подключиться к нему за пределами этого узла.

Тогда что мне там писать? Я предполагаю, что Кассандра не должна знать IP-адрес компьютера, на котором она находится.

На самом деле, главная проблема в том, что Кассандра прекрасно знает, на каком IP она находится. Поскольку вы пытаетесь подключиться по 12.34.567.890 (я знаю, что это не настоящий IP-адрес), вы обязательно должны его использовать.

Вам нужно только указать широковещательные адреса, если каждый из ваших экземпляров имеет как внутренние, так и внешние IP-адреса. Обычно внутренний адрес указывается как rpc и listen, а внешний становится широковещательными адресами. Но если ваш экземпляр имеет только один IP-адрес, вы можете оставить широковещательные адреса закомментированными.

Другие вопросы по тегам