PostgreSQL のバックアップツール? wal-e が便利
PostgreSQL のバックアップをしたい
今自分たちで作っているサービスでは、成り行き上 PostgreSQL を使っている。で、最近バックアップの設定をしたんだけど、今までと同じく pg_dump をどっか別の場所に保存するってのだとつまらないなと思ってちょっとぐぐってみたら wal-e ってのがあった。結論から書くと、これかなり便利。
ただし、ドキュメントはあまり分かりやすいとは言えない。
wal-e がやってくれること
大雑把には
要は PITR (Point In Time Recovery) のためのバックアップが取得できる。PostgreSQL の PITR に関しては、公式サイトのページを参照。
具体的には、
- ベースバックアップの取得
- WAL (Write Ahead Log) の取得
をしてくれる。で、それを Amazon S3, Windows Azure Blob Service, OpenStack Swift に保存することができる。
リストアも、最新へのリストア、あるいは過去へのリストアが出来る。
少し細かい仕組みなど
ベースバックアップは、ユーザーがコマンドで起動するもので、通常は crontab などに設定する。ベースバックアップの取得前後で、begin backup, end backup を実行してくれ、また、ベースバックアップの内容はS3などに自動的に送ってくれる。
次に WAL だが、WAL のコピーは、postgresql.conf に記載した archive_command の設定に従って行われるので、ここに wal-e のコマンドを指定しておく。
リストアに関しては後述。
インストール
python, lzop, psql, pv に依存しているので、それらをインストールする。
次に、pip wal-e でOK。あと、この記事では envdir も使うので、それも pip でインストールしておく。
設定
S3 等の認証情報の設定
envdir を使う。/etc/wal-e.d/env/ の下に、設定したい環境変数名と同じ名前のファイル名を作成して、そこに環境変数に設定したい値を書く。自分の場合は、前回設定した OpenStack Swift を使うので、/etc/wal-e.d/env/ ディレクトリ以下に、以下のようなファイルを作成。
- SWIFT_AUTHURL
- SWIFT_TENANT
- SWIFT_USER
- SWIFT_PASSWORD
バックアップの設定
postgresql.conf で以下を記述。
3行目の内容が、WAL をストレージに送るコマンドとなっている。4行目はお好みで、適当な値に。
wal_level = archive # 又はhot_standby archive_mode = on archive_command = '/path/to/envdir /etc/wal-e.d/env /path/to/wal-e wal-push %p' archive_timeout = 5min
あとは、ベースバックアップのコマンドを crontab で仕込んでおく。自分は以下のようなシェルスクリプトを作って、それを日次で実行している。
#!/bin/bash ENVDIR_CMD=/path/to/envdir WALE_CMD=/path/to/wal-e ENVDIR=/etc/wal-e.d/env DATADIR=/var/lib/postgresql/9.3/main/ $ENVDIR_CMD $ENVDIR $WALE_CMD backup-push $DATADIR \ && $ENVDIR_CMD $ENVDIR $WALE_CMD delete retain 7
リストアの設定
これのやり方を勘違いしていて、トータルで丸一日分損をしたんだけど、正解としては以下の内容で recovery.conf を PostgreSQL のデータディレクトリの配下に置く。OS、ディストリビューションによって差はあるが、 /var/lib/postgresql/9.3/main/recovery.conf というファイルを作る。
restore_command = '/path/to/envdir /etc/wal-e.d/env /path/to/wal-e wal-fetch "%f" "%p"'
これでOK。
補足すると、 recovery.conf とは、PostgreSQL のリカバリに関する設定ファイル。詳細はドキュメントを参照のこと。
リカバリ・リストア
以下2通りのいずれの場合も、成功した場合 recovery.conf は recovery.done にリネームされる。
クラッシュからのリカバリ
PostgreSQL がクラッシュしたときなどは、次回起動時に、recovery.conf の内容から自動的に WAL を取得して、WAL があるところまでリカバリしてくれる。
0からのリストア
HDD が飛んだなどといったトラブルの場合は、まずは以下のコマンドで S3 からベースバックアップを取得する。
/path/to/envdir /etc/wal-e.d/env backup-fetch /var/lib/postgresql/9.3/main LATEST
その後、PostgreSQL を起動すれば、自動的に WAL を S3 などから取得して、ログをリプレイしてくれる。
まとめ
pg_dump を使う簡単な方法もいいけど、wal-e を使うと比較的簡単に PITR が出来るのでオススメ。
以下、本家以外で参考にしたサイト。
- Basic setup of WAL-E for continuous archiving and recovery
- Herokuが開発したWAL-Eを使って、AWSでPostgreSQLのバックアップを取る