以下、バックアップの方針に基づいて、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