ZEALOTエンジニアブログ

gem backupを使ってMySQLとかファイルとかをバックアップ

Pocket

会社で使っているRedmineやGitやホームページのバックアップの自動化をしなきゃしなきゃと思いつつ、まる1年が経ちまして。
ようやく重い腰を上げて設定してみました。

今回は、backup というgemを使ったバックアップの設定手順をここにまとめます。

gem backupで出来ることは下記の通りです。(他にも色々あります)

  • MySQLやファイルを対象としたバックアップに対応している
  • バックアップ先にS3等を選択できる
  • ローテーション設定も可能
  • バックアップ処理完了後にメール(やTwitterなど)で通知可能
  • cronで定期的に実行させる(これはbackupの機能じゃないけど)

 

ちなみに、今回はrvm(system wide)がインストールされている環境を前提とした、インストール&設定方法となります。

Backup用のgemsetの作成とか

また、今回S3にバックアップを保存するのですが、その時fogというgemを使います。そこで、以下のライブラリが必要となったのでインストールしました。

必要となるgemのインストール

※ fogは1.4.0でないと動かないのでバージョンを指定してインストール。あ、もしかしたら’~> 1.4.0’としてもいいかも。

バックアップ用の設定ファイルの記述

今回、/root/backup/redmine_backup.rbとして作成。

cronに登録

毎朝6時5分にバックアップを取る例。rvmのパス等は環境に合わせて変更が必要。

  • -t トリガー performの後ろの「-t redmine_db_backup」は設定ファイル「/root/backup/redmine_backup.rb」内の下記の名称(:redmine_db_backup)と一致させる
  • -c 設定ファイル
  • -r ルートとなるディレクトリ。ここで指定したディレクトリ以下にlog, data, .tmp, .cache等のディレクトリが作られる。「data」については後で説明します。

実行してみる

上記の内容で実行するとS3のバケットに「/redmine/redmine_db_backup/2012.12.07.10.37.27」というディレクトリが作成され、その中にredmine_db_backup.tarというファイルができています。このファイルはsplit_into_chunks_ofで指定した250MBを超えた場合、分割して保存されます。それは、このあと説明します。

また、日時のディレクトリ「2012.12.07.10.37.27」がローテーションの単位となり、keep = 3と設定した場合、このディレクトリが3つ分保存されることとなります。

ちなみに、どうやってS3に3つのファイルがあるか判断しているかというと、S3にアクセスしてディレクトリ一覧を見ているわけではなく、ローカルのyamlファイルにどのファイルを上げたかを記録しておき、そのファイルを見てローテーションの制御を行なっているみたいです。今回の例では、ローカルの以下のファイルに記述されています。

/root/backup/data/redmine_db_backup/S3.yml

というわけで、このファイルも意外と重要な役割をしています。なので、設定ファイルとこのファイルもバックアップしておくのがいいかなと思われます。

バックアップしたファイルが分割された場合

バックアップするファイルのサイズがsplit_into_chunks_ofで指定したサイズを超えた場合、〜.aa, 〜abみたいに分割してアップロードされます。
これを、くっつけるには以下のようにcatで結合するだけ。

下記の2つのファイルに分割された場合

  • git_repositories_backup.tar-aa
  • git_repositories_backup.tar-ab

次のようにして結合します。

詳しくは下記参照。
https://github.com/meskyanichi/backup/wiki/Splitter

まとめ

RVMとか使ってるので説明がややこしくなってるとこもありますけど、非常に簡単に使えます。バックアップのスクリプトって毎回同じ事を書いていた気がするけど、これを使うと設定のみでどれをバックアップするか、どこに通知するか等やってくれるので非常に助かります。特にエラーの時の対応とかログの出力とか自分でスクリプト書くとなると意外と面倒ですし。

ちょっと残念なのは、コールバックする仕組みがないっぽいところですね。例えばS3のエラーが発生した時(とか成功した時)にコールバックできたりすると、嬉しかったりします。(例えば、MySQLのバイナリログをバックアップした時、ちゃんとS3に上がった時だけpurgeを実行させるとかしたかった。)とは言え、よくあるバックアップのパターンではまったく困らないと思います。バックアップ面倒だなーと思ってる人は是非一度ためしてみるといいかも知れません。

Pocket