2016-09-10 5 views
0

スケーラビリティカサンドラデータベースに問題があります。ノード数が2から8に増えても、データベースのパフォーマンスは向上しません。カサンドラスケーラビリティの欠如

Cassandra Version: 3.7 
Cassandra Hardware x8: 1vCPU 2.5 Ghz, 900 MB RAM, SSD DISK 20GB, 10 Gbps LAN 
Benchmark Hardware x1: 16vCPU 2.5 GHz, 8 GB RAM, SSD DISK 5GB, 10 Gbps LAN 

デフォルト設定はcassandra.yamlで変更された:

cluster_name: 'tst' 
seeds: "192.168.0.101,192.168.0.102,...108" 
listen_address: 192.168.0.xxx 
endpoint_snitch: GossipingPropertyFileSnitch 
rpc_address: 192.168.0.xxx 
concurrent_reads: 8 
concurrent_writes: 8 
concurrent_counter_writes: 8 

鍵空間:

create keyspace tst WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '2' }; 

例表:試験に使用

CREATE TABLE shares (
    c1 int PRIMARY KEY, 
    c2 varchar, 
    c3 int, 
    c4 int, 
    c5 int, 
    c6 varchar, 
    c7 int 
); 

Examplaryクエリ:

INSERT INTO shares (c1, c1, c3, c4, c5, c6, c7) VALUES (%s, '%s', %s, %s, %s, '%s', %s) 

私はhttps://github.com/datastax/java-driverを使用します。マルチスレッドでは、クラスタオブジェクトとセッションオブジェクトのいずれかを命令に従って使用します。接続:

PoolingOptions poolingOptions = new PoolingOptions(); 
poolingOptions.setConnectionsPerHost(HostDistance.LOCAL, 5, 300); 
poolingOptions.setCoreConnectionsPerHost(HostDistance.LOCAL, 10); 
poolingOptions.setPoolTimeoutMillis(5000); 
QueryOptions queryOptions = new QueryOptions(); 
queryOptions.setConsistencyLevel(ConsistencyLevel.QUORUM); 

Builder builder = Cluster.builder(); 
builder.withPoolingOptions(poolingOptions); 
builder.withQueryOptions(queryOptions); 
builder.withLoadBalancingPolicy(new RoundRobinPolicy()); 
this.setPoints(builder); // here all of the nodes are added 
Cluster cluster = builder.build() 

クエリのコード:

public ResultSet execute(String query) { 
ResultSet result = this.session.execute(query); 
return result; 
} 

試験作業中、すべてのノード上のメモリを使用して80%、およびCPU 100%です。私はモニターに接続を使用して驚いています(低すぎる):モニターの

[2016-09-10 09:39:51.537] /192.168.0.102:9042 connections=10, current load=62, max load=10240 
[2016-09-10 09:39:51.556] /192.168.0.103:9042 connections=10, current load=106, max load=10240 
[2016-09-10 09:39:51.556] /192.168.0.104:9042 connections=10, current load=104, max load=10240 
[2016-09-10 09:39:51.556] /192.168.0.101:9042 connections=10, current load=196, max load=10240 
[2016-09-10 09:39:56.467] /192.168.0.102:9042 connections=10, current load=109, max load=10240 
[2016-09-10 09:39:56.467] /192.168.0.103:9042 connections=10, current load=107, max load=10240 
[2016-09-10 09:39:56.467] /192.168.0.104:9042 connections=10, current load=115, max load=10240 
[2016-09-10 09:39:56.468] /192.168.0.101:9042 connections=10, current load=169, max load=10240 
[2016-09-10 09:40:01.468] /192.168.0.102:9042 connections=10, current load=113, max load=10240 
[2016-09-10 09:40:01.468] /192.168.0.103:9042 connections=10, current load=84, max load=10240 
[2016-09-10 09:40:01.468] /192.168.0.104:9042 connections=10, current load=92, max load=10240 
[2016-09-10 09:40:01.469] /192.168.0.101:9042 connections=10, current load=205, max load=10240 

コード:https://github.com/datastax/java-driver/tree/3.0/manual/pooling#monitoring-and-tuning-the-pool

私はいくつかのNoSQLデータベースのスケーラビリティをテストしようとしています。 Redisベースの場合、それは線形スケーラビリティでしたが、ここではまったくではありません。理由はわかりません。ご協力いただきありがとうございます!

+0

パーティションキーにはどのような種類の値がありますか?データはどれくらいうまく分配されていますか?カッサンドラは主キーのハッシュを計算してデータを配信します。すべてのデータに少数のPK値がある場合、使用するサーバーの数は関係ありません。 – riwalk

答えて

3

各マシンの1GB RAMは非常に低いターゲットです。これは、あまりにも多くのGC圧力を引き起こす可能性があります。ログをチェックしてGCの動作を確認し、この100%のCPU上限がJVM GCによるものであるかどうかを理解してください。

もう1つの特徴:各マシンでいくつのスレッドを実行していますか?あなたはこのコード(あなたのコード)に拡張しようとしている場合は、次のクエリの

コード:

public ResultSet execute(String query) { 
ResultSet result = this.session.execute(query); 
return result; 
} 

を、あなたは非常に遠くに行くことはありません。同期クエリは絶望的に遅いです。もっと多くのスレッドを使用しようとしても、1GBのRAMが(おそらくそれは...)低すぎるかもしれません...リソース消費とスケーラビリティの両方のために、おそらく非同期クエリを書くべきです。

+0

ありがとう!私はベンチマークで1000スレッドを使用します。私が非同期的に接続を使用する場合、時間の一部でquerysの値をチェックする方法は? – Sannin

+0

1000スレッドが多すぎるかもしれません... 2xのvCPUスレッド(あなたの場合は32スレッド)にスティックし、非同期ルートに行きます。後でそれらを増やします。通常、あなたは 'ResultSetFuture'未来オブジェクトのリストを収集します。**あなたの**最大数の機内クエリ(最初に1000にする)を収集すると、それらのすべてが終了するまで待つので、背圧をかけることもありますし、クラスタをストレス下に置くこともありません。先物にコールバックを登録することもできますあなたがそのスタイルを好む場合。例としてhttp://www.datastax.com/dev/blog/java-driver-async-queriesを参照してください。 – xmas79

関連する問題