ablog

不器用で落着きのない技術者のメモ

Datastax Java Driver for Apache Cassandra でAmazon KeySpaces へのコネクションプールの数を設定する

Amazon KeySpaces は 1 コネクションあたりの CQL のスループットが 3,000 である。デフォルトでパブリックエンドポイントの場合 9 コネクションなので CQL のスループットは 27,000(=3,000 * 9)、VPC エンドポイントの場合はその VPC のサブネット(AZ)数のコネクションになる。例えば 2 サブネット(AZ)の場合の CQL のスループットは 6,000(=3,000 * 2) になる。

なお、1 つの control connection が別途張られる。

When the client driver is started, first the control connection is established for administrative tasks, such as for schema and topology changes. Then the additional connections are created.

In the following example, the local pool size driver configuration is specified as 2. If the VPC endpoint is created across 3 subnets within the VPC, this results in 7 NewConnections in CloudWatch for the interface endpoint, as shown in the following formula.

NewConnections = 3 (VPC subnet endpoints created across) * 2 (pool size) + 1 ( control connection)
Step 6: (Optional) Best practices to configure the connection pool size for your application - Amazon Keyspaces (for Apache Cassandra)

1 コネクションあたりの CQL のスループットが上限を超えているかどうかは CloudWatch メトリクス PerConnectionRequestRateExceeded で確認することができる。

CQL のスループットを上げたい場合はコネクション数を増やしてあげればよい。Datastax Java driver v3 の場合は接続処理のコードに以下の通り記述、Datastax Java driver v4 の場合は application.conf の advanced.connection - pool - local - size で設定する。

If you're using Datastax Java driver v3, then make sure that your cluster includes the following pooling options:

Cluster cluster =Cluster.builder()
        .addContactPoint("cassandra.ap-southeast-2.amazonaws.com")
        .withPort(9142)
        ...
        .withPoolingOptions(new PoolingOptions().setConnectionsPerHost(HostDistance.LOCAL,9,9))
        .build();

If you're using Datastax Java driver v4, then make sure that application.conf includes the following:

datastax-java-driver {  
    advanced.connection {    
        pool {      
            local {        
                size = 9      
            }    
        }  
    }
}
Troubleshoot timeout exceptions in Amazon Keyspaces | AWS re:Post

以下は Datastax Java driver v4 で実際にコネクション数を確認した結果。Amazon Keyspaces を使ってみる - ablog のコードをベースに1分間 sleep する処理を追記して、netstat でコネクション数を確認した。

  • keySpacesTest/src/main/java/com/keySpacesTest/App.java
package com.keySpacesTest;

import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import com.datastax.oss.driver.api.core.cql.BatchStatement;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
import com.datastax.oss.driver.api.core.cql.DefaultBatchType;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Start to insert 2 rows into Amazon KeySpaces ..." );

        DriverConfigLoader loader = DriverConfigLoader.fromClasspath("application.conf");
        try (CqlSession session = CqlSession.builder()
                .withConfigLoader(loader)
                .build()) {

            try {
                Thread.sleep(60000);
            } catch(InterruptedException e){
                e.printStackTrace();
            }    

            PreparedStatement prepared = session.prepare("insert into tutorialkeyspace.tutorialtable(age, name, email) values (?, ?, ?)");
            BatchStatement batch = BatchStatement.newInstance(DefaultBatchType.UNLOGGED, 
                prepared.bind(28,"Oyama","yusuke@oyama.jp"),
                prepared.bind(29,"Otani","shohei@otani.com")
            );
            session.execute(batch);
        }
        System.out.println( "Finished successfully!" );

    }
}
  • keySpacesTest/src/main/resources/application.conf
datastax-java-driver {

    basic.contact-points = [ "cassandra.ap-northeast-1.amazonaws.com:9142"]
    advanced.auth-provider{
        class = PlainTextAuthProvider
        username = "keyspaces_user+1-at-123456789012"
        password = "**********"
    }
    basic.load-balancing-policy {
        local-datacenter = "ap-northeast-1"
        slow-replica-avoidance = false           
    }

    advanced.ssl-engine-factory {
        class = DefaultSslEngineFactory
        truststore-path = "./src/main/resources/cassandra_truststore.jks"
        truststore-password = "********"
        hostname-validation = false
      }

      basic.request {
            consistency = LOCAL_QUORUM
      }

}

パブリックエンドポイント

デフォルト
  • 1 つの control connection と9 つのコネクションプーリングが張られる。
$ java -jar target/keySpacesTest-1.0-SNAPSHOT.jar 
$ netstat -tpW|grep cassandra.ap-northeast-1
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:45648 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:34640 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53072 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:52826 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:50658 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:50448 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:52862 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:40740 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:41938 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:50452 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:59404 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 31799/java
application.conf の advanced.connection - pool - local - size: 2
  • application.conf に以下を追記。
    advanced.connection {    
        pool {      
            local {        
                size = 9      
            }    
        }  
    }
  • 1 つの control connection と20 のコネクションプーリングが張られる。
$ netstat -tpW|grep cassandra.ap-northeast-1
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:48482 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39758 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:40946 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39578 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:58922 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:48490 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:45546 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:40948 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:37778 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:35422 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:37788 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:33472 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:58932 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:46332 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:35438 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39772 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:33474 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39576 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:45538 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:33456 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:46326 cassandra.ap-northeast-1.amazonaws.com:9142 ESTABLISHED 48455/java          

VPCエンドポイント

デフォルト
  • 1 つの control connection と2 つ(サブネット=AZ の数)のコネクションプーリングが張られる。
$ java -jar target/keySpacesTest-1.0-SNAPSHOT.jar 
$ netstat -tpW|grep :9142
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:33112 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 43154/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:33106 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 43154/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:50604 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 43154/java          
application.conf の advanced.connection - pool - local - size: 9
  • application.conf に以下を追記。
    advanced.connection {    
        pool {      
            local {        
                size = 9      
            }    
        }  
    }
  • 1 つの control connection と18 (サブネット=AZの数 * 9)のコネクションプーリングが張られる。
$ java -jar target/keySpacesTest-1.0-SNAPSHOT.jar 
$ netstat -tpW|grep :9142
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53716 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39964 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39946 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53674 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53648 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39934 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39938 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53700 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:40006 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39996 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53634 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39970 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39974 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39982 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53696 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:39948 ip-172-17-1-235.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53660 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53686 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java          
tcp6       0      0 ip-172-17-3-232.ap-northeast-1.compute.internal:53694 ip-172-17-3-205.ap-northeast-1.compute.internal:9142 ESTABLISHED 44735/java