問題は、大量のデータをCassandraのクラスタに書き込まれ、Cassandraのにアプリケーションのデータ書き込みを実行するホストコンピュータのポート枯渇を得ている場合にも関します。次のような問題のCassandraのポート枯渇
詳細は次のとおり
を我々のアプリケーションでは、我々は常に3つのノードで構成されたカサンドラクラスタにデータを書き込んでいます。アプリケーションはC#で書かれ、マルチスレッド化されています。私たちは、100スレッドが開き、各スレッドがデータストアC#ドライバを使用してCassandraに書き込み操作を発行し始めると仮定しよう。このドキュメント(4 simple rules when using datastax driver for cassandra)によれば、セッションオブジェクトはスレッドセーフであり、各スレッドで再利用されます。アプリケーションを実行した後、数時間以内に「ポート枯渇」の問題が発生し、アプリケーションを実行しているホストコンピュータが他の接続の作成または受諾を停止することがわかります。この問題を投資した後、私たちは、各スレッドがCassandraドライバに発行した書き込みが、Cassandraクラスタ(最大20k接続)への個々の物理的な接続を作成したと考えます。個々の書き込み動作が完了すると
は、接続が閉じられています。しかし、「作成された接続」と「接続終了」の割合は似ていません。接続は非常に迅速に開き、比較的遅く閉じます。そして、約20kのオープン接続に達する頃には、ホストコンピュータはそれ以上の接続を作成しません。
私たちの質問には、書き込み命令は、多くの接続が得られ、来る新しい書き込み命令に比べて実行に時間がかかるとき、それはカサンドラドライバ/システムの正常な動作ですが、長い時間のために開いたまま、ということです。
それはカサンドラドライバ/システムの正常な動作であれば、他にどのような選択肢をとることができますか? (ノード間で分散されたタスクを持つ複数のマシンでアプリケーションを実行するなど)。
このシナリオで期待される動作ではない場合は、可能性のあるソリューションをご案内していただき、誠にありがとうございます。 C#アプリケーションを実行しているサーバーの
詳細: -
OS:のWindows Server 2012 R2
メモリ:8ギガバイト
Datastaxエンタープライズ:4.8.3
カサンドラバージョン:2.1
カサンドラ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);
クラスタインスタンスとセッションインスタンスを作成するコードを投稿できますか?また、ドライバーのトレースを有効にして、フードの状況を確認する必要があります。http://datastax.github.io/csharp-driver/faq/#how-can-i-enable-tracing-in-the-driver – jorgebg
@jorgebg私はコードで質問を更新しました。 – Hitesh
あなたは「個々の書き込み操作が完了すると接続が閉じられます。」:書き込み後にセッションを閉じたりシャットダウンしたりしないでください。セッションは各ノードへの接続のプールを保持していますので、アプリケーションのシャットダウン時にクラスタインスタンスをシャットダウンする必要があります。 – jorgebg