22
JPUG 合宿 in 熱海 (2015-03-22) YCSB JSONB 対応版 を作って MongoDB と 比較してみた ぬこ@横浜 (@nuko_yokohama) 公開用修正版

YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

Embed Size (px)

Citation preview

Page 1: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

JPUG 合宿 in 熱海(2015-03-22)

YCSB JSONB 対応版を作って MongoDB と

比較してみたぬこ@横浜 (@nuko_yokohama)

公開用修正版

Page 2: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

目次

YCSB とはYCSB JSONB 対応版

MongoDB 比較

Page 3: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB とは

Yahoo! Cloud Service Benchmark の略

いろんな NoSQL 系に対応したベンチマーク

https://github.com/brianfrankcooper/YCSB

Page 4: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB とは対応している DB

PNUTS 、 BigTable 、 HBase 、Hypertable 、 Azure 、 Cassandra 、

CouchDB 、 Voldemort 、 MongoDb 、OrientDB 、 Infinispan 、 Dynomite 、

Redis 、 GemFire 、 GigaSpaces XAP 、 DynamoDB 、 JDBC

Page 5: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB とは

Java で実装されている。(ビルドは Maven を使用)

前ページ以外の DB に対応するドライバを自分で作成も可能

Page 6: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB とは

6 種類のコア・ワークロード今回は、以下の 3 つを使う

load ( 挿入のみ )workload-a ( 更新 / 参照 )workload-c ( 参照のみ )

Page 7: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB JSONB 対応版

PostgreSQL JSONB 対応のドライバはないので自作する

ベースは JDBC 版

Page 8: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB JSONB 対応版

改造方針JDBC 版の SQL を JSONB を使うモデルに合わせて修正

Page 9: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB JSONB 対応版JDBC 版テーブル定義CREATE TABLE usertable (ycsb_key text, field1 text, field2 text, field3 text, field4 text, field5 text, field6 text, field7 text, field8 text, field9 text, field10 text);CREATE INDEX ycsb_key_idx ON usertable (ycsb_key);

JSONB 版テーブル定義CREATE TABLE usertable(data jsonb);CREATE INDEX ycsb_pk_idx ON usertable USING btree ((data->'YCSB_KEY'));

Page 10: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB JSONB 対応版JDBC 版挿入 SQLINSERT INTO usertable VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

JSONB 版挿入 SQLINSERT INTO usertable VALUES(json_build_object('YCSB_KEY', ?, 'FIELD1', ?, 'FIELD2', ?, 'FIELD3', ?, 'FIELD4', ?, 'FIELD5', ?, 'FIELD6', ?, 'FIELD7', ?, 'FIELD8', ?, 'FIELD9', ?, 'FIILD10', ?)::jsonb)

9.5-develだとjsonb_build_object()があるので、 JSONBへのキャストは不要

Page 11: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB JSONB 対応版JDBC 版更新 SQLUPDATE usertable SET FIELD1 = ? WHERE YCSB_KEY = ?

JSONB 版更新 SQLUPDATE usertable SET data = json_build_object('YCSB_KEY', data->>'YCSB_KEY', 'FIELD1', ?, 'FIELD2', data->>'FIELD2', 'FIELD3', data->>'FIELD03', 'FIELD4', data->>'FIELD4', 'FIELD5', data->>'FIELD5', 'FIELD6', data->>'FIELD6', 'FIELD7', data->>'FIELD7', 'FIELD8', data->>'FIELD8', 'FIELD9', data->>'FIELD9', 'FIELD10', data->>'FIELD10')::jsonbWHERE data->>'YCSB_KEY' = ?

9.5-devel だとjsonb_build_object() があるので、 JSONB への

キャストは不要

見ただけでうんざりしますよね。

Page 12: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

YCSB JSONB 対応版JDBC 版参照 SQLSELECT * FROM usertableWHERE YCSB_KEY = ?

JSONB 版参照 SQLSELECT * FROM usertableWHERE data->>'YCSB_KEY' = ?

Page 13: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較測定内容

ロード (load)⇒10 万件更新と参照 (workload-a )参照のみ( workload-c )⇒ それぞれ 10 万回実行

Page 14: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較

測定対象

PostgreSQL 9.4.1MongoDB 3.0.0

Page 15: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較測定環境

Let's note SX4/Windows8.1VMWare 6/CentOS 7

VM メモリ 4GB

Page 16: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較測定環境

PostgreSQL の環境設定はcheckpoint_segments=30

に変更したくらい。MongoDB は特に設定なし。

Page 17: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較ロード処理

Page 18: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較更新と参照

Page 19: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較更新と参照

Page 20: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較まとめ

今回は、一言でいうと測定環境がPostgreSQL + JSONB に

かなり不利かも( CPU 数が少ないので並列性の優位がでない)

でも、更新はやっぱり遅いね・・・参照はほぼ互角かな。

Page 21: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較

課題・ YCSB 対応版の修正方法がやっつけすぎ。

まだ公開できるレベルじゃない。・今回は直接 JDBC 版直したので、

きちんと JSONB 版として作成しなおしたい。・プロパティファイル読み込みがうまくいかない・・・

⇒ 母体から?・ INSERT の SQL と UPDATE の SQL は

本当にこれでいいのだろうか・・・

Page 22: YCSB JSONB 対応版 を作ってMongoDB と 比較してみた

MongoDB 比較課題

・ CPU リソース等きちんと確認せねば。⇒JSONB が CPU 結構使う疑惑

・コア数が多いマシンで試したい。⇒PostgreSQL が有利になるはず?

⇒AWS EC2 使うか・・・・シャード環境での確認

⇒MongoDB シャードとの比較⇒PostgreSQL は? pgpool? pg_shard?