我正在使用 Datastax 的 python 驱动程序来提交并发请求,如下所示:
concurrent.execute_concurrent(...concurrency=50)
提交的请求总数在200左右,有些结果集有数千行。
我偶尔会遇到以下错误:
exception while fetching results ('Unable to complete the operation against any hosts', {\
<Host: 127.0.0.1:9043 us-east>: ConnectionShutdown('CRC mismatch on header fc3b22. Received 85", computed 67cd61.'), \
<Host: 10.0.0.235:9042 us-east>: ConnectionException('Host has been marked down or removed')})
如何避免这个错误?我怀疑这是由于通过网络传输大量数据而发生的,但无法查明确切的根本原因。什么是安全并发级别?
驱动程序版本:3.29.1
cassandra 版本:cqlsh 6.1.0 |卡桑德拉 4.1.4 | CQL 规范 3.4.6 |本机协议 v5]
我尝试使用不同级别的并发性 - 我需要将其设置为至少 50,否则查询需要很长时间才能完成执行。
nodetool状态显示所有节点均已启动
优化了我的查询,以便在每个查询中指定准确的分区键 - 它们都不在分区上使用“IN”运算符。
使用准备好的语句
在我看来,你实际上有两个不同的问题。
第一个是您有一个节点配置为侦听
localhost
上的客户端连接:
... <Host: 127.0.0.1:9043 us-east>: ConnectionShutdown('CRC mismatch on header fc3b22. Received 85", computed 67cd61.') ...
除非您的应用程序与 Cassandra 节点托管在同一服务器上,否则切勿将 CQL 端口绑定到
localhost
。相反,您应该将节点配置为侦听可从应用程序路由的 IP 地址上的连接。
对于第二个问题,指示为:
... <Host: 10.0.0.235:9042 us-east>: ConnectionException('Host has been marked down or removed') ...
客户端无法连接到主机,因为它已被“标记为down”。驱动程序的
ConvictionPolicy
决定何时应将节点因故障而标记为“关闭”。
节点被标记为“关闭”的最常见原因是当它无响应或不可用时,通常是因为它过载并且不再响应新请求。在您的情况下,节点
10.0.0.235
可能占用了所有流量,因此没有响应,因为其他节点无法访问。
检查另一个节点的配置并确保它正在接受来自客户端的请求。干杯!