圧縮形式検証(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
圧縮する速度が知りたいから、bzip2とxzはやらない!
/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.310slz4
time lz4 sample.bson
real 2m20.900s
user 0m34.440s
sys 0m10.606szstd
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したいね〜
あ〜楽しかった!
