NoHostAvailableError:尝试查询的所有主机都失败了

问题描述 投票:5回答:1

我在一个EC2实例上安装了Cassandra,该实例包含一个带有SimpleStrategy和replcation因子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。

我用cassandra-driver

我已经确定Cassandra正在运行。

编辑:

正如Aaron所说,我在客户机上安装了cqlsh。当我去cqlsh 12.34.567.890 9042时,它返回:

连接错误:('无法连接到任何服务器',{'12 .34.567.890':错误(10061,“尝试连接到[('12 .34.567.890',9042)]。最后一个错误:无法建立连接,因为目标机器积极拒绝它“)})

正如Aaron所说,我在服务器上编辑了Cassandra.yaml,用12.34.567.890替换了localhost。我仍然得到同样的错误。

node.js amazon-web-services amazon-ec2 cassandra cassandra-driver
1个回答
6
投票

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

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

其次,你的NodeJS应用程序在哪里运行?从那里安装并运行cqlsh,以确保连接。您还可以使用telnet确保您可以在9042上连接到您的节点。

此外,您将要启用身份验证和授权,而不再使用SimpleStrategy。启用auth并使用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返回你在第二个引用中写的内容(使用localhost)。是好还是我需要改变它?

你需要改变它。否则,它只接受127.0.0.1上的连接,这将不允许该节点外的任何连接到它。

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

实际上,主要问题是Cassandra非常了解它所处的IP。既然您正在尝试连接12.34.567.890(我知道它不是真正的IP),那么您一定要使用它。

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

© www.soinside.com 2019 - 2024. All rights reserved.