kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

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)によってこのあたりは判断が分かれることになるので、参考程度にしてもらえると良いです。

・圧縮対象

MySQLのダンプファイル:サイズ 1863439430 byte

を使用しました。

・環境

CPU E5-2407 2.20GHz(4Core)
Memory 16GB

ファイルを一度readして、キャッシュにのせての評価です。

Writeについても各コマンドが終了するまでの時間で、Diskへの同期までは含んでいません(のはず)。

・結果

結果は下記のとおりです。time コマンでの計測です。

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

logrotate で pixz を使いたい場合は logrotate.d 配下に作るファイルで

        compress
        compresscmd /usr/local/bin/pixz
        compressoptions -2
        compressext .xz

のような記述を入れればよいです。

pixzのビルド

CentOS5/6 で使う必要があったので、そのビルド方法を下記に記しておきます。

pixzをビルドするには liblzmaやlibarchiveが必要となる。特に liblzma については xz-devel パッケージでインストールされたものではpixzのビルドが通らない。 そこで、liblzmaおよblibarchiveについてもソースからビルドし、pixzはそれらを static link するようにする。

・ビルド用ディレクトリの準備

ビルド作業用にディレクトリを作成しておく。

$ mkdir $HOME/pixz_build

・libarchiveビルド

http://www.libarchive.org/downloads/ より最新のソースを取得し、ビルドする。

$ 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

・liblzmaビルド

http://tukaani.org/xz/ より最新のソースを取得し、ビルドする。

$ 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

・pixzビルド

https://github.com/vasi/pixz/releases より最新のソースを取得し、ビルドする。

libarchiveを認識するための設定

$ export PKG_CONFIG_PATH=$HOME/pixz_build/lib/pkgconfig
$ pkg-config --exists --print-errors "libarchive"

configure

$ 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

$ make CFLAGS="-I$HOME/pixz_build/include/"

これで、ldd でダイナミックリンクしているライブラリを確認し、liblzmaとlibarchiveがないことを確認する。

$ 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)

こうして出来上がった pixz を /usr/bin なり /usr/local/bin なりにコピーして使えばよい。

結果・まとめ

結局、バックアップに必要な領域にかかる費用は 1/5 くらいになって幸せです!

pixzとGCS Nearlineでバックアップ保存料を大幅に削減できました。

注意1:pixzはデフォルトでは全Coreを全力で使うので適宜パラメータを調製しましょう。

注意2:AWS EC2にあるデータなんかはS3に保存しています(pixzは使ってます)。AWSからGCS Nearlineに転送するとその料金が高いので。