Cassandra Port Exhaustion

时间:2016-08-09 06:21:32

标签: c# multithreading cassandra datastax datastax-enterprise

问题涉及何时将大量数据写入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);

1 个答案:

答案 0 :(得分:0)

Cassandra驱动程序支持对多个查询使用相同的连接,但C#驱动程序的默认设置非常低 - 至少与我过去使用过的驱动程序相比。

YMMV,但您可以调整连接选项(documented here),以便将连接用于多个请求。您还可以设置最大创建的连接数,以防止应用程序停止。

如果有更多的请求进入,可能会及时处理,这显然会阻碍您的申请。在出现问题的情况下,您需要优化或使用其他服务器。