2013-04-24 19 views
5

私はAstyanaxクライアントを使用してCassandraデータベースからデータを読んでいます。ノードごとのAstyanaxクライアントの最大接続数は?

私はカサンドラデータベースに約100万のユニークな行を持っています。私は4つのノードを持つ単一のクロスcolocation centreクラスタを持っています。

node1:9160 
    node2:9160 
    node3:9160 
    node4:9160 

私が有効になっているKeyCachingとSizeTieredCompaction戦略も同様に有効になります。

これらは私の4つのノードです。

私は、Asthanaxクライアントを使用してカスカンドラデータベースからデータを読み込み、20スレッドで実行しているマルチスレッドのクライアントプログラムを用意しています。 20スレッドでクライアントプログラムを実行している場合、Cassandraデータベースからデータを読み込むパフォーマンスが低下します。

私の頭に浮かぶ最初のことは、カサンドラとの接続に関して競合する可能性があるということです。私は以下のコードを使用してAstyanaxクライアントを使用して接続しています。

private CassandraAstyanaxConnection() { 
    context = new AstyanaxContext.Builder() 
    .forCluster(ModelConstants.CLUSTER) 
    .forKeyspace(ModelConstants.KEYSPACE) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) 
    ) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(1) 
     .setSeeds("nod1:9160,node2:9160,node3:9160,node4:9160") 
    ) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setCqlVersion("3.0.0") 
     .setTargetCassandraVersion("1.2")) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    keyspace = context.getEntity(); 

    emp_cf = ColumnFamily.newColumnFamily(
     ModelConstants.COLUMN_FAMILY, 
     StringSerializer.get(), 
     StringSerializer.get()); 
} 

パフォーマンスを向上させるために上記のコードを変更する必要がありますか?

このメソッドは何をしますか?

setMaxConnsPerHost(1) 

は、私はパフォーマンスを向上させることを増やす必要がありますか?私は4つのノードを持っているので、それを4に変更する必要がありますか?

setMaxConns(20)メソッドは呼び出しますか?パフォーマンスを向上させるためにそれを追加する必要がありますか?私は複数のスレッドでプログラムを実行しています。 maxConnsPerHost/maxConnsの詳細については

答えて

9

あなたはこの答えを確認することがあります。setMaxConns and setMaxConnsPerHost in Astyanax client

そして、はい、maxConnsPerHostは良好な性能を達成するために増加しなければなりません。最適な値は、ネットワークトポロジ、要求レプリケーションファクタ、ストレージ構成、キャッシュ、読み取り/書き込みの比率などによって決まります。実験やシミュレーションを行わなくても負荷の高いクラスタでは最適なパフォーマンスを達成することはできません。

私は通常、経験則を使用カサンドラに適度な負荷とタスクの場合

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1 

で、複製因子3と8コアボックスのクラスタのために、maxConnsPerHostは約4この値である必要があります重い負荷のシナリオでの実験の出発点でもあります。

モチベーション:それぞれCコアを有するNノードのクラスタは、N * Cコアの合計を有する。レプリケーションファクタRで要求を処理するには、ノードが異なるRコアが必要です。したがって、クラスタはすべての瞬間にN * C/Rリクエストまで処理できます。同時接続数をこの数に保つことをお勧めします。 Nで割り、ホストあたりの接続数を計算します。ネットワークの待ち時間などのために、ホストごとに1つのスペア接続を追加します。それだけです。JXMが

  • 増加maxConnsPerHostpendingTasksまでの開始が急速に増加する属性をいくつかmaxConnsPerHost
  • シミュレート負荷と

    • スタートとCPUの使用状況を観察し、org.apache.cassandra.request->***Stage->pendingTasks

      更新:シンプルなクライアントのパフォーマンスチューニング。これはおそらく最適な値です。

    • クラスタノードのCPU負荷は約50〜70%にする必要があります。それがはるかに少ない場合、おそらくサーバーの設定に何か問題があります。
  • +0

    ありがとうございました。あなたの助けを感謝しました。 setMaxConnsはどうですか?それにはどんな価値がありますか?それを決めるのにどんな種類の論理が続くのか。 –

    +0

    @FarhanJamal:setMaxConnsはConnectionPoolType.BAGでのみ使用され、他の実装では無視されます。 BAG接続プールを使用する場合は、この属性をCassandraに同時に要求を送信するスレッドの最大数に設定することができます。 – Wildfire

    +0

    提案していただきありがとうございます。一般的にどんな接続プールを使うべきですか?つまり、接続プーリングを使用すると、より高速な読み取りパフォーマンスが得られます。現在、上記の例では、私は 'ConnectionPoolConfigurationImpl'を使用しています。あなたはそれについてもどんな勧告もありますか? –

    関連する問題