簡體   English   中英

Astyanax客戶端每個節點的最大連接數?

[英]Astyanax client maximum connections per node?

我正在使用Astyanax客戶端從Cassandra數據庫中讀取數據。

我在Cassandra數據庫中有大約一百萬個唯一行。 我有一個包含四個節點的交叉主機托管集群。

這些是我的四個節點:

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

我啟用了KeyCaching,並且還啟用了SizeTieredCompaction策略。

我有一個多線程的客戶端程序,它將使用Astyanax客戶端從Cassandra數據庫讀取數據,並且我運行20個線程。 如果我使用20個線程運行我的客戶端程序,那么從Cassandra數據庫讀取數據的性能會降低。

因此,我想到的第一件事就是可能存在與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?

並且setMaxConns(20)方法會調用嗎? 我是否還需要添加它以提高性能? 因為我將用多個線程運行我的程序。

有關maxConnsPerHost / maxConns詳細信息您可以在Astyanax客戶端中查看以下答案: setMaxConns和setMaxConnsPerHost

是的,應該增加maxConnsPerHost以獲得良好的性能。 最佳值取決於網絡拓撲,請求復制因子,存儲配置,緩存,讀/寫比率等。

如果沒有實驗和模擬,我認為沒有可能為重載集群實現最佳性能。

對於Cassandra中等負荷的任務,我通常使用經驗法則:

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

也就是說,對於具有復制因子3的8核盒的集群, maxConnsPerHost應該在4左右。該值也是重載場景中的實驗的良好起點。

動機:每個具有C核的N節點的集群總共具有N * C核。 要處理具有復制因子R請求,需要R核心(不同節點)。 因此,在每個給定時刻,集群都可以處理多達N * C / R請求。 保持此數字周圍的並發連接數是個好主意。 將其除以N以計算每個主機的連接數。 為每個主機添加1個備用連接以用於網絡延遲等。就是這樣。

更新:簡單的客戶端性能調整:

  • 從一些maxConnsPerHost值開始
  • 模擬加載並觀察CPU使用情況和org.apache.cassandra.request->***Stage->pendingTasks屬性
  • 增加maxConnsPerHost直到pendingTasks開始快速增加。 這可能是最佳值。
  • 群集節點上的CPU負載應該在50-70%左右。 如果它少得多 - 服務器配置可能有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM