我在一个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正在运行。
编辑:
正如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。我仍然得到同样的错误。
首先,您不需要指定端口。试试这个:
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,那么您可以将广播地址注释掉。