37
PostgreSQL Unconference (2015-05-30) YCSB Benchmark JSONB vs MongoDB ぬこ@横浜 (@nuko_yokohama)

20150530 pgunconf-ycsb-jsonb

Embed Size (px)

Citation preview

PostgreSQL Unconference(2015-05-30)

YCSB BenchmarkJSONB vs MongoDB

ぬこ@横浜 (@nuko_yokohama)

自己紹介ぬこ@横浜です

詳細はググれ ( ください )

またおまえか・・・と言わず聞いてください

ネタは JSONB

また JSONB か・・・と言わず聞いてください

目次

YCSB とはYCSB JSONB 対応版

MongoDB 比較

YCSB とは

Yahoo! Cloud Service Benchmark の略

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

https://github.com/brianfrankcooper/YCSB

YCSB とは対応している DB

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

CouchDB 、 Voldemort 、 MongoDB 、OrientDB 、 Infinispan 、 Dynomite 、

Redis 、 GemFire 、 GigaSpaces XAP 、 DynamoDB 、 JDBC

YCSB とは

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

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

YCSB とは

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

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

YCSB JSONB 対応版

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

ベースは JDBC 版

YCSB JSONB 対応版

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

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'));

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への

キャストは不要

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 への

キャストは不要

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

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

PostgreSQL 9.5 JSONB 版更新 SQLUPDATE usertable SET data = data || json_build_object('FIELD1', ?)WHERE data->>'YCSB_KEY' = ?

まだ試してないけどめっさスッキリ書けるはず

参考

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

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

MongoDB 比較測定内容

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

MongoDB 比較

測定対象

PostgreSQL 9.4.1MongoDB 3.0.0

まず、手元にあるマシンでやってみた

MongoDB 比較測定環境 1

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

VM メモリ 4GB

MongoDB 比較

測定環境 1

PostgreSQL 9.4.1MongoDB 3.0.0

MongoDB 比較測定環境 1

PostgreSQL の環境設定はcheckpoint_segments=30

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

MongoDB 比較ロード処理

MongoDB 比較更新と参照

MongoDB 比較参照のみ

MongoDB 比較まとめ

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

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

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

MongoDB 比較課題

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

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

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

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

AWS EC2 でそこそこいいマシンを

使ってやってみた

MongoDB 比較測定環境 2

m3.2xlarge on-demandCPU 数 8 、メモリ 30GB

( 面倒だったので CL-SV 同居 )

測定のためにラーメン一杯分くらいのコストがかかったよ!

MongoDB 比較

測定環境 2

PostgreSQL 9.4.1 (yum)MongoDB 3.0.2 (yum)

MongoDB 比較測定環境 2

PostgreSQL の環境設定はcheckpoint_segments=30

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

MongoDB 比較ロード処理

0 5 10 15 20 250

2000

4000

6000

8000

10000

12000

14000

16000

YCSB load Throughput

PostgreSQL 9.4

MongoDB 3.0

number of concurrency

Th

rou

gh

pu

t(o

ps

/se

c)

MongoDB 比較更新と参照

0 5 10 15 20 250

5000

10000

15000

20000

25000

YCSB load Workload-a Throughput

PostgreSQL 9.4

MongoDB 3.0

number of concurrency

Th

rou

gh

pu

t(o

ps

/se

c)

10000(opt/sec)程度になるはずなのに・・・

MongoDB 比較参照のみ

0 5 10 15 20 250

10000

20000

30000

40000

50000

60000

YCSB workload-c Throughput

PostgreSQL 9.4

MongoDB 3.0

number of concurrency

Th

rou

gh

pu

t(o

ps

/se

c)

MongoDB 比較まとめ

PostgreSQL は CPU 数がないとスループットだせないね。

逆に言えば MongoDB は CPU 数が多いマシンで動かしても嬉しくない。

⇒ その代わりシャードで書き込み分散?

MongoDB 比較

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

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

きちんと JSONB 版として作成しなおしたい。・ INSERT の SQL と UPDATEの SQL は本当にこれでいいのだろうか・・・

⇒9.5 で改善できるかも

今後も AWS のような環境を使って

ちょこちょこ測定はしてみようと思います。