圧縮形式検証(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時間 バイト メガバイト
original - 13676855970 13044M
gzip 12m29.744s 2192892602 2092M
lz4 2m20.900s 3663760871 3495M
zstd 7m11.140s 1929996789 1841M

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

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

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

あ〜楽しかった!