使用Netflix Astyanax从Cassandra 1.x读取数据异常问题咨询
问题分析与解决方案
核心问题定位
从日志和你的使用场景来看,主要问题集中在Astyanax(基于Thrift协议)与Cassandra 3.x的兼容性以及连接池异常:
- Cassandra 3.x开始逐步废弃Thrift协议,默认配置下Thrift服务可能未启用或存在限制,导致依赖Thrift的Astyanax无法稳定建立连接。
- 日志中重复出现
Current inFlight 1, 1 connections needed, 1 connections available, trashing,说明连接池在频繁销毁可用连接,无法复用连接,导致请求陷入循环,无法正常获取数据。
需要调整的Cassandra主机配置
针对Cassandra 3.x,需确保Thrift相关配置正确,同时优化连接池参数:
1. 启用并配置Thrift服务
修改Cassandra的cassandra.yaml文件:
- 确保
start_rpc: true(Cassandra 3.x默认可能关闭Thrift服务,需手动开启) - 确认
rpc_port: 9160(Astyanax默认使用9160端口,注意与CQL的9042端口区分) - 设置
rpc_max_threads: 64(根据业务并发量调整,避免Thrift线程池耗尽) - 开启
rpc_keepalive: true(保持长连接,减少连接重建开销)
2. 优化连接池与超时配置
修改cassandra-env.sh文件调整JVM和连接参数:
- 设置
JVM_OPTS="$JVM_OPTS -Dcassandra.rpc.server.type=hsha"(采用半同步半异步模式,提升Thrift请求并发处理能力) - 延长
rpc_timeout_in_ms: 10000(避免因请求超时导致连接被频繁销毁)
代码层面优化建议
除了Cassandra端配置,Astyanax客户端也需要调整:
- 确保使用适配Cassandra 3.x的Astyanax版本(注意:Astyanax已停止维护,建议逐步迁移到官方Java Driver)
- 调整客户端连接池参数,避免连接频繁销毁:
AstyanaxContext.Builder builder = new AstyanaxContext.Builder() .forCluster("your-cluster") .forKeyspace("your-keyspace") .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE) .setMaxConnsPerHost(10) .setSeeds("cassandra-host1:9160,cassandra-host2:9160") ) .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("custom-pool") .setPort(9160) .setMaxConnsPerHost(5) .setConnectTimeout(2000) .setSocketTimeout(10000) ) .withDiscoveryType(NodeDiscoveryType.RING_DESCRIBE); - 避免混合使用Thrift(Astyanax)和CQL驱动,两者的协议与连接池会相互干扰,日志中同时出现CQL的
PREPARE语句和Thrift请求,可能是代码混用了不同驱动导致的异常。
日志异常解释
日志中重复的trashing信息是Astyanax连接池检测到连接状态异常时销毁连接的操作,根源是Thrift连接不稳定,连接池无法维持可用连接,进而导致请求无法正常获取数据。
内容的提问来源于stack exchange,提问作者Zen
相关产品推荐
相关产品推荐

