【问题标题】:Error accessing Scylladb cluster outside docker container在 docker 容器外访问 Scylladb 集群时出错
【发布时间】:2022-11-04 19:31:01
【问题描述】:

我在 docker 容器中本地运行 Scylladb,我想访问 docker 容器外的集群。那是我收到以下错误的时候:cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers')

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns    Host ID                               Rack
UN  172.17.0.2  776 KB     256          ?       ad698c75-a465-4deb-a92c-0b667e82a84f  rack1

Note: Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless
Cluster Information:
    Name: Test Cluster
    Snitch: org.apache.cassandra.locator.SimpleSnitch
    DynamicEndPointSnitch: disabled
    Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
    Schema versions:
        443048b2-c1fe-395e-accd-5ae9b6828464: [172.17.0.2]

我在端口 9042 上使用 cqlsh 访问集群没有问题:

Connected to  at 172.17.0.2:9042.
[cqlsh 5.0.1 | Cassandra 3.0.8 | CQL spec 3.3.1 | Native protocol v4]

现在我正在尝试从 docker 容器外部的我的 fastapi 应用程序访问集群。

from cassandra.cluster import Cluster

cluster = Cluster(['172.17.0.2'])

session = cluster.connect('Test Cluster')

这是我得到的错误:

raise NoHostAvailable("Unable to connect to any servers", errors)
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'172.17.0.2:9042': OSError(51, "Tried connecting to [('172.17.0.2', 9042)]. Last error: Network is unreachable")})

【问题讨论】:

  • 你的主机是 Mac 吗?已知的限制之一是您不能直接将流量从主机路由到 Mac 中的容器。如果不是,那么请演示一下你的 Python 程序的相关连接部分。
  • @FelipeMendes 是的,我的主机是 Mac。您知道任何解决方法吗?
  • 是的,在 Docker 容器中运行您的程序,您将能够将流量路由到 Scylla。这是 Mac 的限制。

标签: docker cassandra scylla cassandra-python-driver


【解决方案1】:

稍加修改,就可以实现与在容器外部的容器中运行的 Scylla 的连接,以进行本地开发。

我在带有 docker 桌面的 M1 Mac 上试过:

  1. 运行带有几个新参数[src] 的 scylla 容器:

    • --listen-address 0.0.0.0 为简化起见,因为我们在容器内生成 Scylla 以允许从任何网络连接到容器
    • 如果 --listen-address 设置为 0.0.0.0,则需要 --broadcast-rpc-address 127.0.0.1。我们要将 9042 从容器转发到主机(本地)机器,所以这是一个可以访问的 IP。

    生成容器的最终命令是:

    $ docker run --rm -ti 
       -p 127.0.0.1:9042:9042 
       scylladb/scylla 
           --smp 1 
           --listen-address 0.0.0.0 
           --broadcast-rpc-address 127.0.0.1
    

    -p 127.0.0.1:9042:9042 用于使主机(本地)机器上的端口 9042 可访问。

  2. 安装pip3 install scylla-driver,因为它支持darwin/arm64 架构。

  3. 编写一个简单的python脚本:

    # so74265199.py
    
    from cassandra.cluster import Cluster
    
    cluster = Cluster(['127.0.0.1'])
    
    session = cluster.connect()
    # Select from a table that is available without keyspace
    res = session.execute('SELECT * FROM system.versions')
    print(res.one())
    
  4. 运行你的脚本

    $ python3 so74265199.py
    Row(key='local', build_id='71178cf6db7021896cd8251751b78b3d9e3afa8d', build_mode='release', version='5.0.5-0.20221009.5a97a1060')
    

    免责声明:我不是 Scylla 配置方面的专家,因此请随时指出更好的方法。

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2015-04-17
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多