4

I've installed Cassandra on one EC2 instance that contains one keyspace with SimpleStrategy and replcation factor 1.

I've also made port 9042 accessible from anywhere in the security group.

I have a Node.js application that contains the following code:

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));

which produces the following error:

NoHostAvailableError: All host(s) tried for query failed. First host tried, 12.34.567.890:9042: DriverError: Connection timeout. See innerErrors.

I use cassandra-driver.

I've made sure Cassandra is running.

Edit:

As Aaron suggested, I have installed cqlsh on the client machine. When I go cqlsh 12.34.567.890 9042, it returns:

Connection error: ('Unable to connect to any servers', {'12.34.567.890': error(10061, "Tried connecting to [('12.34.567.890', 9042)]. Last error: No connection could be made because the target machine actively refused it")})

As Aaron suggeted, I have edited Cassandra.yaml on the server and replaced localhost with 12.34.567.890. I'm still getting the same error though.

4

1 回答 1

7

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

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

其次,您的 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

如果它们已配置,您将需要使用“广播”地址。这些不同的地址通常对于同时拥有内部和外部 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 和监听,而外部地址成为广播地址。但是,如果您的实例只有一个 IP,那么您可以将广播地址注释掉。

于 2018-08-11T14:07:14.690 回答