以下、バックアップの方針に基づいて、CentOSサーバー間で、バックアップ設定した手順。
0.環境
転送元サーバー:CentOS 8.2
ホスト名(例):www.xxservice.com
グローバルアドレス(例):222.222.222.222
プライベートネットワークアドレス(例):10.10.10.1
sshdポート(例):7777
バックアップを実行するユーザー(例):appuser
転送先サーバー1:CentOS 7.8
ホスト名(例):bak1.xxservice.com
プライベートネットワークアドレス(例):10.10.10.200
sshdポート(例):8888
転送先サーバー2:CentOS 7.8
ホスト名(例):bak2.xxservice.com
転送元サーバーとは別拠点で、プライベートネットワーク未接続
sshdポート(例):9999
1.転送先サーバーの設定
バックアップ用ユーザー(例):backupuser
バックアップディレクトリ(例):/home/backupuser/xxservice/
1-1)sshd_configの修正
/etc/ssh/sshd_configの設定が以下となるようにする。
ホストベース認証を有効
ホストベース認証の既知ホストは、ユーザーディレクトリ下を許可
ユーザーディレクトリ下の.shostsを有効にする。
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
HostbasedAuthentication yes
# Change to yes if you don't trust ~/.ssh/known_hosts for HostbasedAuthentication
IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts no
後、プライベートネットワークでは逆引きできない。余計なログを出さないようにUseDNSがyesの場合は、noに変更する。
UseDNS no
設定変更後に、設定の読み込み。
$ systemctl reload sshd
1-2)rootユーザーへのスイッチ禁止
/etc/pam.d/suで、以下を設定し、rootユーザへのスイッチを禁止する。
auth required pam_wheel.so use_uid root_only
1-3)バックアップ用ユーザー作成
$ adduser backupuser
1-4)バックアップ用ディレクトリ作成
$ su - backupuser
[backupuser ~]$ mkdir xxservice
1-5)既知ホストの追加
バックアップユーザーで、転送元サーバーにssh接続を試みて、公開鍵を取得して既知ホストに登録する。
※転送先サーバー1の場合
[backupuser ~]$ ssh -p 7777 10.10.10.1
※転送先サーバー2の場合
[backupuser ~]$ ssh -p 7777 www.xxservice.com
既知ホストに追加するかと聞いてくるので、yesで登録すると、~/.ssh/known_hostsに登録される。
ポート番号が入った形で登録されるので、viコマンドで修正する。
※転送先サーバー2の場合、以下のように修正する
[www.xxservice.com]:7777,[222.222.222.222]:7777 (公開鍵)
↓
www.xxservice.com,222.222.222.222 (公開鍵)
1-6).shostsの設定
viコマンドで、.shostsファイルを作成し、中身は以下とする。転送元サーバーのIPアドレスを設定する。
※転送先サーバー1の場合
10.10.10.1 appuser
※転送先サーバー2の場合
222.222.222.222 appuser
パーミッションを変更して、.shostsファイルを見えないようにする。
[backupuser ~]$ chmod 600 .shosts
2.転送元サーバーの設定
2-1)ssh_configの修正
従来はssh_configを直接修正していたが、CentOS 8.2 では、以下ディレクトリにファイル追加するのが作法みたい。
/etc/ssh/ssh_config.d/99-hostbase.confを、以下内容で作成する。
HostbasedAuthentication yes
EnableSSHKeysign yes
2-2)既知ホストの追加と接続確認
以下コマンドで接続し、既知ホストに追加するかと聞いてくるので、yesで登録する。
※転送先サーバー1への接続
[appuser ~]$ ssh -p 8888 -l backupuser 10.10.10.200
※転送先サーバー2
[appuser ~]$ ssh -p 9999 -l backupuser bak2.xxservice.com
問題なければ、無事にログインできる。
2-3)バックアップ処理の登録
以下のコマンドを作成して、実行権を付けて、cron実行する。
2-3-1)バックアップコマンド
do_backupという名前で以下ファイルを作成する。timeコマンドで実行時間を計測しながら、低優先度でバックアップを実行する。
引数は、バックアップサーバーのアドレス、ポート、バックアップファイルの接尾辞で、このコマンドは、バッチから引数を渡されて実行される。
【do_backup】
#!/bin/sh
#
alias dotime='time ionice -c 2 -n 7 nice -n 19'
# param
if [ $# -ne 3 ]; then
echo "param error!!"
exit 1
fi
BACKUP_SERVER=$1
BACKUP_SERVER_PORT=$2
BACKUP_SUFFIX=$3
# file setting
BIN_DIR=(コマンドの配置ディレクトリ)
BACKUP_DIR=(バックアップファイルを置くディレクトリ)
BACKUP_LOG="$BACKUP_DIR/bak_$BACKUP_SUFFIX.log"
BACK_FILE_DB="$BACKUP_DIR/dbbak_$BACKUP_SUFFIX"
APP_DIR=(アプリケーションデータのディレクトリ)
BACK_APP_DIR="$BACKUP_DIR/appdata/"
TRNS_DB_DIR="/home/backupuser/xxservice/"
TRNS_APP_DIR="/home/backupuser/xxservice/appdata/"
#--------------------------------------------------
# Start
echo "---- START : `date`" > $BACKUP_LOG
####################
# DB
echo "---- DB S : `date`" >> $BACKUP_LOG
(dotime $BIN_DIR/do_db_backup $BACK_FILE_DB &>> $BACKUP_LOG) &>> $BACKUP_LOG
echo "---- DB GZIP S : `date`" >> $BACKUP_LOG
(dotime gzip -f $BACK_FILE_DB &>> $BACKUP_LOG) &>> $BACKUP_LOG
####################
# APP
echo "---- APP S : `date`" >> $BACKUP_LOG
(dotime rsync -auv --rsync-path="ionice -c 2 -n 7 nice -n 19 rsync" \
$APP_DIR $BACK_APP_DIR &>> $BACKUP_LOG) &>> $BACKUP_LOG
####################
# Transfer
# transfer DB backup
echo "---- TRN DB S : `date`" >> $BACKUP_LOG
(dotime scp -P $BACKUP_SERVER_PORT $BACK_FILE_DB.gz ubackup@$BACKUP_SERVER:$TRNS_DB_DIR \
&>> $BACKUP_LOG) &>> $BACKUP_LOG
# transfer APP backup
echo "---- TRN APP S : `date`" >> $BACKUP_LOG
(dotime rsync -auvz -e "ssh -p $BACKUP_SERVER_PORT" $BACK_APP_DIR \
ubackup@$BACKUP_SERVER:$TRNS_APP_DIR &>> $BACKUP_LOG) &>> $BACKUP_LOG
# End
echo "---- END : `date`" >> $BACKUP_LOG
最初のrsyncで、–rsync-path=”ionice -c 2 -n 7 nice -n 19 rsync”オプションを付けているのは、受信側も同じアプリサーバーのため優先度を下げている。転送時には付けていないのは、転送先サーバーはバックアップ専用のため、優先度を気にしなくていいため。
2-3-2)DBバックアップコマンド
do_db_backupという名前で以下ファイルを作成する。3-1)バックアップコマンドから呼ばれるコマンドで、DBに応じたコマンドを作成する。
【do_db_backup】
※MariaDBの例
#!/bin/sh
#
# $1: backup file name
#
mysqldump --user=(DBユーザー) --password=(DBパスワード) --single-transaction (データベース名) > $1
※PostgreSQLの例
#!/bin/sh
#
# $1: backup file name
#
pg_dump -Fc -b (データベース名)> $1
2-3-3)実行コマンド
バッチで実行するための、以下の2つのファイルを作成する。
【BACKUP_HOURLY】
#!/bin/sh
#
BACKUP_SERVER=10.10.10.200
BACKUP_SERVER_PORT=8888
BACKUP_SUFFIX=h`date +%H`
(コマンドの配置ディレクトリ)/do_backup \
$BACKUP_SERVER $BACKUP_SERVER_PORT $BACKUP_SUFFIX
【BACKUP_DAILY】
#!/bin/sh
#
BACKUP_SERVER=bak2.xxservice.com
BACKUP_SERVER_PORT=9999
BACKUP_SUFFIX=d`date +%d`
(コマンドの配置ディレクトリ)/do_backup \
$BACKUP_SERVER $BACKUP_SERVER_PORT $BACKUP_SUFFIX
2-4)cron設定
“crontab -e”で、実行コマンドをスケジューリングする。
毎時42分と、毎日3時13分にバックアップする設定の例。
# m h dom mon dow command
42 * * * * (コマンドの配置ディレクトリ)/BACKUP_HOURLY
13 3 * * * (コマンドの配置ディレクトリ)/BACKUP_DAILY