pixzでケチケチバックアップ(もしくはGCS Nearlineで節約バックアップ)
この記事は qiita.com の7日目です。
TL;DR
pixzでCPUマルチコアを使って高速かつ、高圧縮することで、バックアップの保存料金節約をしました。
GCS Nearlineなら、GB単価も安いし、取り出すときも高圧縮してあれば取り出し料金、データ転送料金も安く抑えられて一石二鳥でした。
目次
日々多数あるオンプレミスなサーバ内の種々なデータを gzip 圧縮して AWS S3($0.0330/GB/Month)に保存しているのですが、1TBを超えてきたのもあるし所詮バックアップで取り出すことはたまにしかないので、より安い GCS Nearline($0.01/GB/Month)に移行することにしました。 ついでに、gzip圧縮するのと同じ実時間程度でより高圧縮にすると、保存料金も取り出し料金も安くできるので、圧縮方法について簡単に評価することにしました。 すでに最初に書いているように、最終的には pixz を選択したのですが、評価対象・内容を書いておきます。圧縮対象や用いるサーバ(CPU)によってこのあたりは判断が分かれることになるので、参考程度にしてもらえると良いです。 ・圧縮対象 を使用しました。 ・環境 ファイルを一度readして、キャッシュにのせての評価です。 Writeについても各コマンドが終了するまでの時間で、Diskへの同期までは含んでいません(のはず)。 ・結果 結果は下記のとおりです。time コマンでの計測です。 logrotate で pixz を使いたい場合は logrotate.d 配下に作るファイルで のような記述を入れればよいです。 CentOS5/6 で使う必要があったので、そのビルド方法を下記に記しておきます。 pixzをビルドするには liblzmaやlibarchiveが必要となる。特に liblzma については xz-devel パッケージでインストールされたものではpixzのビルドが通らない。
そこで、liblzmaおよblibarchiveについてもソースからビルドし、pixzはそれらを static link するようにする。 ・ビルド用ディレクトリの準備 ビルド作業用にディレクトリを作成しておく。 ・libarchiveビルド http://www.libarchive.org/downloads/ より最新のソースを取得し、ビルドする。 ・liblzmaビルド http://tukaani.org/xz/ より最新のソースを取得し、ビルドする。 ・pixzビルド https://github.com/vasi/pixz/releases より最新のソースを取得し、ビルドする。 libarchiveを認識するための設定 configure make これで、ldd でダイナミックリンクしているライブラリを確認し、liblzmaとlibarchiveがないことを確認する。 こうして出来上がった pixz を /usr/bin なり /usr/local/bin なりにコピーして使えばよい。 結局、バックアップに必要な領域にかかる費用は 1/5 くらいになって幸せです! pixzとGCS Nearlineでバックアップ保存料を大幅に削減できました。 注意1:pixzはデフォルトでは全Coreを全力で使うので適宜パラメータを調製しましょう。 注意2:AWS EC2にあるデータなんかはS3に保存しています(pixzは使ってます)。AWSからGCS Nearlineに転送するとその料金が高いので。背景
評価
MySQLのダンプファイル:サイズ 1863439430 byte
CPU E5-2407 2.20GHz(4Core)
Memory 16GB
software
time real
time user
圧縮ファイルサイズ
gzip
41.381s
40.158s
132994340
bzip2
9m7.662s
9m6.532s
86384870
pbzip2
2m23.181s
9m18.850s
86384870
pbzip2 -1
1m36.440s
6m22.965s
139260027
xz -1
1m17.306s
1m15.626s
105005636
pixz -2
26.569s
1m43.460s
87629204
pixz -3
38.820s
2m30.649s
84229748
pixz -2
が圧縮率や処理時間からするとベターに見えるので、これを採用した。logrotate
compress
compresscmd /usr/local/bin/pixz
compressoptions -2
compressext .xz
pixzのビルド
$ mkdir $HOME/pixz_build
$ cd $HOME/pixz_build
$ wget http://www.libarchive.org/downloads/libarchive-3.1.2.tar.gz
$ tar xzf libarchive-3.1.2.tar.gz
$ cd libarchive-3.1.2
$ ./configure --prefix="$HOME/pixz_build"
$ make
$ make install
$ cd $HOME/pixz_build
$ wget http://tukaani.org/xz/xz-5.2.2.tar.gz
$ tar xzf xz-5.2.2.tar.gz
$ cd xz-5.2.2
$ ./configure --prefix="$HOME/pixz_build"
$ make
$ make install
$ export PKG_CONFIG_PATH=$HOME/pixz_build/lib/pkgconfig
$ pkg-config --exists --print-errors "libarchive"
$ cd $HOME/pixz_build
$ wget -O pixz-1.0.5.tar.gz https://github.com/vasi/pixz/releases/download/v1.0.5/pixz-1.0.5.tar.gz
$ tar xzf pixz-1.0.5.tar.gz
$ cd pixz-1.0.5
$ LIBARCHIVE_LIBS=$HOME/pixz_build/lib/libarchive.a LZMA_LIBS=$HOME/pixz_build/lib/liblzma.a ./configure --prefix="$HOME/pixz_build"
$ make CFLAGS="-I$HOME/pixz_build/include/"
$ ldd src/pixz
linux-gate.so.1 => (0x00302000)
libm.so.6 => /lib/libm.so.6 (0x00ca9000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00c8d000)
libc.so.6 => /lib/libc.so.6 (0x00b28000)
/lib/ld-linux.so.2 (0x00b09000)
結果・まとめ