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

Alo*_*lon 5 amazon-ec2 amazon-web-services cassandra node.js cassandra-driver

我在一个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));
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

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.我仍然得到同样的错误.

Aar*_*ron 6

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

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

其次,你的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
Run Code Online (Sandbox Code Playgroud)

如果已配置,您将需要使用"广播"地址.这些不同的地址通常对于同时具有内部和外部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
Run Code Online (Sandbox Code Playgroud)

如果您看到类似的输出,则表示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,那么您可以将广播地址注释掉.

  • 谢谢您的回答.我现在正在检查它.我的意思是键空间.我错误地写了密钥库.我现在纠正了.我会告诉你事情的进展情况. (2认同)
  • cqlsh 12.34.567.890 9042返回:连接错误:('无法连接到任何服务器',{'12 .34.567.890':错误(10061,"尝试连接到[('12 .34.567.890',9042)].最后一个错误:没有连接,因为目标机器主动拒绝它")}) (2认同)
  • 知道怎么办吗? (2认同)
  • grep"_address:"cassandra.yaml返回你在第二个引用中写的内容(使用localhost).是好还是我需要改变它? (2认同)
  • 那我该怎么写呢?我猜Cassandra不应该知道托管它的机器的IP地址. (2认同)