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

时间:2018-08-11 13:00:41

标签: node.js amazon-web-services amazon-ec2 cassandra cassandra-driver

我已经在一个EC2实例上安装了Cassandra,该实例包含一个具有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。

我使用cassandra-driver

我确保Cassandra正在运行。

编辑:

如Aaron所建议,我已经在客户端计算机上安装了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 个答案:

答案 0 :(得分:6)

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

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

第二,您的NodeJS应用程序从哪里运行?从此处安装并运行cqlsh,以确保可以进行连接。您还可以使用telnet确保可以连接到9042上的节点。

此外,您将要启用身份验证和授权,并且从不再次使用SimpleStrategy。使用NetworkTopologyStrategy启用身份验证并构建密钥空间是进入的好习惯。

我刚刚注意到你这样说:

  

包含一个密钥库的实例

您是指“密钥空间”还是您使用的是客户端到节点SSL?如果是这样,您将需要调整连接代码以提供与您节点的密钥库中的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上的连接,而该节点之外的任何内容都将无法连接到它。

  

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

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

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