cassandra-stressツール

Cassandraクラスターの基本的なベンチマークおよび負荷テスト用のJavaベースのストレス・テスト・ユーティリティ。

cassandra-stressツールは、Cassandraクラスターの基本的なベンチマークおよび負荷テスト用のJavaベースのストレス・テスト・ユーティリティです。

アプリケーションをデータ・モデリングするときの選択により、アプリケーションのパフォーマンスに大きな違いが生まれます。最高のデータ・モデルを作成するには、大量の負荷テストを複数回繰り返す必要があります。cassandra-stressツールは、クラスターに追加し、任意のCQLテーブルおよびテーブル上の任意のクエリーのストレス・テストをサポートすることで、この作業の負荷を軽減します。cassandra-stressを使用することで以下のことが可能です。
  • スキーマの動作をすばやく確認する。
  • データベースのスケール動作を理解する。
  • データ・モデルと設定を最適化する。
  • 実稼働キャパシティを確認する。
注: このツールは、Cassandra 2.0以降のクラスターで動作します。
cassandra-stressツールは、コンパクション・ストラテジ、キャッシュ設定、タイプの可能性のある特定のスキーマを定義するためのYAMLベースのプロファイルもサポートします。サンプル・ファイルの場所:
  • パッケージ・インストール: /usr/share/docs/cassandra/examples
  • tarボール・インストール: install_location/tools/

cassandra-stressツールは、keyspace1というキースペースを作成し、その中に、テストしているテーブル・タイプに応じて、standard1またはcounter1という名前のテーブルを作成します。これらはストレス・テストを最初に実行したときに自動的に作成され、CQLを使用してキースペースを削除しない限り、その後の実行で再利用されます。名前はハードコードされており、変更することはできません。

使用法:
  • パッケージ・インストール:
    /usr/bin/cassandra-stress コマンド [オプション]
  • tarボール・インストール:
    cd インストール場所/tools
    $ bin/cassandra-stress コマンド [オプション]

tarボール・インストールでは、cassandra-stress daemonが実行されているかどうかに関係なく、以下のコマンドおよびオプションを使用できます。

コマンド 説明
read 複数の同時読み取り。まずwriteテストでクラスターにデータを追加する必要があります。
write クラスターへの複数の同時書き込み。
mixed 比率と分散が構成可能なインターリーブ基本コマンド。まずwriteテストでクラスターにデータを追加する必要があります。
counter_write カウンターの複数同時更新。
counter_read カウンターの複数同時読み取り。まずcounter_writeテストでクラスターにデータを追加する必要があります。
user 比率と分散が構成可能なインターリーブ・ユーザー提供クエリー。
help

コマンドまたはオプションのヘルプを表示します。
オプションのヘルプを表示します。cassandra-stress help [オプション] 例:cassandra-stress help -schema

print ディストリビューション定義の出力を検査します。
legacy レガシー・サポート・モード。
重要: 以下のテーブルでは、各オプションに追加のサブオプションが使用できます。形式:
$ cassandra-stress help オプション

たとえば、View schema helpを参照してください。

オプション 説明
-pop 母集団分散およびパーティション間の訪問順序。
使用法
$ -pop seq=?[no-wrap] [read-lookback=DIST(?)] [contents=?]
または
$ -pop [dist=DIST(?)] [contents=?]
-insert パーティション更新をバッチ化および分割するさまざまな方法に関する特定のオプションを挿入します。
使用法
$ -col [n=DIST(?)] [slice] [super=?][comparator=?][timestamp=?][size=DIST(?)]
-col サイズ、カウント分散、データ・ジェネレーター、名前、コンパレーターなどのカラム詳細情報。
使用法
$ -col [n=DIST(?)] [slice] [super=?][comparator=?][timestamp=?][size=DIST(?)]
-rate スレッド・カウント、レート制限、または自動モード(デフォルトは自動)
使用法
$ -rate threads=?[limit=?]
または 
$ -rate [threads>=?][threads<=?][auto]
-mode Thriftまたはオプション付きCQL
使用法
$ -mode thrift [smart] [user=?][password=?]
または 
$ -mode native [unprepared] cql3 [compression=?][port=?][user=?][password=?]
または
$ -mode simplenative [prepared] cql3 [port=?]
-errors ストレス時に発生したエラーの対処方法。
使用法
$ -errors [retries=?][ignore]
-sample レイテンシー測定時に収集するサンプルの数を指定します。
使用法
$ -sample [history=?][live=?][report=?]
-schema レプリケーション設定、圧縮、コンパクションなど。
使用法
$ -schema [replication(?)] [keyspace=?][compaction(?)] [compression=?]
-node 接続先のノード。
使用法
$ -node [whitelist] [file=?] []
-log 進行状況および使用間隔のログを記録しておく場所。
使用法
$ -log [level=?][no-summary] [file=?][interval=?]
-transport カスタム・トランスポート・ファクトリ。
使用法
$ -transport [factory=?][truststore=?][truststore-password=?][ssl-protocol=?][ssl-alg=?][store-type=?][ssl-ciphers=?]
-port Cassandraノードを接続するポートを指定します。
使用法
$ -port [native=?][thrift=?][jmx=?]
-sendto このコマンドの送信先となるストレス・サーバーを指定します。
使用法
$ -sendToDaemon <host>

Cassandra 2.1.5以降では、この他に以下のオプションがあります。

コマンド 説明
profile=? cassandra-stressとともに使用するYAMLファイルを指定します。
ops(?) 実行する操作(挿入および/またはクエリー)とそれぞれの頻度。
clustering=DIST(?) 同じ種類の操作の分散クラスター実行。
err<? 平均の標準誤差を指定します。この値に到達すると、cassandra-stressは終了します。デフォルトは0.02です。
n>? 不確定収束を受け入れる前に実行する最小実行回数を指定します。
n<? 不確定収束を受け入れる前に実行する最大実行回数を指定します。
n=? 実行する操作回数を指定します。
duration=? 実行する時間を秒、分、または時間で指定します。
no-warmup プロセスをウォームアップせずにコールド・スタートを実行します。
truncate=? cassandra-stress時に作成されたテーブルを切り詰めます。オプションは、never、once、またはalwaysです。デフォルトはneverです。
cl=? cassandra-stress時に使用する整合性レベルを設定します。ONE、QUORUM、LOCAL_QUORUM、EACH_QUORUM、ALL、ANYのオプションがあります。デフォルトはLOCAL_ONEです。

単純な読み取りおよび書き込みの例

$ cassandra-stress write n=1000000

100万行を挿入(書き込み)します。

$ cassandra-stress read n=200000

20万行を読み取ります。

$ cassandra-stress read duration=3m

3分間、行を読み取ります。

$ cassandra-stress read n=200000 no-warmup

最初に50,000行のウォームアップをせずに200,000行を読み取ります。

スキーマ・ヘルプの表示 

$ cassandra-stress help -schema
replication([strategy=?][factor=?][<option 1..N>=?]):Define the replication strategy and any parameters strategy=?(default=org.apache.cassandra.locator.SimpleStrategy) The replication strategy to use factor=?(default=1) The number of replicas keyspace=?(default=keyspace1) The keyspace name to use compaction([strategy=?][<option 1..N>=?]):Define the compaction strategy and any parameters strategy=?The compaction strategy to use compression=?Specify the compression to use for SSTable, default:no compression

データベースにデータを追加する 

一般的には、cassandra-stressで作成した基本スキーマをCQLで編集します。

#デフォルトのスキーマで1行を読み込む
$ cassandra-stress write n=1 cl=one -mode native cql3 -log file=~/create_schema.log
 
#CQLでスキーマを編集する
$ cqlsh
 
#実際の書き込みワークロードを実行する
$ cassandra-stress write n=1000000 cl=one -mode native cql3 -schema keyspace="keyspace1" -log file=~/load_1M_rows.log

混在ワークロードを実行する 

混在ワークロードを実行するときは、丸かっこ、不等号などの記号をエスケープさせる必要があります。この例では、1/4が書き込みで3/4が読み取りのワークロードを呼び出します。

$ cassandra-stress mixed ratio\(write=1,read=3\) n=100000 cl=ONE -pop dist=UNIFORM\(1..1000000\) -schema keyspace="keyspace1" -mode native cql3 -rate threads\>=16 threads\<=256 -log file=~/mixed_autorate_50r50w_1M.log

この例で以下のことに注目してください。

  1. ratio では、バックスラッシュを使用して丸かっこをエスケープさせる必要があります。
  2. nの値は、書き込みフェーズとは異なります。書き込みフェーズでは、n個のレコードが書き込まれます。しかし、読み取りフェーズでは、nが大きすぎると、単純なテストですべてのレコードを読み取るのが不便になります。一般的に、クラスターの永続的な格納システムを検証するときには、nは大きくする必要はありません。

    -pop dist=UNIFORM\(1..1000000\)セクションは、n=100,000回の操作のうち、1と1,000,000の間で均等に分散しているキーを選択するという意味です。ノードあたりDRAMに入りきらない量のデータを指定したい場合にこれを使用します。

  3. rateセクションでは、不等号記号をエスケープさせています。エスケープさせない場合、シェルはその記号をIOリダイレクトに使用しようとします。具体的には、シェルは存在しない=256というファイルからデータを読み取って、=16というファイルを作成しようとします。rateセクションは、cassandra-stressに自動的に異なる数のクライアント・スレッドをテストし、16未満または256を超えるクライアント・スレッドをテストしないように指示してします。

単一ノード用の標準的な混在する読み取り/書き込みワークロード・キースペース 

CREATE KEYSPACE "keyspace1" WITH replication = { 'class':'SimpleStrategy', 'replication_factor' :'1' }; USE "keyspace1"; CREATE TABLE "standard1" ( key blob, "C0" blob, "C1" blob, "C2" blob, "C3" blob, "C4" blob, PRIMARY KEY (key) ) WITH bloom_filter_fp_chance=0.010000 AND caching='KEYS_ONLY' AND comment='' AND dclocal_read_repair_chance=0.000000 AND gc_grace_seconds=864000 AND index_interval=128 AND read_repair_chance=0.100000 AND replicate_on_write='true' AND default_time_to_live=0 AND speculative_retry='99.0PERCENTILE' AND memtable_flush_period_in_ms=0 AND compaction={'class':'SizeTieredCompactionStrategy'} AND compression={'class':'LZ4Compressor' };

異なるノード上の複数のcassandra-stressインスタンスに負荷を分散させる

この例は、1つのcassandra-stress負荷ジェネレーター・ノードがクラスターを飽和させない程度の大きさの負荷でクラスターに読み込む場合に便利です。この例では、$NODESは10.0.0.1,10.0.0.2のようにIPアドレスのリストをコンマで区切った値を持つ変数です。

# Node1で実行する
$$ cassandra-stress write n=1000000 cl=one -mode native cql3 -schema keyspace="keyspace1" -pop seq=1..1000000 -log file=~/node1_load.log -node $NODES
 
# Node2で実行する
$ cassandra-stress write n=1000000 cl=one -mode native cql3 -schema keyspace="keyspace1" -pop seq=1000001..2000000 -log file=~/node2_load.log -node $NODES

YAMLファイルを使用してcassandra-stressを実行する

この例では、クエリー定義にだけでなく、キースペースとテーブルの定義にもYAMLファイルを使用します。simple1として定義されている操作は、一度だけ実行されます。 ウォームアップは指定せず、整合性レベルはQUORUMに設定します。

$ cassandra-stress user profile=tools/cqlstress-example.yaml ops\(simple1=1\) no-warmup cl=QUORUM

これらのサンプル・ファイルの詳しい説明は、Improved Cassandra 2.1 Stress Tool: Benchmark Any Schema – Part 1を参照してください。