Casual Compression on MongoDB

14,772
-1

Published on

1 Comment
8 Likes
Statistics
Notes
No Downloads
Views
Total Views
14,772
On Slideshare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
17
Comments
1
Likes
8
Embeds 0
No embeds

No notes for slide

Casual Compression on MongoDB

  1. 1. Casual Compression on   -present at MongoDB Casual Talks- @just_do_neet
  2. 2. Today’s Agenda 今日のお題目 •MongoDBの課題 •MongoDBでのデータ圧縮 •まとめMongoDB Casual Talks #1 2
  3. 3. MongoDB MongoDB http://www.mongodb.org/ http://www.mongodb.jp/ •10gen社が主体として開発しているオープンソース 所謂「NoSQL」の一つMongoDB Casual Talks #1 3
  4. 4. MongoDB is over? MongoDBはオワコン? http://suzuzuzuru.blogspot.jp/2012/04/mongodb.html http://blog.engineering.kiip.me/post/20988881092/a-year-with-mongodbMongoDB Casual Talks #1 4
  5. 5. MongoDB is over? MongoDBはオワコン? http://www.zopyx.com/blog/goodbye-mongodbMongoDB Casual Talks #1 5
  6. 6. Cons. MongoDBの欠点(主観含む) •トランザクション未サポート •トランザクションは甘え (ドヤァ •Global Lock(2.2からCollection Lockに?) •システムリソースが肥大化(メモリ、ディスク) •データ圧縮未対応(通信、データストア共) •セキュリティ周りが弱い etc.MongoDB Casual Talks #1 6
  7. 7. Cons. MongoDBの欠点(主観含む) •トランザクション未サポート •トランザクションは甘え (ドヤァ •Global Lock(2.2からCollection Lockに?) •システムリソースが肥大化(メモリ、ディスク) •データ圧縮未対応(通信、データストア共) •セキュリティ周りが弱い etc.MongoDB Casual Talks #1 7
  8. 8. Compress 圧縮関連のJIRA •BSONデータの圧縮→not supported! https://jira.mongodb.org/browse/SERVER-164MongoDB Casual Talks #1 8
  9. 9. Compress 圧縮関連のJIRA •通信路の圧縮→not supported! https://jira.mongodb.org/browse/SERVER-3018MongoDB Casual Talks #1 9
  10. 10. Compress Quoraに掲載されている「最も興味があるMongoDBのJIRA」http://www.quora.com/MongoDB/What-are-the-most-interesting-MongoDB-JIRA-issuesMongoDB Casual Talks #1 10
  11. 11. Compress vs Not Compress 圧縮:非圧縮のデータサイズの差 •下記例は同一フォーマットの文字列データを格納 した際の比較(MongoDB / HBase) •MongoDBはHBase(snappy圧縮時)の三倍強。 700000000 MongoDB 600000000 MongoDB(fragment) 500000000 HBase HBase(fragment) 400000000 HBase(snappy) 300000000 200000000 100000000 0 size(1,000,000 record)MongoDB Casual Talks #1 11
  12. 12. Cons. MongoDBの欠点(主観含む) •Big Dataを扱う環境にはあまり向かない。 •スケールするが故に、下手にそれなりの規模の システムに導入するとサーバー無限増殖の刑 に...MongoDB Casual Talks #1 12
  13. 13. 圧縮MongoDB Casual Talks #1 13
  14. 14. Casual Compression MongoDBでのカジュアルなデータ圧縮 •以下について試してみました。 1.フィールド名をできるだけ短くする 2.特定のデータをbinary形式で保存 3.小さい正整数の整数符号化MongoDB Casual Talks #1 14
  15. 15. #1 To shorten filed name フィールド名の短縮 •MongoDBはBSON形式でデータを保存 •BSONは1つのドキュメントの中にフィールド名 情報を持つ。 •複数のレコードが同一のフィールド名を持って いても、1レコードごとに情報を持つ。MongoDB Casual Talks #1 15
  16. 16. #1 To shorten filed name フィールド名の短縮 http://bsonspec.org/#/specificationMongoDB Casual Talks #1 16
  17. 17. #1 To shorten filed name フィールド名の短縮MongoDB Casual Talks #1 17
  18. 18. #1 To shorten filed name フィールド名の短縮 100万件で 約8MBの差MongoDB Casual Talks #1 18
  19. 19. #1 To shorten filed name 参考ブログ http://christophermaier.name/blog/2011/05/22/MongoDB-key-namesMongoDB Casual Talks #1 19
  20. 20. #1 To shorten filed name 参考ブログ http://christophermaier.name/blog/2011/05/22/MongoDB-key-namesMongoDB Casual Talks #1 20
  21. 21. #1 To shorten filed name OR Mapperを用いたfield nameのマッピング •OR Mapperでfield nameのマッピングを行うと名 前が短すぎる弊害は多少抑制できる。 •JavaではMorphiaがオススメ。 http://code.google.com/p/morphia/ •Spring Dataは重厚すぎる気がする。MongoDB Casual Talks #1 21
  22. 22. #1 To shorten filed name OR Mapperを用いたfield nameのマッピング @Data @Entity(value = "slim") class TestDTOSlim { @Id ObjectId id; @Property(value = "u") long uuid; @Property(value = "n") String name; @Property(value = "d") Date date; }MongoDB Casual Talks #1 22
  23. 23. #2 Convert to binary 特定のデータをbinary形式に変換 •MongoDBが圧縮をサポートしていないのでアプ リケーション側で圧縮をしてbinaryで保存。 •特定のフィールドを圧縮 •BSON以外の構造化フォーマットを用いて複数 フィールドをまとめてシリアライズ→圧縮MongoDB Casual Talks #1 23
  24. 24. #2 Convert to binary 検証に使用したデータモデル public class NormalModel { @Id ObjectId oid; long uuid; int id; char flag; String name; String description; }MongoDB Casual Talks #1 24
  25. 25. #2 Convert to binary 検証で使用した圧縮アルゴリズム •Deflate(Best Compression) •LZO •Google Snappy •LZ4MongoDB Casual Talks #1 25
  26. 26. #2 Convert to binary Google Snappy •2011/4ごろにGoogleがオープンソースとして公開 した圧縮アルゴリズム。 高速な圧縮・伸張が特徴。 •http://code.google.com/p/snappy/MongoDB Casual Talks #1 26
  27. 27. #2 Convert to binary LZ4 •Google Snappyよりも圧縮・伸張速度が速いと言 われている圧縮アルゴリズム。 •http://code.google.com/p/lz4/MongoDB Casual Talks #1 27
  28. 28. #2 Convert to binary BSON以外のシリアライズ手法 •Message Pack http://msgpack.org/MongoDB Casual Talks #1 28
  29. 29. #2 Convert to binary 検証条件 •以下の条件で比較 1.何もしない 2.フィールド名の短縮 3. 2 + 特定のフィールドの圧縮 4.複数のフィールド情報をMessagePackでシリ アライズ 5. 4.+圧縮MongoDB Casual Talks #1 29
  30. 30. #2 Convert to binary 検証結果 normal short key short key + msgpack 1500000 1200000 900000 600000 300000 0 none deflate lzo snappy lz4MongoDB Casual Talks #1 30
  31. 31. #2 Convert to binary 検証結果 normal short key 1,2, 4(非圧縮) short key + msgpack 1500000 1200000 900000 600000 300000 0 none deflate lzo snappy lz4MongoDB Casual Talks #1 31
  32. 32. #2 Convert to binary 検証結果 normal short key short key + msgpack 1500000 3,5(圧縮) 1200000 900000 600000 300000 0 none deflate lzo snappy lz4MongoDB Casual Talks #1 32
  33. 33. #2 Convert to binary 検証結果 normal short key short key + msgpack 1500000 1200000 900000 600000 300000 0 none deflate lzo snappy lz4MongoDB Casual Talks #1 33
  34. 34. #2 Convert to binary 検証結果 •「複数のフィールドをMessagePackでシリアライ ズ+圧縮アルゴリズムで圧縮」 の組み合わせで最大2/3の省サイズ化に成功。 •データパターン/データモデルによって傾向は 様々だと思う。 •圧縮・シリアライズのオーバーヘッドに注意。 •独自binary化すると後戻りできないので注意。MongoDB Casual Talks #1 34
  35. 35. #3 Integer Encoding 整数値符号化 •たとえば数字の「1」を数バイト使用して表現す るのはもったいない。→整数値符号化 •Variable Byte Code •Simple9 •Simple16 •etc...MongoDB Casual Talks #1 35
  36. 36. #3 Integer Encoding Variable Byte Code •整数値の値を最小1バイトで表現するための符号 化方式。数値部7bit(0~127)と、数値終端を表すフ ラグ1bitの組み合わせで数値を符号化します。 •https://gist.github.com/3003981 • 0x00-0x7f : 1xxxxxxx • 0x80-0x3fff : 0xxxxxxx 1xxxxxxx • 0x4000-0x1fffff : 0xxxxxxx 0xxxxxxx 1xxxxxxx ※「x」は0、もしくは1MongoDB Casual Talks #1 36
  37. 37. #3 Integer Encoding 検証に使用したデータモデル public class NormalModel{ ! @Id ! ObjectId oid; ! @Property(value = "id") ! int id; //もしくはlong }MongoDB Casual Talks #1 37
  38. 38. #3 Integer Encoding 検証条件 •以下の条件で比較 1. 整数値をinteger(4byte)で保存 2. 整数値をlong(8byte)で保存 3. 整数値をVariable Byte Codeで変換して保存MongoDB Casual Talks #1 38
  39. 39. #3 Integer Encoding 検証結果 integer long variable byte code 37000000 36000000 35000000 34000000 33000000 32000000 31000000 30000000 max : 128 max : 16384 max : 2097152MongoDB Casual Talks #1 39
  40. 40. #3 Integer Encoding 検証結果 •整数値符号化で保存をしたら、逆にIntegerよりも サイズが大きくなった・・・ •BSONの仕様が関係  int32 : 4bytes  int64 : 8bytes  binary : int32 subtype(byte*)MongoDB Casual Talks #1 40
  41. 41. Casual Compression MongoDBでのカジュアルなデータ圧縮 •以下について試してみました。 1.フィールド名をできるだけ短くする →◎ 2.特定のデータをbinary形式で保存 →⃝ 3.小さい正整数の整数符号化 →☓MongoDB Casual Talks #1 41
  42. 42. 参考情報MongoDB Casual Talks #1 42
  43. 43. HBase HBaseなら圧縮をサポートしてます •HBaseなら.... •データの圧縮に標準で対応 (圧縮したいTableのFamilyごとに指定可能。 アルゴリズムも複数選択可能) •可変長整数値に標準で対応 (VIntWritable / VLongWritable) •大きいデータを扱う場合はHBaseを(ryMongoDB Casual Talks #1 43
  44. 44. まとめMongoDB Casual Talks #1 44
  45. 45. Conclusion まとめにかえて •MongoDBはデータサイズが肥大化しがちです が、アプリケーション側のカジュアルな工夫で多 少はデータサイズの削減ができます。 •用途に応じて、適切な現場でMongoDBを使いま しょう。 •個人的にはRedisが好きです。MongoDB Casual Talks #1 45
  46. 46. ご清聴 ありがとうございましたMongoDB Casual Talks #1 46
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×