【问题标题】:How do I connect to a Cassandra cluster deployed on AWS with gocql?如何使用 gocql 连接到部署在 AWS 上的 Cassandra 集群?
【发布时间】:2021-11-22 14:36:20
【问题描述】:

我已经完成了一个三节点 Cassandra 集群的设置。这个在aws上,服务器端口是开放的。三台服务器相互连接良好,工作完美。 我已经设置了

authenticator: AllowAllAuthenticator

在我的cassandra.yaml 文件中

我想用go cql建立连接,这里是连接代码

cluster := gocql.NewCluster("x.xxx.xxx.xxx")
cluster.Keyspace = "keyspace_name"
cluster.Consistency = gocql.Quorum
cluster.ProtoVersion = 4
cluster.ConnectTimeout = time.Second * 10

session, err := cluster.CreateSession()
if err != nil {
    fmt.Println(err)
}

但是 go cql 将这条消息发回给我。

2020/09/26 09:53:44 gocql: unable to dial control conn x.xxx.xxx: dial tcp 127.0.0.1:9042: connectex: No connections could be made because the target machine actively refused them.
2020/09/26 09:53:44 gocql: unable to create session: control: unable to connect to initial hosts: dial tcp x.xxx.xxx.xxx:9042: connectex: No connections could be made because the target machine actively refused them.
panic: runtime error: invalid memory address or nil pointer dereference

【问题讨论】:

  • 为什么要连接到本地主机?这是故意的吗?
  • 错误提示你正在尝试连接到 localhost(127.0.0.1),你能确定你使用的是正确的主机名吗?
  • @danielfarrell no 这是一个错误,它与服务器连接良好,或者希望在本地使用 golang 并在 db 上使用 cassandra,这是网站开发的时间。跨度>

标签: go amazon-ec2 cassandra gocql


【解决方案1】:

您很有可能在应用中使用私有 IP 地址连接到节点,但这些节点无法远程访问,因为根据定义,它们是私有地址。

您需要确保已将节点配置为使用:

listen_address: <ec2_private_ip>
rpc_address: <ec2_public_ip>

节点使用listen_address 相互通信,而客户端使用rpc_address 连接到集群,这就是它需要配置EC2 实例的可公开访问IP 地址的原因。

正确配置节点后,将您的应用配置为使用公共 IP 作为联系点:

cluster := gocql.NewCluster("public_ip1,public_ip2,...")

这应该允许您的应用连接到集群。干杯!

【讨论】:

  • @EricRamirez 感谢您的回复,但会不会是 aws 要求提供身份验证密钥?
  • 您发布的错误与身份验证没有任何关系——这是一个网络问题。节点未在您配置的 IP 上侦听 CQL 连接。干杯!
  • @EricRamirez 我把所有节点都放在了 gocql.NewCluster() 中,但是还是不行,错误是一样的,但是我的端口是开放的,并且 cassandra 配置得很好。
猜你喜欢
  • 2019-04-17
  • 2016-08-27
  • 2013-06-24
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多