TOP ▲ itcore TOPTIPSbackup.php

CentOS7 バックアップサーバの作成| itcore 2017年

サーバ準備 注意 CentOS7 sshパスワードなし接続 RSync ログ送信 切り替えテスト/障害時

サーバ準備

・本番とは別の物理サーバに作成する。
・ホスト名は本番と同じにする。(VM名には-bkupを付けておく)
・CPUとメモリは本番より小さくする。
・DISKの容量は本番と同じ大きさとするがSSDでなくSATAとする。
・プライベートは別のIPを設定し、デフォルトGWもプライべートにしておく。
・グローバルは本番と同じIPを設定してオフにしておく。

注意

このバックアップ方法は完全ではありません。
完全なバックアップをするには、本番サーバのサービスを停止して、 データの更新を止め、
(さらに、もしあれば)排他的にファイルをオープンしているプロセスを停止する必要があります。
また、コピー対象(&対象外)としているファイルも完全に精査されたものではありません。
ただ、通常のWebアプリケーションはこの方法で、現実的な運用レベルとしてバックアップできると言っていいでしょう。
障害時には手動で切り替えますが、本番サーバが立ち上がらなくなった場合にも迅速にサービスを復旧することができます。

CentOS7

CentOS7をインストールします。
グローバルのnicはオフにして、ゲートウェイはプライベートで設定します。

sshパスワードなし接続

バックアップサーバで公開鍵を作成します。

[バックアップサーバ]
# /usr/bin/ssh-keygen
すべて何も入力しないでenter
enerating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:
SHA256:A4cNSK+QEPCdsyeKdd0icgCpzwHRAmhqGcyTKAcMsLg root@centos7
The key's randomart image is:
+---[RSA 2048]----+
|^*.....          |
|O&oo.o +         |
|B+O + + o        |
|o+.o = +         |
|Eoo.B + S        |
| oo= + . .       |
|. .              |
|                 |
|                 |
+----[SHA256]-----+

生成された公開鍵をメモ帳にコピー
# cat /root/.ssh/id_rsa.pub
sh-rsa AAAAB3N(略)NMYeeyN8x4GyR root@centos7

バックアップサーバの公開鍵を本番サーバに保存します。

[本番サーバ]
# cp -ip /etc/ssh/sshd_config /etc/ssh/sshd_config_`date "+%Y%m%d"`
# vi /etc/ssh/sshd_config
:43
PubkeyAuthentication yes
:47
AuthorizedKeysFile .ssh/authorized_keys # 変更なし
:wq

公開鍵の保存
# mkdir -p /root/.ssh
# vi /root/.ssh/authorized_keys
バックアップサーバの公開鍵を保存
:wq

RSync

[バックアップサーバ]

除外ファイルを指定します。
rootのcronは名前を変えて(cronとして動かない用にして)コピーします。
# mkdir -p /root/bkup
# vi /root/exclude.txt
/boot/
/dev/
/etc/fstab
/etc/sysconfig/
/etc/udev/
/lib/modules/
/lib/udev/
/proc/
/root/
/run/
/sys/
/var/lock/
/var/run/*.pid
/var/run/*/*.pid
/var/spool/cron/root

cron用シェル 10.0.0.34は本番サーバのIP
# vi /root/bkup/rsync.sh
IP=10.0.0.34
scp root@$IP:/var/spool/cron/root /root/bkup/cron_root
rsync -av --delete --exclude-from=/root/exclude.txt root@$IP:/ /

# chmod +x /root/bkup/rsync.sh

cronへ登録 管理表を作って、実行時間が他のバックアップと重ならないようにします。
本番サーバがデータベースを利用している場合は、バックアップの少し前にDBのダンプをファイルとして出力しておきます。
# crontab -e
34 1 * * * /root/bkup/rsync.sh > /root/rsync.log 2>&1

手動で実行
# /root/bkup/rsync.sh | tee /root/rsync.log
最初の実行時にメッセージが出るので、yesとする。
The authenticity of host '10.0.0.34 (10.0.0.34)' can't be established.
ECDSA key fingerprint is SHA256:viswIY4b5J8d33DD4rgihPhKfPtW5vVwehZbTNvRZyc.
ECDSA key fingerprint is MD5:87:e6:18:da:13:e3:c8:13:29:57:3a:15:60:c2:2a:0b.
Are you sure you want to continue connecting (yes/no)? yes
(コピー)
sent 2250521 bytes received 2756021930 bytes 9148499.01 bytes/sec
total size is 3906146129 speedup is 1.42

再起動して立ち上がるか確認します。
# shutdown -r now

翌日、バックアップが正しくとられているか、ログを確認します。
# ls -l /root/rsync.log
# cat /root/rsync.log

ログ送信

REST APIを利用してバックアップの結果をログサーバへ送信します。
REST API でログサーバを作る

# vi /root/log_put.sh
data1=[cron]`crontab -l | grep rsync`
data2=[rsync]`ls -l /root/rsync.log`
data3=[sent]`tail -1 /root/rsync.log`
curl -k -s -S -X POST "https://[host]/log_put.php" \
--data-urlencode "host=`hostname`" \
--data-urlencode "data=$data1 $data2 $data3" \
-u "user:password"
:wq

# chmod +x /root/log_put.sh
# crontab -e
11 1 * * * (/root/bkup/rsync.sh; /root/log_put.sh) > /root/rsync.log 2>&1

切り替えテスト/障害時

本番サーバのグローバルIPを停止します。(あるいはサーバシャットダウン)
バックアップサーバのグローバルIPを起動します。
サービスにアクセスできるか確認します。

状況によっては、以下の必要がある場合があります。
・サービスのリスタート
・DBのインポート
・サーバの再起動

バックアップサーバはパフォーマンスが悪いため、
障害のときは本番サーバを復帰(場合によっては再構築)して、
早めに切り替える必要があります。
更新系があるサーバでは、最新のデータをコピーして切り戻す必要があります。