首页 文章

Cassandra Port Exhaustion

提问于
浏览
1

问题涉及何时将大量数据写入Cassandra集群并在运行应用程序将数据写入Cassandra的主机上导致Port Exhaustion .

问题详情如下:

在我们的应用程序中,我们不断将数据写入由3个节点组成的Cassandra集群 . 应用程序是用C#编写的,并且是多线程的 . 让我们假设,100个线程打开,每个线程开始使用datastax C#驱动程序向Cassandra发出写操作 . 根据此文档(4 simple rules when using datastax driver for cassandra),Session对象是线程安全的,并在每个线程中重用 . 运行应用程序后,在几个小时内,我们发现发生了_2598507问题,运行该应用程序的主机停止创建或接受任何其他连接 . 投资此问题后,我们认为每个线程向Cassandra驱动程序发出的写入创建了与Cassandra集群的单独物理连接(最多20k连接) .

单个写入操作完成后,将关闭连接 . 但“创建连接”和“连接关闭”的速率并不相似 . 连接打开得非常快,关闭时间相对较慢 . 当它达到大约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

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

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

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

相关问题