问题涉及何时将大量数据写入Cassandra集群并导致运行应用程序的主机上的Port Exhaustion将数据写入Cassandra。
问题详情如下:
在我们的应用程序中,我们不断将数据写入由3个节点组成的Cassandra集群。应用程序是用C#编写的,并且是多线程的。让我们假设,100个线程打开,每个线程开始使用datastax C#驱动程序向Cassandra发出写操作。根据此文档(4 simple rules when using datastax driver for cassandra),Session对象是线程安全的,并在每个线程中重用。运行应用程序后,在几个小时内,我们发现" Port Exhaustion"问题发生,运行应用程序的主机停止创建或接受任何其他连接。投资此问题后,我们认为每个线程向Cassandra驱动程序发出的写入都会创建与Cassandra集群的单独物理连接(最多20k连接)。
单个写入操作完成后,将关闭连接。但是"连接的速率创造了#34;和#34;连接关闭"不相似。连接打开得非常快,关闭时间相对较慢。当它达到大约20k的开放连接时,主机将不再创建任何连接。
我们的问题是,与新的写入指令相比,当写入指令执行时间更长时,Cassandra驱动程序/系统的预期行为是什么,导致许多连接保持打开更长时间。
如果是Cassandra驱动程序/系统的预期行为,那么可以采取哪些其他选择? (例如,在节点之间分配任务的多台机器上运行应用程序,以避免端口耗尽。)
如果在这种情况下不是预期的行为,那么我们将非常感谢您指导我们找到可能的解决方案。
运行C#应用程序的服务器的详细信息: -
操作系统:Windows Server 2012 R2
内存:8 GB
Datastax Enterprise:4.8.3
Cassandra版本:2.1
Cassandra C#驱动程序版本:3.0.5
创建集群和会话的代码
string NodeIps = "127.0.0.1,127.0.0.2,127.0.0.3";
List<string> addresses = new List<string>();
addresses = NodeIps.Split(',').ToList();
cluster = Cluster.Builder()
.AddContactPoints(addresses) //node ip
.WithRetryPolicy(DowngradingConsistencyRetryPolicy.Instance)
.WithReconnectionPolicy(new FixedReconnectionPolicy(0, 5000, 2 * 60000, 60 * 60000))
.WithQueryTimeout(600000) //Timeout specified in milliseconds. //10 min = 600000
.Build();
ISession session = cluster.Connect(KeySpace);
答案 0 :(得分:0)
Cassandra驱动程序支持对多个查询使用相同的连接,但C#驱动程序的默认设置非常低 - 至少与我过去使用过的驱动程序相比。
YMMV,但您可以调整连接选项(documented here),以便将连接用于多个请求。您还可以设置最大创建的连接数,以防止应用程序停止。
如果有更多的请求进入,可能会及时处理,这显然会阻碍您的申请。在出现问题的情况下,您需要优化或使用其他服务器。