ぺーぺーSEのブログ

備忘録・メモ用サイト。

YCSBでCouchbaseにアクセスしてみる

YCSB(Yahoo Cloud Serving Benchmark)はデータベースの性能検証用のツール

News: Yahoo Cloud Serving Benchmark
http://labs.yahoo.com/news/yahoo-cloud-serving-benchmark/

Githubでいろんなのが公開されてる。(brianfrankcooperってのが公式くさい?)

brianfrankcooper/YCSB
https://github.com/brianfrankcooper/YCSB

thumbtack-technology/ycsb
https://github.com/thumbtack-technology/ycsb

Altoros/YCSB
https://github.com/Altoros/YCSB

今回は2014/05/12時点の「Altoros/YCSB」で試してみる。

環境

特に2014/05/12時点の最新とかにしてないのでご注意を。

実行までの手順

クライアント側だけ書く。

YCSB
|-- README.md
`-- src/
    |-- bin/
    |-- cassandra/
    |-- core/              # 今回使うところ
    |-- couchbase-1.8/
    |-- couchbase-2.0/     # 今回使うところ
    |-- hbase/
    |-- jdbc/
    |-- memcached/         # 今回使うところ
    |-- mongodb/
    |-- mysql-cluster/
    |-- mysql-sharded/
    |-- riak/
    `-- pom.xml
  • 「C:\github\YCSB\src\core\pom.xml」を下記のように編集。
    • parent設定の「..」をコメントアウト
      • ※子プロジェクトによって「..」があったりなかったりして参照がうまくいかなかった。
      • ※なので、「..」を全て削除する方向に。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.yahoo.ycsb</groupId>
        <artifactId>root</artifactId>
        <version>1.0</version>
        <!-- ここをコメントアウト -->
        <!-- <relativePath>..</relativePath> -->
    </parent>

    <name>ycsb</name>

    <artifactId>core</artifactId>

    <version>1.0</version>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
<!-- 以下、省略 -->
  • 「C:\github\YCSB\src」へcdして「mvn install」を実行。
    • 「BUILD SUCCESS」が出てればおk。
  • 「C:\github\YCSB\src\couchbase-2.0\workloads\a.workload」を下記のように修正。
<!-- 以上、省略 -->
db=com.yahoo.ycsb.couchbase.CouchbaseClient2_0
couchbase.hosts=<!-- ホスト名なり、IPを記述。複数あればカンマ区切り。 -->
couchbase.bucket=<!-- バケット名を記述。 -->
couchbase.user=
couchbase.password=<!-- バケットのパスワードを記述。 -->
couchbase.checkOperationStatus=true<!-- ←この行追記 -->
couchbase.timeout=60000
table=ut
<!-- 以下、省略 -->
  • 「C:\github\YCSB\src\couchbase-2.0」へcdして「mvn test -P couchbase-2.0.0-a.workload」を実行。

以下のような結果が得られる。

[OVERALL], RunTime(ms), 14149.0
[OVERALL], Throughput(ops/sec), 706.7637288854336
[UPDATE], Operations, 4994
[UPDATE], AverageLatency(us), 17009.633960752904
[UPDATE], MinLatency(us), 479
[UPDATE], MaxLatency(us), 110833
[UPDATE], 95thPercentileLatency(us), 33425.0
[UPDATE], 99thPercentileLatency(us), 53266.333333333336
[UPDATE], Return=-1, 4994
[UPDATE], 0, 31
[UPDATE], 1, 54
[UPDATE], 2, 42
[UPDATE], 3, 38
[UPDATE], 4, 49
[UPDATE], 5, 73
[UPDATE], 6, 96
[UPDATE], 7, 185
[UPDATE], 8, 305
[UPDATE], 9, 284
[UPDATE], 10, 293
[UPDATE], 11, 255
[UPDATE], 12, 211
[UPDATE], 13, 241
[UPDATE], 14, 264
[UPDATE], 15, 297
[UPDATE], 16, 228
[UPDATE], 17, 212
[UPDATE], 18, 205
[UPDATE], 19, 178
[UPDATE], 20, 177
[UPDATE], 21, 161
[UPDATE], 22, 118
[UPDATE], 23, 134
[UPDATE], 24, 106
[UPDATE], 25, 80
[UPDATE], 26, 90
[UPDATE], 27, 77
[UPDATE], 28, 59
[UPDATE], 29, 70
[UPDATE], 30, 41
[UPDATE], 31, 33
[UPDATE], 32, 43
[UPDATE], 33, 32
[UPDATE], 34, 29
[UPDATE], 35, 19
[UPDATE], 36, 25
[UPDATE], 37, 16
[UPDATE], 38, 12
[UPDATE], 39, 12
[UPDATE], 40, 7
[UPDATE], 41, 9
[UPDATE], 42, 5
[UPDATE], 43, 9
[UPDATE], 44, 3
[UPDATE], 45, 7
[UPDATE], 46, 8
[UPDATE], 47, 4
[UPDATE], 48, 4
[UPDATE], 49, 3
[UPDATE], 50, 4
[UPDATE], 51, 3
[UPDATE], 52, 3
[UPDATE], 53, 3
[UPDATE], 54, 2
[UPDATE], 55, 1
[UPDATE], 56, 4
[UPDATE], 58, 1
[UPDATE], 60, 2
[UPDATE], 61, 1
[UPDATE], 62, 1
[UPDATE], 63, 1
[UPDATE], 64, 2
[UPDATE], 65, 2
[UPDATE], 66, 1
[UPDATE], 69, 1
[UPDATE], 70, 1
[UPDATE], 73, 1
[UPDATE], 75, 1
[UPDATE], 77, 1
[UPDATE], 78, 1
[UPDATE], 79, 1
[UPDATE], 80, 2
[UPDATE], 81, 1
[UPDATE], 83, 1
[UPDATE], 85, 1
[UPDATE], 87, 1
[UPDATE], 88, 1
[UPDATE], 89, 1
[UPDATE], 92, 1
[UPDATE], 93, 2
[UPDATE], 94, 1
[UPDATE], 95, 1
[UPDATE], 98, 3
[UPDATE], 99, 1
[UPDATE], 100, 2
[UPDATE], 103, 2
[UPDATE], 110, 1
[UPDATE], >1000, 0
[READ], Operations, 5006
[READ], AverageLatency(us), 16580.602477027565
[READ], MinLatency(us), 430
[READ], MaxLatency(us), 116962
[READ], 95thPercentileLatency(us), 33465.84210526316
[READ], 99thPercentileLatency(us), 52688.0
[READ], Return=0, 5006
[READ], 0, 40
[READ], 1, 77
[READ], 2, 33
[READ], 3, 32
[READ], 4, 50
[READ], 5, 67
[READ], 6, 110
[READ], 7, 231
[READ], 8, 323
[READ], 9, 304
[READ], 10, 257
[READ], 11, 286
[READ], 12, 234
[READ], 13, 265
[READ], 14, 265
[READ], 15, 263
[READ], 16, 250
[READ], 17, 191
[READ], 18, 165
[READ], 19, 156
[READ], 20, 172
[READ], 21, 145
[READ], 22, 120
[READ], 23, 119
[READ], 24, 97
[READ], 25, 91
[READ], 26, 79
[READ], 27, 75
[READ], 28, 61
[READ], 29, 67
[READ], 30, 47
[READ], 31, 51
[READ], 32, 28
[READ], 33, 19
[READ], 34, 31
[READ], 35, 16
[READ], 36, 17
[READ], 37, 22
[READ], 38, 17
[READ], 39, 7
[READ], 40, 9
[READ], 41, 5
[READ], 42, 8
[READ], 43, 4
[READ], 44, 11
[READ], 45, 9
[READ], 46, 9
[READ], 47, 6
[READ], 48, 6
[READ], 49, 3
[READ], 50, 1
[READ], 51, 1
[READ], 52, 4
[READ], 53, 2
[READ], 54, 5
[READ], 55, 4
[READ], 56, 4
[READ], 57, 2
[READ], 58, 2
[READ], 59, 3
[READ], 60, 2
[READ], 62, 1
[READ], 63, 1
[READ], 65, 1
[READ], 66, 3
[READ], 67, 2
[READ], 68, 5
[READ], 69, 1
[READ], 70, 1
[READ], 72, 2
[READ], 75, 1
[READ], 76, 2
[READ], 80, 1
[READ], 81, 1
[READ], 85, 1
[READ], 86, 1
[READ], 96, 1
[READ], 116, 1
[READ], >1000, 0
14 sec: 10000 operations; 1183 current ops/sec; [UPDATE AverageLatency(us)=15545.9] [READ AverageLatency(us)=15322.05]

実行および結果の見方については以下を参照。
https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload
※ただし、「brianfrankcooper/YCSB」の情報。


workloadの設定

a.workload等のworkload設定ファイルの記載について書く。
「brianfrankcooper/YCSB」のwikiを主な参考に記載している。
どこまで「thumbtack-technology/ycsb」や「Altoros/YCSB」に対応しているかは不明。

■workloadのコアプロパティ
  • fieldcount
    • レコードのフィールド数(default: 10)
  • fieldlength
    • フィールド長(default: 100)
  • readallfields
    • readの際、全フィールドを読み込む(true)か、1フィールドのみ読み込む(false) (default: true)
  • readproportion
    • オペレーション中のreadの割合 (default: 0.95)
  • updateproportion
    • オペレーション中のupdateの割合 (default: 0.05)
  • insertproportion
    • オペレーション中のinsertの割合 (default: 0)
  • scanproportion
    • オペレーション中のscanの割合 (default: 0)
  • readmodifywriteproportion
    • オペレーション中で「レコードの読込(read)」->「変更(modify)」->「変更の反映(write)」の一連の動作の割合 (default: 0)
  • requestdistribution
    • what distribution should be used to select the records to operate on – uniform, zipfian or latest (default: uniform)
  • maxscanlength
    • scanの際の最大取得レコード数 (default: 1000)
  • scanlengthdistribution
    • for scans, what distribution should be used to choose the number of records to scan, for each scan, between 1 and maxscanlength (default: uniform)
  • insertorder
    • should records be inserted in order by key (“ordered”), or in hashed order (“hashed”) (default: hashed)
  • operationcount
    • operationを実行する回数
  • maxexecutiontime
    • Maximum execution time in seconds. The benchmark runs until either the operation count has exhausted or the maximum specified time has elapsed, whichever is earlier.
  • table
    • テーブル名(default: usertable)
      • Couchbaseの場合はDocumentIDのプレフィックスになる


■DB interface layerの設定
  • db
    • HBaseClient
      • db=com.yahoo.ycsb.db.HBaseClient
    • Cassandra
      • db=com.yahoo.ycsb.db.CassandraClientX(「X」には5か6か7を記載し、それぞれバージョン0.5、0.6、0.7の意)
    • MongoDB
      • db=com.yahoo.ycsb.db.MongoDbClient
    • DynamoDB
      • db=com.yahoo.ycsb.db.DynamoDBClient
    • CouchbaseClient2.0
      • db=com.yahoo.ycsb.couchbase.CouchbaseClient2_0

DB interface layerの拡張については以下を参照。
https://github.com/brianfrankcooper/YCSB/wiki/Adding-a-Database

■workloadの実装クラスの設定

基本的には以下のように設定。

workload=com.yahoo.ycsb.workloads.CoreWorkload

拡張については以下を参照。
https://github.com/brianfrankcooper/YCSB/wiki/Implementing-New-Workloads
また、workloadの並列実行については以下を参照。
https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload-in-Parallel

■CouchbaseClientの設定
  • couchbase.hosts
    • Couchbase Serverのホスト名、もしくはIP。複数ある場合はカンマ区切り。
  • couchbase.bucket
    • バケット名。(デフォルト:default)
  • couchbase.user
    • Couchbase Serverへアクセスする際のユーザ名。なくてもいいっぽい。
  • couchbase.password
    • Couchbase Serverへアクセスする際のユーザ名。バケットのパスワードを設定したらOKだった。
  • couchbase.shutdownTimeoutMillis
    • CouchbaseClientをshutdownする際のタイムアウト値。(デフォルト:30000)
  • couchbase.objectExpirationTime
    • insert/setするドキュメントの生存時間。登録/更新/touchしてからこの時間経過するとドキュメントは消失する。(デフォルト:Integer.MAX_VALUE)
  • couchbase.checkOperationStatus
    • オペレーションの結果が返ってくるのを待って、成功か失敗をチェックするか否か。(デフォルト:true)
  • couchbase.opTimeout
  • couchbase.timeout
    • こんな設定は見当たらない。couchbase.opTimeoutのことじゃねーの。
  • couchbase.readBufferSize
    • Readバッファサイズ。(デフォルト:16384)
  • couchbase.failureMode
    • オペレーションがエラーだった際の挙動の設定。(デフォルト:FailureMode.Redistribute)
    • FailureMode.Cancel
      • ダウンしたnodeへのオペレーションが全てキャンセルされる。
    • FailureMode.Redistribute
      • 他の機能しているnodeへ処理が移る。
    • FailureMode.Retry
      • ダウンしたと思われるnodeが復旧するまでリトライする。

「brianfrankcooper/YCSB」には記載がなく、「Altoros/YCSB」のworkloadに設定されていたものは以下。

#requestdistribution=slidinghotspot
#hotspotslidingspeed=2
#hotspotdatafraction=0.2
#hotspotoperationfraction=0.97

threadcount=20
recordcount=100000000

気が向いたら調べて書く。


その他の話題、調べてみたこと

insertされてるデータはどんなの?

はたしてどんなデータが登録されているのか?
こんな

db=com.yahoo.ycsb.couchbase.CouchbaseClient2_0
couchbase.hosts=<!-- ホスト名なり、IPを記述。複数あればカンマ区切り。 -->
couchbase.bucket=hoge
couchbase.user=
couchbase.password=hoge
couchbase.checkOperationStatus=true
couchbase.timeout=60000
table=ut

fieldcount=5
fieldlength=10
threadcount=20
operationcount=10
recordcount=100
workload=com.yahoo.ycsb.workloads.CoreWorkload

readallfields=true

readproportion=0
updateproportion=0
scanproportion=0
insertproportion=1

requestdistribution=zipfian

設定のworkloadでデータをinsertしてから任意のドキュメントを1つgetしてみたら、こんな

{
  "field4":":66$9=)\"'+",
  "field3":"%$':#02>=/",
  "field2":"5:<\"(>48+6",
  "field1":"$<9+0'<$1?",
  "field0":"4.'922#5!4"
}

JSONがとれた。
「field」はJSONの項目として解釈され、「field0」から数値部分がカウントアップされて「fieldcount」個だけある。
項目の値は「fieldlength」長になっているが、ダブルクオート等のエスケープが必要な文字には「\」が付与されて、その分だけデータ長が増えている。
CouchbaseにはView機能もあるから、その性能を見るとき用にValueの文字をコントロールできないものかな。


Couchbaseの参考:
Couchbase Server マニュアル 2.0(日本語)
http://docs.couchbase.com/prebuilt/translations/jp/couchbase-manual-2.0-ja/index.html

Couchbase Server マニュアル 2.5(英語)
http://docs.couchbase.com/couchbase-manual-2.5/

Couchbase Server クライアントライブラリマニュアル 1.0(日本語)
http://docs.couchbase.com/prebuilt/translations/jp/couchbase-sdk-java-1.0-ja/index.html

couchbase-client 1.4.0 API(java doc)
http://www.couchbase.com/autodocs/couchbase-java-client-1.4.0/index.html

Java Developer Guide(SDK1.4)
http://docs.couchbase.com/couchbase-sdk-java-1.4/

Couchbase Server Developer Guide 2.5
http://docs.couchbase.com/couchbase-devguide-2.5/

Couchbase Server ドキュメントセンター
http://docs.couchbase.com/

Couchbase Tokyo 2014
http://www.couchbase.com/presentations/developing-couchbase-getting-started-tokyo-2014