Cassandra cqlsh - 连接被拒绝

71

我刚开始使用Cassandra(datastax),版本2.1.3和cqlsh版本5.0.1。

Cassandra可以正常启动,并且集群可以立即运行。

但是cqlsh无法工作(在任何节点上),并且会产生以下错误:

连接错误:(“无法连接到任何服务器”,{'127.0.0.1':error(111, “尝试连接[('127.0.0.1',9042)]。上一个错误:拒绝连接”)})

我已经尝试使用主机自己的IP、其他主机的IP、不同端口启动cqlsh,但结果始终相同-始终是连接被拒绝。


考虑到我自己和这里提供的帮助都无法解决2.1.3版本(尽管它仍在开发中)的问题,我重新配置了服务器,使用了2.0.13版本(稳定版)。Cqlsh仍然会出现localhost:9160错误(尽管已经指定了rpc_address为主机),但是手动指定IP地址启动它cqlsh 1.1.2.2 9160可以正常工作。 - Chros
基于您降级到2.0.13并且它可以工作,我猜测您在 listen_addressrpc_addressbroadcast_rpc_address 之间设置了某种不正确的选项...后者是2.1.x中的新设置。 我想知道 listen_addressrpc_address 设置是什么(不一定要知道值,但要知道它们与使用cqlsh的1.1.2.2 IP的关系)。 如果您再次尝试2.1.x,请将 listen_address 设置为本地IP,将 rpc_address 设置为0.0.0.0,并将 broadcast_rpc_address 设置为外部IP。 - Aaron
在这种设置中,1.1.2.2 是主机 IP(主机只有内部 IP),其值为:listen_address: 1.1.2.2 rpc_address: 0.0.0.0 broadcast_rpc_address: 1.1.2.2。广播地址是必需的(Cassandra 日志)。尝试了大多数组合,但都没有成功。最终不得不在 2.0.13 中删除/注释掉它,因此很可能是 broadcast_rpc_address 导致了问题。不确定我还能给它哪些其他值。难道它不会在其他地方抛出错误吗? - Chros
22个回答

27
你需要编辑位于要连接的节点上的文件,并设置和的节点IP地址,然后重新启动Cassandra。 是Cassandra侦听客户端调用的地址。 是Cassandra侦听其他Cassandra节点的地址。

它们在 cassandra.yaml 中定义。rpc_address 设置为 0.0.0.0。listen_address 设置为节点自己的 IP。同时,在相同的 IP 上有 broadcast_rpc_address。是否需要将 rpc_address 设置为其他值?谢谢。 - Chros
尝试过了。在“127.0.0.1”上仍然出现了完全相同的连接被拒绝错误。 - Chros
2
假设Cassandra服务器的IP是1.2.3.4,请将rpc_address设置为1.2.3.4。重启Cassandra后,尝试连接cqlsh 1.2.3.4 - jny
是的。尝试移除所有内容,但仍然出现相同的错误。 尝试了其他端口,我可能错了,但似乎只要在活动端口上使用 Asyncore 就会抛出错误。 - Chros
1
感谢您的帮助 - 我重新配置了2.0.13(这是稳定版本),最终它能够正常工作。 - Chros
显示剩余4条评论

21
尝试将rpc_address更改为指向节点的IP,而不是0.0.0.0,并在连接到cqlsh时指定IP地址。例如,如果IP为10.0.1.34且rpc_port保留默认值9160,则应该按照以下方式操作:
cqlsh 10.0.1.34 9160 
或者:
cqlsh 10.0.1.34 

还要确保在/etc/cassandra/cassandra.yaml配置文件中将start_rpc设置为true。


1
rpc_port尚未定义,因此默认为9042而不是9160。已尝试更改rpc_address,但错误仍然存在(错误出现在使用的主机IP上,而不是127.0.0.1)。 - Chros
2
根据文档,rpc_port 的默认值为 9160,但是最新版本的 Cassandra 中,cqlsh 使用 cassandra.yaml 中 native_transport_port 属性的值,其默认值为 9042。您可以指定任何空闲端口作为 native_transport_port 并检查错误是否改变? - Ruba
已定义 native_transport_value: 9160,但端口 9042 上的错误仍然存在。 - Chros
奇怪,我认为如果受到影响,会与rpc_port冲突,因为9160已经被保留了。你编辑后重新启动了Cassandra吗?如果没有,我建议选择另一个端口并重新启动。此外,防火墙中是否打开了8042端口? - Ruba
1
是的,每次更改后都会重新启动Cassandra。你是不是指的是端口9042而不是8042?如果是这样,是的 - (9160也是)。 - Chros
1
谢谢帮助 - 我重新配置了2.0.13(这是稳定版本),最终它成功运行了。 - Chros

12

8
这是因为cassandra中存在一些预配置。要解决此问题,需要在cassandra-env.sh文件中取消以下注释行:
#add this if you’re having trouble connecting:
#JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<public name>

你需要开始修复错误的地方是这里。

打开终端并按照以下简单步骤开始修复:

步骤1

使用

sudo nano /etc/cassandra/cassandra-env.sh

这个命令并查找JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=取消注释该行,只需删除行首的#即可。

注意:如果您从未打开过此文件以修复此错误,则会找到JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<public name>

步骤2 现在将<public name>替换为127.0.0.1或服务器IP。

步骤3 保存文件并使用systemctl restart cassandra.service重新启动cassandra(如果您没有运行服务器)。或者使用systemctl start cassandra.service启动cassandra(如果服务器未运行)。

步骤4 使用sudo service cassandra statussystemctl status cassandra.service检查状态。

注意:一旦检查系统监视器中是否有cassandra正在运行。

现在尝试cqlsh。它会起作用。

注意:nano是编辑器,您可以使用其他您熟悉的编辑器。


1
太好了,我的Cassandra现在已经激活了,但是cqlsh仍然报错('无法连接到任何服务器',{'127.0.0.1': error(111, "尝试连接[('127.0.0.1',9042)]。最后的错误:连接被拒绝")})。 - MehrAmoon

5
在/etc/cassandra/cassandra.yaml中查找native_transport_port。默认值为9842。
native_transport_port: 9842

对于使用cqlsh连接到localhost,此端口适用于我。

cqlsh 127.0.0.1 9842


3
尝试将rpc_address更改为指向节点的IP而不是0.0.0.0,并在连接到cqlsh时指定IP,例如IP为10.0.2.64且rpc_port保留默认值9160,则应该按照以下方式操作:
cqlsh 10.0.2.64 9160 

或者

cqlsh 10.0.2.64

请确保在 /etc/cassandra/cassandra.yaml 配置文件中将 start_rpc 设置为 true。

3

即使服务器正在运行,检查Cassandra日志也是个好主意。我曾经收到过完全相同的消息,并且无法对其进行任何操作,然后我发现日志中存在错误,系统实际上并未运行。

虽然有些傻,但这种情况确实会发生...


3

最近我从Cassandra 3.0降级到ArchLinux上的Cassandra 2.2后遇到了同样的问题。

与上面的解决方案不同,我的问题不在.cassandra文件中,而是版本3.0将其配置留在了/var/lib/cassandra目录中。

以下命令解决了我的问题:

sudo rm -R /var/lib/cassandra
sudo rm -R /var/log/cassandra
sudo rm -R /usr/share/cassandra

然后我安装了Cassandra,一切都恢复正常了 :)

3
诊断Cassandra的第一步是检查日志记录。
在命令行参数中找到进程,会有提示告诉您日志文件的位置。
在我的情况下,它位于默认位置/etc/cassandra/conf/cassandra.yaml(如果您安装了yum包)。
确保配置三个相同主机/ IP的事项已配置。
1. listen_address - 您可以将其留空,它将默认为使用 eth0 网络卡绑定的主机名/第一个IP。 2. rpc_address - 这是可选的,如果要与 listen_address 相同,请保留为空白。 3. seeds - 这是用逗号分隔的IP地址或主机名列表的双引号字符串。这是默认硬编码为“ 127.0.0.1”,将其更改为与 list_address 相同并重新启动Cassandra服务即可使其正常工作。
参考资料:

1
非常感谢您,我认为种子是最终使一切正常工作的原因。我还必须将start_rpc设置为true。令人难以置信的不直观的是,当我只想使用本地客户端连接时,为什么我需要打开rpc。 - Researcher

2

我曾经遇到过Cassandra 3.11.0的同样问题,每当我更改rpc或监听地址时,cqlsh就无法工作。我不得不将相同的本地IP添加到seeds中。

所以在多次尝试后,我的cassandra.yml配置最终变成了这样:

class-name: org.apache.cassandra.locator.SimpleSeedProvider
parameters: 
    -seeds: "192.168.0.30"

listen_adress: 192.168.0.30
rpc_address: 192.168.0.30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接