メモ > サーバ > 構築: 管理ツール設定 > rdiff-backup
■rdiff-backup
※Pythonで書かれた逆差分形式のバックアップツール。インストールや設定が比較的容易
外部のサーバへバックアップすることもできる。バックアップ時の通信にはSSHが使われる
※duplicityという、rdiff-backupの派生ツールも良いらしい
また、duplicityをより手軽に扱うためのduplyというツールもあるらしい
■インストール
※この例ではrootアカウントでバックアップを行うものとする
バックアップは外部のバックアップ用サーバ( backup.refirio.net )に行うものとする
バックアップ用サーバでは、SSHでの管理用ユーザ「admin」とrdiff-backupでのバックアップ用ユーザ「backup」があるものとする
一旦 /root/rdiff-backup/ 内にバックアップを作成し、それをrdiff-backupでバックアップするものとする
※公開フォルダの一つ上の階層にログなどのバックアップを作成し、一つ上の階層を丸ごとバックアップするのも有効?
※バックアップ時のSSHでは使用できるコマンドを制限するのも有効
# yum install rdiff-backup … rdiff-backupをインストール
rdiff-backup でリモートバックアップする(基本的な使い方が書かれている)
http://www.usupi.org/sysad/154.html
rdiff-backup をもう少し使いこなす(鍵認証とパスワードの省略について書かれている)
http://www.usupi.org/sysad/155.html
rdiff-backupのリモートバックアップで、SSHのコマンドを制限したい
http://www2.filewo.net/wordpress/2012/05/30/rdiff-backup%E3%81%AE%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%8...
■ローカルバックアップ動作確認
# mkdir /root/mydata … テスト用ディレクトリを作成
# echo test1 > /root/mydata/test1.txt … テスト用ファイルを作成
# rdiff-backup /root/mydata /root/mydata-backup … rdiff-backupでバックアップを実行
# ls /root/mydata-backup … バックアップの内容を確認
# echo test2 > /root/mydata/test2.txt … 追加でファイルを作成
# mkdir /root/mydata/test … 追加でディレクトリを作成
# rdiff-backup /root/mydata /root/mydata-backup … rdiff-backupでバックアップを実行
# ls /root/mydata-backup … バックアップの内容を確認
# rdiff-backup -l /root/mydata-backup … バックアップの履歴を確認する場合
increments.2018-01-28T05:45:03+09:00.dir Sun Jan 28 05:45:03 2018
increments.2018-01-29T05:45:04+09:00.dir Mon Jan 29 05:45:04 2018
increments.2018-01-30T05:45:03+09:00.dir Tue Jan 30 05:45:03 2018
〜中略〜
increments.2018-03-28T17:20:54+09:00.dir Wed Mar 28 17:20:54 2018
increments.2018-03-28T17:20:58+09:00.dir Wed Mar 28 17:20:58 2018
increments.2018-03-28T17:21:59+09:00.dir Wed Mar 28 17:21:59 2018
# rdiff-backup -r now /root/mydata-backup /root/mydata-restore … 最新のバックアップから復元する場合
# rdiff-backup -r 1D /root/mydata-backup /root/mydata-restore … 1日前のバックアップから復元する場合
# rdiff-backup -r 1D /root/mydata-backup/data.sql /root/mydata-restore/data.sql … 特定のデータのみ復元する場合
# rdiff-backup -r 2018-03-28T17:21:59+09:00 /root/mydata-backup /root/mydata-restore … 特定の日時から復元する場合
■リモートバックアップ準備
※PostgreSQLのデータをバックアップする場合、rootからパスワード入力なしでpg_dumpを実行できるようにする
※PostgreSQLにrootを作成し、パスワード入力を省略するためのファイルも作成しておく必要がある
# su - postgres … postgresユーザになる
-bash-4.1$ createuser webmaster … DBユーザー「root」を新規登録
# vi /root/.pgpass … PostgreSQLパスワードファイルを作成
■リモートバックアップ通信準備
☆バックアップ用サーバで作業
#ホスト名:ポート番号:データベース名:ユーザー名:パスワード
localhost:5432:dbname:username:XXXXX
# chmod 600 /root/.pgpass … rootからのみ読み込めるようにする
# pg_dump dbname > /root/pg_dbname.sql … pg_dumpをテスト実行
# mkdir /home/backup/refirio.net … あらかじめバックアップ用ディレクトリを作成
# chown backup. /home/backup/refirio.net … 権限を設定
# vi /etc/sysconfig/iptables … ファイヤーウォールを設定(バックアップ元サーバからのアクセスを許可する / iptablesを使用している場合の設定)
☆バックアップ元サーバで作業
# ssh backup@backup.refirio.net … 一旦バックアップ先へのSSH接続を確認
# ssh-keygen -t rsa … バックアップ元からバックアップ先にSSH接続するための鍵を作成
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): … 空Enter(デフォルトの場所に作成)
Enter passphrase (empty for no passphrase): … 空Enter(パスワード無しの鍵を作成)
Enter same passphrase again: … 空Enter
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
1d:98:e7:f1:6d:04:1c:30:fd:69:c7:b7:3b:6d:e6:40 root@refirio.net
The key's randomart image is:
+--[ RSA 2048]----+
| o+o. |
| o .o. |
| o + ..o |
| + + o+ +|
| S o ..E.o|
| o . |
| . o|
| ++|
| +o|
+-----------------+
# ll /root/.ssh/ … 鍵(id_rsa と id_rsa.pub)の作成を確認
合計 12
-rw------- 1 root root 1675 4月 8 18:09 2015 id_rsa
-rw-r--r-- 1 root root 396 4月 8 18:09 2015 id_rsa.pub
-rw-r--r-- 1 root root 826 4月 8 10:55 2015 known_hosts
# vi /root/.ssh/id_rsa … 秘密鍵の内容を確認
☆バックアップ用サーバで作業
-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAyhAl43U62F5m7i3qv/qiXyANsiE8kZeyXyMcDZnpeguwhRxx
〜略〜
FcSQ5vshGerkb6Aogd0lTsT16WVHW2UPRv0Jef7FTWDaP/BV9w==
-----END RSA PRIVATE KEY-----
# vi /root/.ssh/id_rsa.pub … 公開鍵の内容を確認(アカウントとドメインが記入されているのを確認)
ssh-rsa AAAA〜略〜gzw== root@refirio.net
# vi /home/backup/.ssh/authorized_keys … 作成した公開鍵の内容を入力(すでに鍵ファイルがあれば、ファイルの最後に追記)
☆バックアップ元サーバで作業
ssh-rsa AAAA〜略〜gzw== root@refirio.net
# ssh -i /root/.ssh/id_rsa backup@backup.refirio.net … 秘密鍵を使って、パスワードなしで、バックアップ先へのSSH接続を確認
■リモートバックアップ構築
※シェルスクリプトの内容は、必要に応じて調整する
※シェルスクリプトとして実行する前に、あらかじめ一つ一つのコマンドを叩いてテストする
※一度もバックアップを行っていないと、バックアップの復元はエラーになる
# mkdir /root/rdiff-backup … バックアップ用一時ディレクトリを作成
# vi /root/rdiff-backup.sh … バックアップ用スクリプトを作成
■リモートバックアップから復元テスト&シェルスクリプト実行テスト&自動実行
#!/bin/sh
#システムファイルをバックアップ
tar cfz /root/rdiff-backup/log_backup.tar.gz -C /var log
tar cfz /root/rdiff-backup/etc_backup.tar.gz -C / etc
#MySQLをバックアップ
mysqldump -u username -pXXXXX dbname --default-character-set=binary > /root/rdiff-backup/mysql_dbname.sql
#PostgreSQLをバックアップ
pg_dump dbname > /root/rdiff-backup/pg_dbname.sql
#rdiff-backupにある1ヶ月以上前のバックアップを削除
rdiff-backup --remote-schema 'ssh -i /root/.ssh/id_rsa -C %s rdiff-backup --server' --force --remove-older-than 1M backup@backup.refirio.net::refirio.net
#rdiff-backupにバックアップを作成
rdiff-backup --remote-schema 'ssh -i /root/.ssh/id_rsa -C %s rdiff-backup --server' /root/rdiff-backup backup@backup.refirio.net::refirio.net
#一時的なバックアップファイルを削除
rm -f /root/rdiff-backup/*
# rdiff-backup -r now --remote-schema 'ssh -i /root/.ssh/id_rsa -C %s rdiff-backup --server' backup@backup.refirio.net::refirio.net /root/rdiff-backup-restore
… 最新のバックアップから /root/rdiff-backup-restore に復元テスト
# chmod 700 /root/rdiff-backup.sh … バックアップ用スクリプトに権限を与える
# /root/rdiff-backup.sh … バックアップ実行テスト
# vi /etc/crontab … バックアップ用スクリプトをcronに登録(毎朝5時に実行する場合)
リモートのバックアップサーバにSSHでログイン後、以下のようにして直接取得する方法もある
0 5 * * * root /root/rdiff-backup.sh
# rdiff-backup -r now /root/mydata-backup /root/mydata-restore … 最新のバックアップから復元する場合
■バックアップ用シェルスクリプト例
# vi /root/rdiff-backup.sh
#!/bin/sh
#システムファイルをバックアップ
tar cfz /var/www/vhosts/main/backup/log_backup.tar.gz -C /var log
tar cfz /var/www/vhosts/main/backup/etc_backup.tar.gz -C / etc
#MySQLをバックアップ
mysqldump -u refirio_db -pPNBgxJWM5N members --default-character-set=binary > /var/www/vhosts/main/backup/mysql_members.sql
#PostgreSQLをバックアップ
pg_dump members_pos > /var/www/vhosts/main/backup/pg_members_pos.sql
#rdiff-backupにある古いバックアップを削除
rdiff-backup --remote-schema 'ssh -i /root/.ssh/id_rsa -C %s rdiff-backup --server' --force --remove-older-than 30D backup@backup.example.com::refirio.net
#rdiff-backupにバックアップを作成
rdiff-backup --remote-schema 'ssh -i /root/.ssh/id_rsa -C %s rdiff-backup --server' /var/www/vhosts/main backup@backup.example.com::refirio.net
#一時的なバックアップファイルを削除
rm -f /var/www/vhosts/main/backup/*