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時点の最新とかにしてないのでご注意を。
- クライアントサイド
- サーバサイド
- Vagrant + VirtualBox + CentOS65 で構築
- wget http://packages.couchbase.com/releases/2.5.1/couchbase-server-enterprise_2.5.1_x86_64.rpm
- rpm --install couchbase-server-enterprise_2.5.1_x86_64.rpm
- service couchbase-server start
- ポート開けたり、SE Linux殺したり
実行までの手順
クライアント側だけ書く。
- Github用のワークディレクトリ作成。
- ここでは「C:\github」にしとく。
- コマンドプロンプトを開いて「C:\github」までcd。
- 「git clone https://github.com/Altoros/YCSB.git」を実行すると「YCSB」ディレクトリができる。
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設定の「
.. 」をコメントアウト。- ※子プロジェクトによって「
.. 」があったりなかったりして参照がうまくいかなかった。 - ※なので、「
.. 」を全て削除する方向に。
- ※子プロジェクトによって「
- 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のプレフィックスになる
- テーブル名(default: usertable)
■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
- HBaseClient
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
- オペレーションタイムアウト。単位はms。(デフォルト:60000)
- 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