はじめに
こんにちは芳賀@func09です。
何かプロジェクトをリリースする時、必ずといっていいほど必要なのはデータの定期バックアップですね。
必ずといっていいほど必要なのに、必ずといっていいほど忘れがちで、後回しにされがちで、
リリース前に「あ、バックアップのバッチ処理書かなきゃ・・」みたいな感じで、毎回同じようなシェルスクリプトを書いてませんか?僕はそんな感じです。
バックアップだってD.R.Y(Don’t repeat yourself)ということで、サクっと労力をかけずに終わらせたいなぁと思っていた時に見つけたのがBackupという名前のGemです。そのまんまですね。
Backup(RubyGem)とは?
Backup( http://github.com/meskyanichi/backup )はRubyで書かれたUnixとRails環境のためのライブラリです。
データベースの内容をダンプして、gzで固めて、別のサーバに転送するような処理を、Rubyで書かれた設定ファイルを基に実行するためのものです。
Railsプロジェクトのバックアップにも使えますし、そうでないプロジェクトでも使えます。
バックアップ対象となるデータベースは、MySQL、PostgreSQL、SQLite、それからローカルのファイルやディレクトリ。
バックアップ先は、AmazonS3、SCP、SFTP、FTPといったリモートサーバ、あるいはローカルサーバです。
圧縮、保管、暗号化、過去のバックアップのクリーニングといった処理、Eメールによる通知をサポートします。
インストールとセットアップ
BackupはRailsに限らず、Unix環境上のあらゆるプロジェクトに対応できますが、今回はRailsのプロジェクトをバックアップする場合を想定して説明させていただきます。
Backupはgemコマンドでインストールできます。
% gem install backup
config/environment.rbに追加する
config.gem "backup"
ジェネレーターコマンドを実行する
% ./script/generate backup
以下のファイルが生成される。
db/migrate/create_backup_tables
config/backup.rb
lib/tasks/backup/backup.rake
データベースをマイグレートする
% rake db:migrate
backupテーブルが作成される。
ここまででセットアップは終わりです。
設定ファイル
先ほどの作成された、config/backup.rb というファイルを編集してバックアップの設定を用意します。
backup 'mysql-backup-s3' do
adapter :mysql do
user 'user'
password 'password'
database 'database'
end
storage :s3 do
access_key_id 'access_key_id'
secret_access_key 'secret_access_key'
bucket '/bucket/backups/mysql/'
use_ssl true
end
keep_backups 25
encrypt_with_password 'my_password'
notify true
end
backup 'archive-backup-ftp' do
adapter :archive do
files ["#{RAILS_ROOT}/log", "#{RAILS_ROOT}/public/system"]
end
storage :ftp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/archive/'
end
keep_backups 10
encrypt_with_password false
end
設定ファイルの中身はRubyのDSLで記述します。
設定ファイルの記述の仕方はこちらのWikiに詳しく書いてあります。
backup トリガー名 do … end のブロックの中で、adapter(バックアップ対象)、strage(バックアップ保管先)などを設定します。
ひとつの設定ファイルの中に、複数のバックアップを定義することが可能です。
上記の例では、MySQLのダンプをS3に保存する設定と、Railsのログファイルやアップロードファイル(通常public/system)をFTPに保存する設定の2種類を用意しました。
バックアップの実行
用意した設定ファイルを使って、バックアップを実行する場合、rake backup:run コマンドをtriggerオプションつきで叩きます。トリガー名は、設定ファイルのbackup ‘mysql-backup-s3’ do .. end の文字列の部分です。
% rake backup:run trigger=mysql-backup-s3
cron登録
毎朝04:30に定期的にバックアップを取る場合、下記のような感じで登録します。
30 4 * * * cd /path/to/app && RAILS_ENV=production /usr/bin/env rake backup:run trigger='mysql-backup-s3' >> /path/to/app/log/cron.log 2>&1
Whenever & Capistrano との組み合わせ
定期バックアップのCRON登録までをプロジェクトのコードの中に含めて管理し、デプロイ時に自動的にCRONをセットするようにしたい場合は、CapistranoとWhenever( http://github.com/javan/whenever )の組み合わせがよろしいです。
Wheneverは定期的な処理をRubyのDSLで記述して、CRONへの登録・削除を管理してくれるGemです。
every 1.day, :at => '4:30 am' do
rake "backup:run trigger='my-backup-trigger' "
end
このような設定ファイルを用意しておくと、先ほどのCRONと同じタスクの登録がデプロイ時に自動的に行われます。
設定方法などはこちらをご覧ください。
http://wiki.github.com/meskyanichi/backup/capistrano-whenever
設定ファイルもう少しくわしく
設定ファイルの各オプションの説明
encrypt_with_password(暗号化)
バックアップしたファイルを暗号化する場合は
backup "my-trigger" do
encrypt_with_password "my-secret-password"
end
のようにします。「my-secret-password」は暗号化用のパスワードです。バックアップしたファイルをデコードする場合、
sudo backup --decrypt /path/to/my-backup-file.gz.enc
この後のプロンプトでパスワードを入力します。
暗号化したくない場合は、encrypt_with_password オプションを設定しないか、falseを設定します。
backup "my-trigger" do
encrypt_with_password false
end
keep_backups(バックアップファイルをキープする数)
ストレージにバックアップをいくつまで溜めておくか設定する場合は、keep_backupsオプションを設定します。
backup "my-trigger" do
keep_backups 25
# OR
keep_backups :all
end
整数値(integer)もしくは :all が設定できます。
notifier_settings(Eメール通知)
バックアップの通知をEメールで受け取りたい場合はnotifyオプションとnotifier_settingsブロックの設定をします。
backup "my-trigger" do
notify true
# OR
notify false
end
通知する or 通知しない
notifier_settings do
to "[email protected]"
from "[email protected]"
smtp do
host "smtp.gmail.com"
port "587"
username "[email protected]"
password "example1password"
authentication "plain"
domain "localhost.localdomain"
tls true
end
end
メールの送信先、SMTPサーバの設定。
バックアップ対象の設定
バックアップ対象(Adapter)の設定方法。
MySQL
backup "my-trigger" do
adapter :mysql do
user 'user'
password 'password'
database 'database'
skip_tables ['table1', 'table2', 'table3']
options do
host '123.45.678.90'
port '80'
socket '/tmp/socket.sock'
end
additional_options '--single-transaction --quick'
end
end
PostgreSQL
backup "my-trigger" do
adapter :postgresql do
user 'user'
database 'database'
skip_tables ['table1', 'table2', 'table3']
options do
host '123.45.678.90'
port '80'
socket '/tmp/socket.sock'
end
additional_options '--clean --blobs'
end
end
アーカイブ
アーカイブしたいファイル、ディレクトリを files オプションに対して、文字列または配列で設定できます。
backup "my-trigger" do
adapter :archive do
files "#{RAILS_ROOT}/log"
# OR
files ["#{RAILS_ROOT}/log", "#{RAILS_ROOT}/public/assets"]
end
end
バックアップ先
Amazon S3
backup "my-trigger" do
storage :s3 do
access_key_id 'access_key_id'
secret_access_key 'secret_access_key'
bucket '/bucket/backups/'
use_ssl true
end
end
SCP
backup "my-trigger" do
storage :scp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/'
end
end
SFTP
backup "my-trigger" do
storage :sftp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/'
end
end
FTP
backup "my-trigger" do
storage :ftp do
ip 'example.com'
user 'user'
password 'password'
path '/var/backups/'
end
end
さいごに
今回はプロジェクトのバックアップをサポートするBackupを紹介しました。
Backupのほかにも、Safe(http://github.com/astrails/safe)という同じ目的のライブラリもあり、こちらはより細かい制御が可能のようでしたが、設定ファイルがシンプルなBackupの方を採用しています。
バックアップ処理はそんなに難しいもんじゃないのだから、なにもこんなツール使わなくても・・と思う方もおられることと思いますが、個人的にはバックアップの設定から定期実行の設定から、デプロイ時の設定まで全部プロジェクト配下に置いて、バージョン管理できるわかりやすさが気に入っています。
このエントリーに対するコメント
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
-
- WEBデザイン Tips2011/05/20, 3:18 PM
RailsアプリのMySQL、PostgreSQLを自動バックアップ
Railsで運用中のデータベース(MySQL、PostgreSQL)をwhenever + backupを使ってcronでバックアップする。
「いいね!」で応援よろしくお願いします!