cassandra.cluster.NoHostAvailable 使用 Python 连接到 docker 容器时

cassandra.cluster.NoHostAvailable when connecting with Python to a docker container

我有一个使用此命令创建的 docker 容器(该卷目前是空的):

docker run --name mabase-cassandra -v /db/docker_saves/cassandra:/var/lib/cassandra -d cassandra:3

当我尝试使用 python 连接到它时(当然,当容器是 运行 时),我收到一条错误消息:

session = cassandra_cluster.connect()
  File "cassandra\cluster.py", line 1667, in cassandra.cluster.Cluster.connect
  File "cassandra\cluster.py", line 1703, in cassandra.cluster.Cluster.connect
  File "cassandra\cluster.py", line 1690, in cassandra.cluster.Cluster.connect
  File "cassandra\cluster.py", line 3488, in cassandra.cluster.ControlConnection.connect
  File "cassandra\cluster.py", line 3533, in cassandra.cluster.ControlConnection._reconnect_internal
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'127.0.0.1:9042': ConnectionRefusedError(10061, "Tried connecting to [('127.0.0.1', 9042)]. Last error: no connection could be made because the target machine actively refused it

我已经检查 start_native_transport 的值在 cassandra.yaml 中是正确的。

有关信息,我使用的是 Python 3.9.2,docker 容器必须使用 Cassandra 3.11。

忘记说了,使用的代码如下:

from cassandra.cluster import Cluster 

cassandra_cluster = Cluster() 
session = cassandra_cluster.connect()

在 Docker 上对 Cassandra 文档进行了一些研究后,我发现我可以公开端口。但是,我不确定这是否是处理此问题的好方法:根据 Dockerhub 上 Cassandra 的官方网页,我应该使用网络 运行 另一个容器来运行 我的 cql 查询,但我不知道该怎么做。

正如您所指出的,为了做到这一点,您必须通过添加 -p 9042:9042 来转发端口。为了从外部访问它,您必须转发端口。

关于另一个不需要转发的选项,这取决于您的用例。避免转发端口不是一般规则,它仅取决于用例。如果您在同一网络中使用另一个容器,则取决于连接到端口的人,您可以避免转发它。但不要仅仅作为代理人那样做。这意味着您首先连接到另一个容器,然后再连接到 Cassandra,而不是 运行 来自主机的查询。如果您喜欢在 Cassandra 中存储数据的 Web 应用程序,那么可以在应用程序的容器上转发端口 80,然后应用程序连接到 Cassandra。这就说得通了。 有时您可能有需要连接到数据库的外部客户端,因此端口需要可访问。

解决方法是尝试使用防火墙限制可以访问machine/port的IP,而且从安全的角度来看非常重要,激活authentication and authorization。 SSL 也有帮助。