grasys blog
grasysブログ

圧縮形式検証(MongoDBのDumpがでかい!)

grasysの代表しております長谷川です。

2019年、あけましておめでとうございます!
本年もよろしくお願い致します!

早速ですが、grasysではMongoDBの運用もしています。
ただMongoDBのDumpが非常に大きくて困っています。
Cloud使ってるからObject StorageにUploadしちゃえばいいんですが!

それにしても、やっぱでかい!!

しかもMonboDBのDumpはBSONでバイナリ・・・

また自分は40歳といういい年のおっさんで、
BSDとかSolarisとかも大好きな世代なので、今まであまり圧縮形式にこだわってきませんでした。

ちょっと調べてみると圧縮形式っていろいろあるのね

最近あんまりエンジニアできないので、年明け一発の今日!
予定がない!
だから遊び半分で検証!

遊びなのでバイナリに強いとか、あまり深いこと考えてません!
ただし本当のMongoDBのDumpのBSONで実施するぜ!

blogはたまに書く社内にはダマで書くを実施していこう!


検証する圧縮形式

  • gzip 1.5
  • lz4 v1.8.3
  • zstd v1.3.7

圧縮する速度が知りたいから、bzip2xzはやらない!

/etc/redhat-release

CentOS Linux release 7.6.1810 (Core)

uname -r

3.10.0-862.14.4.el7.x86_64

圧縮するファイル

  • 実際にMongoDBのmongodumpで取得したもの
  • 約13G (13676855970)

Install

gzip

CentOS7のRPM gzip-1.5-10.el7.x86_64

lz4

source: https://github.com/lz4/lz4

declare module=lz4
declare version=1.8.3
declare download_url=https://github.com/${module}/${module}/archive/v${version}.tar.gz
declare download_to=/tmp/src/${module}-${version}.tar.gz
declare build_base=/usr/local/src/
declare build_dir=/usr/local/src/${module}-${version}
declare deploy_to=/usr/local/${module}-${version}
declare symlink_to=/usr/local/${module}

test ! -d ${build_base} && mkdir -p ${build_base}
test -d ${build_base} && \
  curl -s --create-dirs -o ${download_to}  \
  -L ${download_url}
test -f ${download_to} && tar -xvzf ${download_to} -C ${build_base}
test -d ${build_dir} && cd ${build_dir} && make && make install PREFIX=${deploy_to}
test -d ${deploy_to} && ln -s ${deploy_to} ${symlink_to}
test -x ${symlink_to}/bin/${module} && ${symlink_to}/bin/${module} -V
*** LZ4 command line interface 64-bits v1.8.3, by Yann Collet ***

yumのgroupでDevelopment Toolsが入ってれば、たぶん入るはず・・・

ldd ${symlink_to}/bin/${module}
	linux-vdso.so.1 =>  (0x00007ffe75dc2000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f564d0a9000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f564ce8d000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f564cc89000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f564d682000)

zstd

source: https://github.com/facebook/zstd

declare module=zstd
declare version=1.3.7
declare download_url=https://github.com/facebook/${module}/releases/download/v${version}/${module}-${version}.tar.gz
declare download_to=/tmp/src/${module}-${version}.tar.gz
declare build_base=/usr/local/src/
declare build_dir=/usr/local/src/${module}-${version}
declare deploy_to=/usr/local/${module}-${version}
declare symlink_to=/usr/local/${module}

test ! -d ${build_base} && mkdir -p ${build_base}
test -d ${build_base} && \
  curl -s --create-dirs -o ${download_to}  \
  -L ${download_url}
test -f ${download_to} && tar -xvzf ${download_to} -C ${build_base}
test -d ${build_dir} && cd ${build_dir} && make && make install PREFIX=${deploy_to}
test -d ${deploy_to} && ln -s ${deploy_to} ${symlink_to}
test -x ${symlink_to}/bin/${module} && ${symlink_to}/bin/${module} -V
*** zstd command line interface 64-bits v1.3.7, by Yann Collet ***

こっちもlz4のが通れば・・・たぶん・・・入るはず・・・
というかオレのインスタンスは通ったから大丈夫!w

一応参考

ldd ${symlink_to}/bin/${module}
	linux-vdso.so.1 =>  (0x00007fff2b0c5000)
	libz.so.1 => /lib64/libz.so.1 (0x00007ff3e83da000)
	liblzma.so.5 => /lib64/liblzma.so.5 (0x00007ff3e81b4000)
	liblz4.so.1 => /usr/local/lz4/lib/liblz4.so.1 (0x00007ff3e7fa1000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff3e7d85000)
	libc.so.6 => /lib64/libc.so.6 (0x00007ff3e79b8000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007ff3e77b4000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ff3e87fc000)

xz-libs-5.2.2-1.el7.x86_64 これとか必要そうね
/usr/local/lz4/lib/liblz4.so.1 これはオレがLD通したからだな

検証

gzip

time gzip sample.bson

real	12m29.744s
user	12m3.196s
sys	0m10.310s

lz4

time lz4 sample.bson

real	2m20.900s
user	0m34.440s
sys	0m10.606s

zstd

time zstd sample.bson

real	7m11.140s
user	6m48.337s
sys	0m6.001s

結果

圧縮形式圧縮real時間バイトメガバイト
original1367685597013044M
gzip12m29.744s21928926022092M
lz42m20.900s36637608713495M
zstd7m11.140s19299967891841M

個人的にバランス良いなと思うのはzstdかな
でもあんまり大きくなって、ウン百Gくらいのサイズになったら、lz4の方が良さげだな

サイズなのか、圧縮時間なのか、どっちを取るかだな

でっかいファイルをパッと圧縮してポイッとObjectStorageにUploadしたいね〜

あ〜楽しかった!


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。