wal-eをCentOS6にインストール

postgresqlPostgreSQLでオンラインバックアップ・リストアを容易にする wal-e というプログラムがある。
小さなプログラムを幾つかインストールしないといけなくてセットアップが若干面倒なのだけど、Web上にはUbuntu系のインストール方法しか見当たらなかったので、CentOS6向けの手順をまとめてみた。

Ubuntu では apt-get していけばそれっぽく動くけど、 CentOS はステップが多く、環境構築までの道のりが長かった。

wal-eバックアップ

PostgreSQLでは更新データは WAL(write ahead log/トランザクションログ) ファイルに追記される。
このファイルのアーカイブ機能を利用し、ベースバックアップと WAL アーカイブファイルからデータをリストアすることができる。
wal-e を使うと aws の s3 をバックエンドに、バックアップとリストアのごちゃごちゃ仕立て順をシンプルに行えるようになる。
heroku がオープンソース化したものなので、運用実績はそれなりのものと思われる。

wal-e の概要と使い方は以下を参照

PostgreSQL の WAL を利用したバックアップリストアは以下を参照。

wal-eはpg_receivexlogとの違い

wal-e は WAL ファイルのアーカイブ処理をトリガーにバックアップを行う。
そのため、アーカイブ化されていない更新データは復元できない。

PostgreSQL は 9.2 からレプリケーション機能を切り出し、WAL データをリアルタイム転送する機能(pg_receivexlog)が追加された。
これを使うと、アーカイブ化されていない WAL もリレーされるため、より細かい粒度でリストア可能になる。

wal-e は WAL を S3 に push するのに対して pg_receivexlog は WAL を pull する。

pg_receivexlog を使ったバックアップ・リストアは以下を参照

wal-eの構成要素

wal-e は以下のプログラムから構成されている

  • PostgreSQL:バックアップ&リストアスルデータベース。8.4以上に対応。
  • wal-e:S3へのバックアップ・リストアプログラム
  • lzop:高速なファイル圧縮
  • pv(pipe viewer):S3 転送時の帯域制御
  • daemontools/envdir:wal-e実行時の環境変数設定(オプション)

CentOS向け以外のインストール方法

CentOS 向けインストール方法

CentOS 6.4 に wal-e をインストールする。
PostgreSQL はインストールがすんでいる前提。

wal-e

Python で書かれているので pip 経由でインストールする。

Cent 6 系の Python は 2.6 なので不具合やライブラリもこのバージョンに引きづられる。

$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python
$ sudo easy_install pip

libevent に依存しているので、関連する開発パッケージを yum で入れる。
インストールされていなければ gevent/core.c:4:20: error: Python.h: No such file or directory というようなエラーメッセージが表示される。

$ sudo yum install python-devel libevent-devel libevent-headers

次に wal-e 本体をインストール

$ sudo pip install wal-e

/usr/bin/wal-e にインストールされます。
wal-e と一緒に以下もインストールされす。

  • argparse boto(aws library)
  • gevent
  • greenlet

lzop

http://www.lzop.org/

yum で入る。

$ yum search lzop
lzop.x86_64 : Real-time file compressor
$ sudo yum install lzop

pv(page viewer)

pv は レポジトリ RPMForge を追加してインストールする。
http://www.ivarch.com/programs/quickref/pv.shtml

$ sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
$ wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
$ sudo rpm -ivh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
$ yum search pv
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * rpmforge: ftp.riken.jp
 * updates: ftp.iij.ad.jp
rpmforge                                                 | 1.9 kB     00:00
rpmforge/primary_db                                      | 2.6 MB     00:01
=============================== N/S Matched: pv ================================
...
pv.x86_64 : Monitor the progress of data through a pipe
...
$ sudo yum install pv

CentOS での RPMForge の追加方法は以下を参照

http://wiki.centos.org/AdditionalResources/Repositories/RPMForge#head-f0c3ecee3dbb407e4eed79a56ec0ae92d1398e01

wal-e では pv --rate-limit して、トラフィックが専有されないようにしている。

例として /dev/zero を read して /dev/null に write するペースを 1GB/s に抑えたい場合

$ pv /dev/zero  > /dev/null
20.4GiB 0:00:03 [6.81GiB/s] [  <=>                                               ]
$ pv --rate-limit=1g /dev/zero  > /dev/null
2.98GiB 0:00:03 [1.05GiB/s] [  <=>

pv の本来の用途は以下を参照

daemontools

AWS の認証情報は環境変数でセットすることが推奨されている。
daemontools の envdir を利用して wal-e の環境変数を管理する。

次の URL を参考にした

# mkdir -p /package
# chmod 1755 /package
# cd /package
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# tar xpvf daemontools-0.76.tar.gz
# cd admin/daemontools-0.76
# wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
# patch -s -p1 <./daemontools-0.76.errno.patch
# ./package/install
...
Making command links in /command...
Making compatibility links in /usr/local/bin...
Creating /service...
Adding svscanboot to inittab...
init should start svscan now.
# which envdir
/usr/local/bin/envdir

daemontoolsの起動スクリプトの更新

/etc/inittab でプロセス管理しないように以下の行を削除

# grep -n svscanboot /etc/inittab
28:SV:123456:respawn:/command/svscanboot

別途 init スクリプトを用意(← envdir しか使っていないので、コレは不要な気がする)

# cat << EOF > /etc/init/svscan.conf
start on runlevel [345]
respawn
exec /command/svscanboot
EOF

# initctl reload-configuration
# initctl start svscan
svscan start/running, process 22026
# pstree
init-+-VBoxService---7*[{VBoxService}]
     |-auditd---{auditd}
     ...
     |-sshd---sshd---sshd---bash---screen---screen-+-bash
     |                                             `-bash---pstree
     |-svscanboot-+-readproctitle
     |            `-svscan
     `-udevd

環境変数の設定

S3 操作で利用。
値はアカウントに合わせて変更すること

$ umask u=rwx,g=rx,o=
$ sudo mkdir -p /etc/wal-e.d/env
$ sudo echo "secret-key-content" > /etc/wal-e.d/env/AWS_SECRET_ACCESS_KEY
$ sudo echo "access-key" > /etc/wal-e.d/env/AWS_ACCESS_KEY_ID
$ sudo echo 's3://some-bucket/directory/or/whatever' > \
  /etc/wal-e.d/env/WALE_S3_PREFIX
$ sudo chown -R root:postgres /etc/wal-e.d

PostgreSQL の修正

今回は PostgreSQL 9.3 で設定する。
データディレクトリのパスは /var/lib/pgsql/9.3/data/
postgresql.conf ファイルの wal アーカイブ設定を修正する。

$ sudo su - postgres
$ vi /var/lib/pgsql/9.3/data/postgresql.conf
wal_level = archive
archive_mode = on
archive_command = '/usr/local/bin/envdir /etc/wal-e.d/env /usr/bin/wal-e wal-push %p'
archive_timeout = 60
$ exit
$ sudo service postgresql-9.3 restart

注意点としては、実行時の環境変数 PATH を考慮すると archive_command のコマンドはフルパスで書いたほうがよい。

設定の意味は以下を参照

cron設定

wal-e でベースバックアップする cron 設定を追加

$ sudo su - postgres
$ crontab -e
0 2 * * * /usr/local/bin/envdir /etc/wal-e.d/env /usr/bin/wal-e backup-push /var/lib/pgsql/9.3/data/

テスト実行

ベースバックアップの実行

$ /usr/local/bin/envdir /etc/wal-e.d/env/ /usr/bin/wal-e backup-push /var/lib/pgsql/9.3/data

wal アーカイブの転送

syslog/var/lib/pgsql/9.3/data/pg_log 以下のログファイルで wal 転送ログを確認。

○出力例

wal_e.worker.s3_worker INFO     MSG: begin archiving a file
        DETAIL: Uploading "pg_xlog/00000001000000000000000C" to "s3://waletest00/waltest/wal_005/00000001000000000000000C.lzo".

その他

syslog が文字化けする

wal-e コマンドを実行すると、 syslog のプロセス名が化けていたり、ターミナルから実行すると、ビープ音がなったりする。

○文字化け例

Message from syslogd@coredb6 at Apr 10 14:13:46 ...
*<14>wal_e.operator.s3_operator INFO     MSG: complete wal
restore#012        STRUCTURED: time=2013-04-10T18:13:46.824353-00
pid=4530 action=wal-fetch
key=s3://PGSQL/wal_005/000000010000105B000000BA.lzo prefix=s3://PGSQL
seg=000000010000105B000000BA state=complete

○原因
Python の syslog ロガーのユニコード処理の不具合が原因

BUGS:SysLogHandler can’t handle Unicode
http://bugs.python.org/issue7077

Python 2.7/3.2 以降は修正されている。

Python のバージョンを上げる、または、パッチをあてる必要がある。

daemontoolsのインストールが面倒

daemontools のうち envdir しか利用していないので、envdir だけを移植したプログラムを利用する手もある。
Python 実装の envdir$ sudo pip install envdir で完了する。
wal-e のインストール過程で pip もインストールしていることだし、こっちを強くおすすめする。

URL : https://pypi.python.org/pypi/envdir

Tagged with: , , ,
Posted in database, linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 1 week ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: