VPS(仮想専用サーバー)が安くなったので、非常に安価に公開サーバーを構築できるようになった。しかし、バックアップは相変わらず頭を悩ませる問題として残る。データを自動的にバックアップするオプションを追加すれば高価になってしまうし、安価な VPS の場合はサービスが提供されていないことも多い。サーバーを借りた頃はこまめにやっていた手動バックアップも、手間がかかるため少し忙しくなると間隔が開いてしまう。
そこで、LAN 上に Linux マシンを用意して ssh 経由で自動的にバックアップを取得することにした。ssh 経由で行うのは、通信内容を暗号化するためだ。VPS のセキュリティを疑うわけではないが、同一ハードウェア上のシステムで通信を傍受されたり、ネットワーク上で通信内容を傍受される危険性を考えて ssh を利用することにした。難しいことではないが、メモしておかないと忘れてしまうのでブログの記事にする。
ファイルのバックアップ
普通のファイルは、rsync でバックアップを取得している。バックアップするファイルは、主にブログにアップロードした写真(今のところ食べ物ばかり)だ。バックアップ対象には Subversion のリポジトリも含まれている。本来は svnadmin や svn-hot-backup を使うべきなのだが、利用している人数が少ないこと、同一のシステムに戻すことを想定していることから rsync で単純にバックアップしている。以下は、cron に登録して動かしている rsync コマンドの例だ。
/usr/bin/rsync -h -rptgoDv --delete --rsh="ssh -p [ssh のポート番号] -i [秘密鍵のファイル]" [ユーザー]@[サーバーのIPアドレス]:[ソース(バックアップする)ディレクトリ] [ローカルのバックアップ先ディレクトリ]
各オプションの意味は、以下の通り。
- -r
- ディレクトリを再帰的にたどる
- -p
- パーミッションの保持
- -t
- 更新日時の保持
- -g
- グループの保持
- -o
- ファイルのオーナーの保持
- -D
- デバイスやスペシャルファイルの生成
- –delete
- 送信側にないファイルを削除
- –rsh
- rsh の代替を指定
rsh の代替に ssh を指定することで、ssh を利用してバックアップを実現している。
ソース(バックアップする)ディレクトリの指定は注意が必要だ。ディレクトリ名の後にスラッシュがつくと、「指定したディレクトリ以下のファイル」をコピーする。スラッシュをつけないと、「指定したディレクトリ自体」をコピーする。この違いは、–deleteオプションを使うときは、特に気をつけたい。
MySQL のバックアップ
MySQL のバックアップは、mysqldump を利用する。ssh はコマンドを実行して結果を取得できるので、単純に ssh のオプションに実行するコマンド mysqldump とオプションを渡すだけだ。
mysqldump を動作させるためには、ユーザーに「SELECT,SHOW VIEW,LOCK, FILE」の権限を与える必要がある。localhost から接続する形になるので、以下のように権限を与えてある。
GRANT SELECT,SHOW VIEW,LOCK TABLES ON [データベース名].* TO [ユーザー名]@localhost IDENTIFIED BY '[パスワード]'; GRANT FILE ON *.* TO [ユーザー名]@localhost;
以下は、cron に登録している mysqldump を呼び出す ssh コマンドの例だ。
/usr/bin/ssh -p [ssh のポート番号] -i [秘密鍵のファイル] [ユーザー]@[サーバーのIPアドレス] /usr/bin/mysqldump -u [mysql のユーザー] --password='[mysql のパスワード]' [mysql のデータベース] | /bin/gzip -c > mysqldump.sql.gz
単純にバックアップを取得しているだけなので、パイプを使って gzip で圧縮してファイルに保存しているが、ファイル名に日付や数字を含めれば世代バックアップも可能だし、mysql に渡せば MySQL サーバーに流し込むこともできる。