BackupライブラリでプロジェクトのバックアップもD.R.Y化しよう このエントリをはてなブックマークに登録

2010年08月23日

func09func09 / , , ,

はじめに

こんにちは芳賀@func09です。

何かプロジェクトをリリースする時、必ずといっていいほど必要なのはデータの定期バックアップですね。
必ずといっていいほど必要なのに、必ずといっていいほど忘れがちで、後回しにされがちで、
リリース前に「あ、バックアップのバッチ処理書かなきゃ・・」みたいな感じで、毎回同じようなシェルスクリプトを書いてませんか?僕はそんな感じです。

バックアップだってD.R.Y(Don’t repeat yourself)ということで、サクっと労力をかけずに終わらせたいなぁと思っていた時に見つけたのがBackupという名前のGemです。そのまんまですね。

Backup(RubyGem)とは?

Backuphttp://github.com/meskyanichi/backup )はRubyで書かれたUnixとRails環境のためのライブラリです。
データベースの内容をダンプして、gzで固めて、別のサーバに転送するような処理を、Rubyで書かれた設定ファイルを基に実行するためのものです。

Railsプロジェクトのバックアップにも使えますし、そうでないプロジェクトでも使えます。
バックアップ対象となるデータベースは、MySQLPostgreSQLSQLite、それからローカルのファイルやディレクトリ
バックアップ先は、AmazonS3SCPSFTPFTPといったリモートサーバ、あるいはローカルサーバです。
圧縮保管暗号化過去のバックアップのクリーニングといった処理、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    "example1@gmail.com"
  from  "example2@gmail.com"
 
  smtp do
    host            "smtp.gmail.com"
    port            "587"
    username        "example1@gmail.com"
    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の方を採用しています。

バックアップ処理はそんなに難しいもんじゃないのだから、なにもこんなツール使わなくても・・と思う方もおられることと思いますが、個人的にはバックアップの設定から定期実行の設定から、デプロイ時の設定まで全部プロジェクト配下に置いて、バージョン管理できるわかりやすさが気に入っています。

クレイについてもっと知りたい方は…

  1. クレイの3つの強みを見てみる。
  2. WEBシステムのことなら何でもご相談ください。

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


トラックバック
  1. WEBデザイン Tips2011/05/20, 3:18 PM

    RailsアプリのMySQL、PostgreSQLを自動バックアップ

    Railsで運用中のデータベース(MySQL、PostgreSQL)をwhenever + backupを使ってcronでバックアップする。

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ