Python 无法通过 Docker 连接到 Cassandra

标签 python docker cassandra pycharm datastax

我已经能够在 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
Virtualbox 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

INFO 22:38:18 开始在 localhost/127.0.0.1:9042 上监听 CQL 客户端 INFO 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 或链接到集群中的其他节点时不太可能起作用。

关于Python 无法通过 Docker 连接到 Cassandra,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521233/

相关文章:

python - Pandas GroupBy 的绘图结果

python - 构建决策树

docker - 在Helm安装中运行包含kubectl命令的脚本

docker - 在容器内调试时保持Docker容器运行

Cassandra 1.2 : Is CQL preferred over Thrift Based Clients

sql - 使用 ORDER、LIMIT 和 IN 谓词查询的 Cassandra 表设计

python - 为什么将 Windows 路径放入变量中不会用双斜杠替换特定的单斜杠?

python - 数据添加到Django DB后自动调用方法

mongodb - 用于库存管理系统的 SQL 与 NoSQL

shell - ansible playbook命令中的问题?