如何连接Google Cloud上的Cassandra?Go用gocql连接超时怎么解决
问题排查及解决方案
你遇到的错误为I/O超时,根本原因是客户端无法访问到GCP服务器上Cassandra的9042端口,可从代码修正、网络安全校验两个维度排查:
代码问题修正
你的现有代码存在两处明显问题:
- 创建Session时主动忽略了返回的错误,无法拿到具体的失败原因
- 缺失认证、超时、TLS等必要连接配置,若Cassandra开启了身份校验会直接连接失败
修正后的参考代码如下:
import ( "fmt" "time" "github.com/gocql/gocql" ) type DBConnection struct { cluster *gocql.ClusterConfig session *gocql.Session } var connection DBConnection func SetupDBConnection() error { // 替换为你的GCP服务器公网IP connection.cluster = gocql.NewCluster("xx.xxx.xxx.xxx") // 单节点测试可将一致性改为One,避免Quorum要求不满足报错 connection.cluster.Consistency = gocql.One connection.cluster.Keyspace = "你的keyspace名称" // 配置连接超时 connection.cluster.Timeout = 10 * time.Second connection.cluster.ConnectTimeout = 10 * time.Second // 如果Cassandra开启了密码认证,添加以下配置,默认账号密码均为cassandra connection.cluster.Authenticator = gocql.PasswordAuthenticator{ Username: "cassandra", Password: "cassandra", } // 如果Cassandra开启了TLS加密,需补充TLS配置 // connection.cluster.SslOpts = &gocql.SslOptions{ // Config: &tls.Config{InsecureSkipVerify: true}, // } var err error connection.session, err = connection.cluster.CreateSession() if err != nil { return fmt.Errorf("创建Cassandra会话失败: %w", err) } return nil } func ExecuteQuery(query string, values ...interface{}) error { if connection.session == nil { return fmt.Errorf("会话未初始化") } return connection.session.Query(query).Bind(values...).Exec() }
网络与安全校验检查项
完成代码修正后如果仍报错,按以下顺序排查网络配置:
- 检查GCP防火墙入站规则:确认已添加规则放行TCP 9042端口,源IP为你本地客户端的公网IP,若配置为0.0.0.0/0会允许所有IP访问,生产环境不推荐
- 检查Cassandra服务配置:登录GCP服务器查看
cassandra.yaml文件,确认rpc_address配置为0.0.0.0或服务器公网IP,broadcast_rpc_address配置为服务器公网IP,默认的127.0.0.1仅允许本地访问 - 检查服务器本地防火墙:确认GCP实例内的ufw、firewalld等工具已放行9042端口的入站请求
- 本地连通性测试:在本地执行
telnet xx.xxx.xxx.xxx 9042或nc -zv xx.xxx.xxx.xxx 9042,如果返回连接失败,说明网络层面链路不通,需先解决网络配置问题
内容的提问来源于stack exchange,提问作者Jesver
相关产品推荐
相关产品推荐

