Trino Cassandra连接器连接多节点时端口错误问题求助
解决Trino Cassandra连接器连接集群节点时端口不匹配问题
问题核心
Trino能通过19001端口连接集群第一个节点,但连接其余节点时,DataStax驱动自动使用默认的9042端口,导致连接失败。这是因为驱动会从Cassandra集群的系统元数据表中获取节点端口,而非一直沿用连接器配置的端口。
解决方案
方案1:统一Cassandra集群节点的端口配置
这是最根本的解决方式,确保所有Cassandra节点本身使用19001端口对外提供服务:
- 登录每个Cassandra节点,找到配置文件
cassandra.yaml; - 修改
native_transport_port参数为19001:native_transport_port: 19001 - 重启每个Cassandra节点的服务,确保配置生效;
- 重启Trino集群,让连接器重新获取集群元数据。
方案2:强制Trino驱动使用固定端口(无需修改Cassandra节点)
如果无法修改Cassandra节点的配置,可通过Trino连接器的高级驱动配置,强制驱动对所有节点使用19001端口:
- 修改Trino的Cassandra连接器配置文件(通常在
etc/catalog/cassandra.properties),替换原有的cassandra.contact-points和cassandra.native-protocol-port配置,添加以下驱动自定义配置:connector.name=cassandra cassandra.load-policy.dc-aware.local-dc=datacenter1 cassandra.client.connect-timeout=1m cassandra.client.read-timeout=1m cassandra.retry-policy=BACKOFF cassandra.username=xxxxx cassandra.password=xxxx # 自定义DataStax驱动配置,指定固定端口 cassandra.advanced.driver-config=datastax-java-driver { basic { contact-points = [ { address = "192.168.144.56", port = 19001 }, { address = "192.168.144.57", port = 19001 }, { address = "192.168.144.55", port = 19001 } ] } advanced { metadata { schema { # 使用固定端口解析器,忽略集群元数据中的端口 port-resolver = fixed } } } } - 重启Trino集群,使配置生效。
原因说明
Trino的Cassandra连接器基于DataStax Java驱动,其连接逻辑为:
- 初始连接时,使用配置的
contact-points和native-protocol-port连接节点; - 连接成功后,驱动会从该节点的
system.local(本地节点信息)和system.peers(集群其他节点信息)表中读取所有节点的地址和端口; - 如果这些系统表中记录的端口是Cassandra默认的9042,驱动后续连接其他节点时会自动使用9042,而非连接器配置的19001;
- 直接给
cassandra.native-protocol-port配置多个端口无效,因为该参数仅用于初始连接的端口,不覆盖后续节点的端口解析。
内容的提问来源于stack exchange,提问作者danmo41
相关产品推荐
相关产品推荐

