NoHostAvailable错误:所有尝试查询的主机都失败



我已经在一个EC2实例上安装了Cassandra,该实例包含一个具有SimpleStrategy和relcation因子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));

这将产生以下错误:

NoHostAvailable错误:所有尝试查询的主机都失败。第一台主机 已尝试,12.34.567.890:9042:驱动程序错误:连接超时。看 内部错误。

我使用卡桑德拉驱动程序。

我已经确保Cassandra正在运行。

编辑:

正如Aaron所建议的,我已经在客户端计算机上安装了cqlsh。当我转到 cqlsh 12.34.567.890 9042 时,它返回:

连接错误:("无法连接到任何服务器", {'12.34.567.890': 错误 (10061, "尝试连接到 [('12.34.567.890', 9042(]最后一个错误:无法建立连接,因为目标 机器主动拒绝了"(}(

正如Aaron所说,我在服务器上编辑了Cassandra.yaml,并将localhost替换为12.34.567.890。不过,我仍然遇到同样的错误。

首先,您不需要指定端口。 试试这个:

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

其次,您的 NodeJS 应用程序从哪里运行? 从那里安装和运行cqlsh,只是为了确保可以连接。 您还可以使用telnet来确保可以连接到 9042 上的节点。

此外,您将希望启用身份验证和授权,并且永远不再使用SimpleStrategy。 启用身份验证并使用NetworkTopologyStrategy构建密钥空间是要养成的好习惯。

我刚刚注意到你说了这样的话:

包含一个密钥库的实例

您的意思是"密钥空间"还是使用客户端到节点 SSL? 如果是这样,您将需要调整连接代码以提供与节点密钥库中的证书匹配的SSL证书。

如果您仍然遇到问题,接下来要做的是确保您连接到正确的 IP 地址。 格雷普你的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 返回的正是您在第二个引号中写的内容(带有 localhost(。是好还是我需要改变它?

您将需要更改此设置。 否则,它将只接受 127.0.0.1 上的连接,这将不允许该节点外部的任何内容连接到它。

那我应该在那里写什么?我猜Cassandra不应该知道托管它的机器的IP地址。

实际上,主要问题是Cassandra非常清楚它在哪个IP上。 由于您尝试在 12.34.567.890(我知道这不是真正的 IP(上进行连接,因此您绝对应该使用它。

仅当每个实例同时具有内部和外部 IP 地址时,才需要指定广播地址。 通常,内部地址被指定为 rpc 和侦听,而外部地址则成为广播地址。 但是,如果您的实例只有一个 IP,则可以将广播地址注释掉。

最新更新