Go语言 无法从主机连接到ScyllaDB容器

jvidinwx  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(119)

我刚刚尝试使用Golang从我的本地机器连接到Docker Desktop上的3节点Scylla集群,但没有成功(在Mac M2上)
我试着遵循这里的步骤:https://university.scylladb.com/courses/using-scylla-drivers/lessons/golang-and-scylla-part-1/
例外是我没有为测试应用程序创建Docker容器,因为我不想在修改代码时重新创建容器。我想先在本地进行测试。

docker-compose部分

  1. services:
  2. scylla-node1:
  3. image: scylladb/scylla:latest
  4. restart: always
  5. container_name: scylla-node1
  6. command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
  7. volumes:
  8. - './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
  9. - './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
  10. - './scylla/mutant-data.txt:/mutant-data.txt'
  11. networks:
  12. - myappnetwork
  13. scylla-node2:
  14. image: scylladb/scylla:latest
  15. restart: always
  16. container_name: scylla-node2
  17. command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
  18. volumes:
  19. - './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
  20. - './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
  21. networks:
  22. - myappnetwork
  23. scylla-node3:
  24. image: scylladb/scylla:latest
  25. restart: always
  26. container_name: scylla-node3
  27. command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
  28. volumes:
  29. - './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
  30. - './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
  31. networks:
  32. - myappnetwork
  33. networks:
  34. myappnetwork:
  35. driver: bridge

然后,我按照教程中的说明创建了键空间和数据
并尝试与gocql连接:

  1. // go.mod
  2. go 1.21.0
  3. replace github.com/gocql/gocql => github.com/scylladb/gocql v1.11.1
  1. import (
  2. ...
  3. "github.com/gocql/gocql"
  4. )
  5. func Start(log logger.Logger) {
  6. config := CreateCluster(gocql.Quorum, "catalog", "scylla-node1", "scylla-node2", "scylla-node3")
  7. // config := CreateCluster(gocql.Quorum, "catalog", "172.29.0.5", "172.29.0.4", "172.29.0.3")
  8. // >>> doesn't work either cause I can't even ping containers IPs
  9. session, err := gocql.NewSession(*config)
  10. if err != nil {
  11. log.Fatal(err, "db", "Start", "unable to connect to scylla")
  12. }
  13. defer session.Close()
  14. }
  15. func CreateCluster(consistency gocql.Consistency, keyspace string, hosts ...string) *gocql.ClusterConfig {
  16. retryPolicy := &gocql.ExponentialBackoffRetryPolicy{
  17. Min: time.Second,
  18. Max: 10 * time.Second,
  19. NumRetries: 5,
  20. }
  21. config := gocql.NewCluster(hosts...)
  22. config.PoolConfig.HostSelectionPolicy = gocql.TokenAwareHostPolicy(gocql.RoundRobinHostPolicy())
  23. config.Compressor = &gocql.SnappyCompressor{}
  24. config.RetryPolicy = retryPolicy
  25. config.Timeout = 5 * time.Second
  26. config.Keyspace = keyspace
  27. config.Consistency = consistency
  28. return config
  29. }

错误gocql:无法创建会话:无法发现协议版本:拨打tcp:0->172.29.0.3:9042:i/o超时

igsr9ssn

igsr9ssn1#

你是对的,但这就是底层Docker实现在Mac上的工作方式。:-)
容器在虚拟机内部运行,因此,默认情况下,您无法将流量路由到容器IP地址。
但是,您可以将端口从容器绑定到主机,但这样做的问题是,考虑到CQL协议的工作方式,您的驱动程序将无法连接。
你有几个选择:
1 -启动单个ScyllaDB容器,将端口9042/19042(和/或相关的TLS端口,如果适用)绑定到您的主机。告诉你的应用程序连接到localhost并完成。此方法不适用于包含1个以上节点的群集。
2 -将您的应用程序移动到同一网络下的容器。由于容器将与底层VM位于同一网络中,因此流量将是可路由的!
3 -您可以阅读更多,并尝试一些变通办法列出的from the Docker forum,明知在某个时候在未来它可能会打破。
4 -运行Linux(或在VM中),它会将已发布的容器端口路由到主机,而不会有太多麻烦。

相关问题