我已经能够在 Windows 本地主机端口上启动 Cassandra,并使用 cassandra-driver 模块连接到它。但是,当我尝试通过 Docker 容器连接到 Cassandra 时,我收到以下连接被拒绝的异常:
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'192.168.99.101': ConnectionRefusedError(10061, "Tried connecting to [('192.168.99.101', 9042)]. Last error: No connection could be made because the target machine actively refused it")})
这是我的设置:
系统:
Windows 8.1
docker 1.9.1
虚拟盒子 4.3.34
Python 3.5.1
Cassandra 3.0.2
Cassandra 驱动程序 3.0.0
docker 文件: https://hub.docker.com/r/rc42/lab-cassandra/~/dockerfile/
Docker 容器端口映射:
7000/tcp -> 0.0.0.0:7000
7001/tcp -> 0.0.0.0:7001
7199/tcp -> 0.0.0.0:7199
9042/tcp -> 0.0.0.0:9042
9160/tcp -> 0.0.0.0:9160
Docker-机器IP
192.168.99.101
cassandra.yaml(默认设置)
listen_address: 本地主机
当我在容器中初始化cassandra时,我收到了一个正常的结果:
cassandra -f
信息 22:38:18 开始在 localhost/127.0.0.1:9042 上监听 CQL 客户端 信息 22:38:18 未按要求启动 RPC 服务器。使用 JMX (StorageService ->startRPCServer()) 或 nodetool (enablethrift 来启动它)
但是,当我尝试使用 python 脚本连接到它时,它拒绝了我的连接:
from cassandra.cluster import Cluster
cluster = Cluster(['192.168.99.101'])
session = cluster.connect()
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'192.168.99.101': ConnectionRefusedError(10061, "Tried connecting to [('192.168.99.101', 9042)]. Last error: No connection could be made because the target machine actively refused it")})
根据其他帖子的建议,我尝试调整cassandra.yaml中的listen_address,但未能解决问题。 docker-machine IP 地址都不是:
listen_address: 192.168.99.101
也不是 docker 容器 IP 地址:
listen_address: 172.17.0.2
解决问题。奇怪的是,即使我将 listen_address 设置为 172.17.0.2,启动时的标准输出是:
INFO 19:42:19 Starting listening for CQL clients on localhost/127.0.0.1:9042 (unencrypted)...
到目前为止,我发现 this poster 发生了类似的错误和其他一些人的连接被不同的 error here 拒绝和 error here .还有一个帖子将问题链接到可能如何 cassandra-driver works with pycharm .但是到目前为止,我解决这个配置问题的所有尝试都失败了,即使我在 pycharm 之外运行 python 时也会出现问题。我有其他容器在同一台 docker 机器上的不同端口上运行,客户端连接到容器没有任何问题,只是 cassandra。
谁能帮我理解为什么 python 拒绝连接到 Cassandra?
而且,我可以做些什么来解决它?
请您参考如下方法:
在发现 thread on grokbase 之后解决了让 Cassandra 在接口(interface)而不是本地主机地址上监听端口 9042 的问题,我能够找到一个有效的配置设置。
查找容器私有(private)ip:
CONTAINER_IP=`docker inspect -f '{{ .NetworkSettings.IPAddress }}' container`
编辑 cassandra.yaml 文件:
seed: "CONTAINER_IP"
listen_address: CONTAINER_IP
broadcast_address: CONTAINER_IP
start_rpc: true
rpc_address: 0.0.0.0
broadcast_address: CONTAINER_IP
虽然这适用于在 VirtualBox 中的 Docker 容器中运行的单节点,但这种配置在部署到 ec2 或链接到集群中的其他节点时不太可能起作用。
