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-адрес, вы можете оставить широковещательные адреса закомментированными.