代码之家  ›  专栏  ›  技术社区  ›  Peter Weyand

Golang gocql无法连接到Cassandra(使用Docker)

  •  0
  • Peter Weyand  · 技术社区  · 6 年前

    我能找到的最接近解决golang之间连接问题的信息 gocql Cassandra cqlsh - connection refused

    这个问题应该略有不同,因为它是使用Docker和我尝试了大多数(如果不是所有的解决方案链接到上面)。

    version: "3"  
    services:  
      cassandra00:
        restart: always
        image: cassandra:latest
        volumes: 
          - ./db/casdata:/var/lib/cassandra
        ports: 
          - 7000:7000
          - 7001:7001
          - 7199:7199
          - 9042:9042
          - 9160:9160
        environment:
          - CASSANDRA_RPC_ADDRESS=127.0.0.1
          - CASSANDRA_BROADCAST_ADDRESS=127.0.0.1
          - CASSANDRA_LISTEN_ADDRESS=127.0.0.1
          - CASSANDRA_START_RPC=true
      db:
        restart: always
        build: ./db
        environment:
          POSTGRES_USER: patientplatypus
          POSTGRES_PASSWORD: SUPERSECRETFAKEPASSD00T
          POSTGRES_DB: zennify
        expose:
          - "5432"
        ports:
          - 5432:5432
        volumes:
          - ./db/pgdata:/var/lib/postgresql/data
      app:
        restart: always
        build: 
          context: .
          dockerfile: Dockerfile
        command: bash -c 'while !</dev/tcp/db/5432; do sleep 10; done; realize start --run'
        # command: bash -c 'while !</dev/tcp/db/5432; do sleep 10; done; go run main.go'
        ports:
          - 8000:8000
        depends_on:
          - db
          - cassandra00
        links:
          - db
          - cassandra00
        volumes:
          - ./:/go/src/github.com/patientplatypus/webserver/
    

    诚然,我有点不确定我应该把什么样的倾听地址传给环境部分的卡桑德拉,所以我只通过了“家”:

      - CASSANDRA_RPC_ADDRESS=127.0.0.1
      - CASSANDRA_BROADCAST_ADDRESS=127.0.0.1
      - CASSANDRA_LISTEN_ADDRESS=127.0.0.1
    

    如果你试着通过 0.0.0.0

    cassandra00_1  | Exception (org.apache.cassandra.exceptions.ConfigurationException) encountered during startup: listen_address cannot be a wildcard address (0.0.0.0)!
    cassandra00_1  | listen_address cannot be a wildcard address (0.0.0.0)!
    cassandra00_1  | ERROR [main] 2018-09-10 21:50:44,530 CassandraDaemon.java:708 - Exception encountered during startup: listen_address cannot be a wildcard address (0.0.0.0)!
    

    但是,总的来说,我认为我得到了正确的Cassandra(afaict)启动程序,因为我的终端输出Cassandra正常启动,并且正在监听相应的端口:

    cassandra00_1  | INFO  [main] 2018-09-10 22:06:28,920 StorageService.java:1446 - JOINING: Finish joining ring
    cassandra00_1  | INFO  [main] 2018-09-10 22:06:29,179 StorageService.java:2289 - Node /127.0.0.1 state jump to NORMAL
    cassandra00_1  | INFO  [main] 2018-09-10 22:06:29,607 NativeTransportService.java:70 - Netty using native Epoll event loop
    cassandra00_1  | INFO  [main] 2018-09-10 22:06:29,750 Server.java:155 - Using Netty Version: [netty-buffer=netty-buffer-4.0.44.Final.452812a, netty-codec=netty-codec-4.0.44.Final.452812a, netty-codec-haproxy=netty-codec-haproxy-4.0.44.Final.452812a, netty-codec-http=netty-codec-http-4.0.44.Final.452812a, netty-codec-socks=netty-codec-socks-4.0.44.Final.452812a, netty-common=netty-common-4.0.44.Final.452812a, netty-handler=netty-handler-4.0.44.Final.452812a, netty-tcnative=netty-tcnative-1.1.33.Fork26.142ecbb, netty-transport=netty-transport-4.0.44.Final.452812a, netty-transport-native-epoll=netty-transport-native-epoll-4.0.44.Final.452812a, netty-transport-rxtx=netty-transport-rxtx-4.0.44.Final.452812a, netty-transport-sctp=netty-transport-sctp-4.0.44.Final.452812a, netty-transport-udt=netty-transport-udt-4.0.44.Final.452812a]
    cassandra00_1  | INFO  [main] 2018-09-10 22:06:29,754 Server.java:156 - Starting listening for CQL clients on /127.0.0.1:9042 (unencrypted)...
    cassandra00_1  | INFO  [main] 2018-09-10 22:06:29,990 ThriftServer.java:116 - Binding thrift service to /127.0.0.1:9160
    

    在我的golang代码中,调用了以下包(简化为显示相关部分):

    package data
    
    import(
        "fmt"
        "github.com/gocql/gocql"
    )
    
    func create_userinfo_table() {
        <...>
        fmt.Println("replicating table in cassandra")
        cluster := gocql.NewCluster("localhost") //<---error here!
        cluster.ProtoVersion = 4
        <...>
    }
    

    app_1          | [21:52:38][WEBSERVER] : 2018/09/10 
    21:52:38 gocql: unable to dial control conn 127.0.0.1: 
    dial tcp 127.0.0.1:9042: connect: connection refused
    
    app_1          | [21:52:38][WEBSERVER] : 2018/09/10 
    21:52:38 gocql: unable to dial control conn ::1: 
    dial tcp [::1]:9042: connect: cannot assign requested address
    
    app_1          | [21:52:38][WEBSERVER] : 2018/09/10 
    21:52:38 Could not connect to cassandra cluster: gocql: 
    unable to create session: control: unable to connect to initial hosts: 
    dial tcp [::1]:9042: connect: cannot assign requested address
    

    我试过几种不同的连接地址

    cluster := gocql.NewCluster("localhost")

    cluster := gocql.NewCluster("127.0.0.1")

    cluster := gocql.NewCluster("127.0.0.1:9042")

    cluster := gocql.NewCluster("127.0.0.1:9160")

    例如,这些人似乎很可能成为候选人,但运气不佳。

    有人知道我做错了什么吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   gazarsgo    6 年前

    使用服务名称 cassandra00 对于docker compose文档中的主机名 https://docs.docker.com/compose/compose-file/#links

    离开 CASSANDRA_LISTEN_ADDRESS envvar unset(或pass auto https://docs.docker.com/samples/library/cassandra/

    默认值是auto,它将在中设置listen\u address选项卡桑德拉.亚马尔容器启动时的IP地址。这个默认值应该适用于大多数用例。