我刚刚尝试使用Golang从我的本地机器连接到Docker Desktop上的3节点Scylla集群,但没有成功(在Mac M2上)
我试着遵循这里的步骤:https://university.scylladb.com/courses/using-scylla-drivers/lessons/golang-and-scylla-part-1/
例外是我没有为测试应用程序创建Docker容器,因为我不想在修改代码时重新创建容器。我想先在本地进行测试。
docker-compose部分
services:
scylla-node1:
image: scylladb/scylla:latest
restart: always
container_name: scylla-node1
command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
volumes:
- './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
- './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
- './scylla/mutant-data.txt:/mutant-data.txt'
networks:
- myappnetwork
scylla-node2:
image: scylladb/scylla:latest
restart: always
container_name: scylla-node2
command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
volumes:
- './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
- './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
networks:
- myappnetwork
scylla-node3:
image: scylladb/scylla:latest
restart: always
container_name: scylla-node3
command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
volumes:
- './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
- './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
networks:
- myappnetwork
networks:
myappnetwork:
driver: bridge
然后,我按照教程中的说明创建了键空间和数据
并尝试与gocql连接:
// go.mod
go 1.21.0
replace github.com/gocql/gocql => github.com/scylladb/gocql v1.11.1
import (
...
"github.com/gocql/gocql"
)
func Start(log logger.Logger) {
config := CreateCluster(gocql.Quorum, "catalog", "scylla-node1", "scylla-node2", "scylla-node3")
// config := CreateCluster(gocql.Quorum, "catalog", "172.29.0.5", "172.29.0.4", "172.29.0.3")
// >>> doesn't work either cause I can't even ping containers IPs
session, err := gocql.NewSession(*config)
if err != nil {
log.Fatal(err, "db", "Start", "unable to connect to scylla")
}
defer session.Close()
}
func CreateCluster(consistency gocql.Consistency, keyspace string, hosts ...string) *gocql.ClusterConfig {
retryPolicy := &gocql.ExponentialBackoffRetryPolicy{
Min: time.Second,
Max: 10 * time.Second,
NumRetries: 5,
}
config := gocql.NewCluster(hosts...)
config.PoolConfig.HostSelectionPolicy = gocql.TokenAwareHostPolicy(gocql.RoundRobinHostPolicy())
config.Compressor = &gocql.SnappyCompressor{}
config.RetryPolicy = retryPolicy
config.Timeout = 5 * time.Second
config.Keyspace = keyspace
config.Consistency = consistency
return config
}
错误gocql:无法创建会话:无法发现协议版本:拨打tcp:0->172.29.0.3:9042:i/o超时
1条答案
按热度按时间igsr9ssn1#
你是对的,但这就是底层Docker实现在Mac上的工作方式。:-)
容器在虚拟机内部运行,因此,默认情况下,您无法将流量路由到容器IP地址。
但是,您可以将端口从容器绑定到主机,但这样做的问题是,考虑到CQL协议的工作方式,您的驱动程序将无法连接。
你有几个选择:
1 -启动单个ScyllaDB容器,将端口9042/19042(和/或相关的TLS端口,如果适用)绑定到您的主机。告诉你的应用程序连接到localhost并完成。此方法不适用于包含1个以上节点的群集。
2 -将您的应用程序移动到同一网络下的容器。由于容器将与底层VM位于同一网络中,因此流量将是可路由的!
3 -您可以阅读更多,并尝试一些变通办法列出的from the Docker forum,明知在某个时候在未来它可能会打破。
4 -运行Linux(或在VM中),它会将已发布的容器端口路由到主机,而不会有太多麻烦。