2016-08-09 9 views
1

問題は、大量のデータを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); 
+0

クラスタインスタンスとセッションインスタンスを作成するコードを投稿できますか?また、ドライバーのトレースを有効にして、フードの状況を確認する必要があります。http://datastax.github.io/csharp-driver/faq/#how-can-i-enable-tracing-in-the-driver – jorgebg

+0

@jorgebg私はコードで質問を更新しました。 – Hitesh

+0

あなたは「個々の書き込み操作が完了すると接続が閉じられます。」:書き込み後にセッションを閉じたりシャットダウンしたりしないでください。セッションは各ノードへの接続のプールを保持していますので、アプリケーションのシャットダウン時にクラスタインスタンスをシャットダウンする必要があります。 – jorgebg

答えて

0

カサンドラドライバが複数のクエリに対して同じ接続を使用してサポートしていますが、デフォルトではC#のドライバには非常に低く設定されている - 少なくとも私はきたドライバーに比べて過去に使用された

YMMVが、あなたは調整でき、接続オプション(documented here)接続が複数の要求のために使用されるように。作成された接続の最大数を設定して、アプリケーションが停止しないようにすることもできます。より多くの要求が時間内に扱うことができるよりで来ている場合

これは明らかに、アプリケーションのボトルネックになります。これが問題である場合は、追加のサーバーを最適化または使用する必要があります。

関連する問題