思考実験とD.I.Y.

D.I.Y and Gedankenexperiment

【FreeBSD13.5/13.4】ファイルサーバーのpoolの複製を作成(2):スクリプト作成とcrontab設定

”lsyncd”を使えば、メインファイルサーバー上でファイルが修正・追加・削除が行われたら、すぐにレプリケートサーバーに転送する設定は行えます。

ただ、まだしっかりと”lsyncd”の設定方法を振り返り・検証を行っていませんので、とりあえず、cronでスクリプトを定期的に動かして、メインファイルサーバー上のファイルシステムを定期的に複製する事にしました。

*1

  • 小生の健忘禄、兼作業記録になっていますことをお詫び申し上げます🙇‍♂️

昔、”Vine Linux4.2”と"FreeBSD8.4"で”lsyncd”を試したことがありますが、当時は、”FreeBSD”上ではlsyncdを動かすことが出来なかったので、途中で検証をやめてしまいました😅。。。。

現在は、FreeBSDで"lsyncd"を使うことが出来る様ですが、設定方法を完全に忘れているのと、動作の確認を終えていません😅。

”lsyncd”の検証を終えるまでの間、メインファイルサーバーのファイルシステムのバックアップは定期的に取っておきたいところですので、とりあえず、手前勝手なスクリプトとcrontabで最低限のバックアップを取るようにしておくことにしました(*2)😅。

1. スクリプト作成(参考)

  • スクリプトは、例外処理の検討はまだ、かなり甘い上、Linuxでも使えるようにするためには、各コマンドの絶対パスを正規化する必要があるため、あくまで参考として紹介させていただきます。

各種サーバーで使うことを前提に、共通化できる部分を1つのスクリプトにし、各サーバー固有の設定は、共通化スクリプトにパラメータを与えて実行することで、メンテナンス性を考慮してみました。

(1)共通スクリプト

まずは、各サーバーで共通のスクリプトを作成します。

 

root@mainsv:# vi /share/scripts/common/rsync_sv2sv.sh    

下記の内容で作成します。

#!/bin/sh

RSYNC=/usr/local/bin/rsync
RHOST=$1
RDIR=$2
RSYNCOPTS=$3
PARAMFLAG=0

if [ "$RHOST" == "" ]; then
        echo "Require Remote Host Name"
        PARAMFLAG=1
fi

if [ "$RDIR" == "" ]; then
        echo "Require Target Directory"
        PARAMFLAG=1
fi

if [ $PARAMFLAG -eq 1 ]; then
        echo "Usage : rsync_sv2sv.sh [Remote Host Name] [Target Directory] [rsync options]"
        exit
fi

SERVNET=`/usr/bin/netstat -nr | /usr/bin/grep -q 192.168.[aaa+1].0`
if [ $? -eq 0 ]; then
        RHOSTNAME="$RHOST""2"
elif [ $? -eq 1 ]; then
        RHOSTNAME="$RHOST"
else
        echo "Error"
        exit
fi

$RSYNC -avhz  $RSYNCOPTS --rsync-path='sudo /usr/local/bin/rsync' -e "ssh -i /root/rsync/.ssh/rsync" _rsync@$RHOSTNAME:/$RDIR/ /Replicate/$RHOST/$RDIR/


 
  
  
   
  

パラメータが指定されているかの判定フラグを初期化。   
   
  
  
パラメータ指定の判定フラグを負値に   
  
  
  
  
  パラメータ指定の判定フラグを負値に    
  
   

  
  
  
 パラメータ指定の判定フラグが負値の場合、スクリプト停止。  
  
  
  
grepの”
-q”オプションで戻り値のみを返すようにする。
戻り値を判定。

 
  
  
  
  
  
   
 
 
 
”--delete”オプションはハードコーディングせず、”3つ目のパラメータ”で与える。 

rsyncの”--delete”オプション(*3)はあえて、必要に応じて”3つ目のパラメータ”で与えることにして、ハードコーディングはしないことにしました🤔。

結果的に、3つ目のパラメータを与えない場合、コピー元で削除されたファイルが、コピー先で削除されないので、レプリケートサーバー側のディスクがひっ迫することもあり得ます😅。

ただし、誤って、メインファイルサーバーで削除したファイルも、レプリケートサーバー上に残っているので、回復できるメリットもあります😀。

運用しながら、レプリケートサーバー側のディスクがひっ迫してきらたら、手動でスクリプトを”--delete”オプションを与えて実行して整理する事にしました😀。

root@mainsv:# chmod +x  /share/scripts/common/rsync_sv2sv.sh ; スクリプトに実行許可を与える。

 

(2)Replicateサーバー用スクリプト

Replicateサーバー専用のスクリプトを作ります。

root@mainsv:# vi /share/scripts/replsv/rsync_mainsv2replsv.sh    

 

下記の内容で作成します。

#!/bin/sh

RSYNC_SV2SV="/share/scripts/common/rsync_sv2sv.sh"

$RSYNC_SV2SV mainsv /Home
$RSYNC_SV2SV mainsv /Share/etc --delete





 

 

root@mainsv :# chmod +x  /share/scripts/common/rsync_mainsv2replsv.sh ; スクリプトに実行許可を与える。
(3)スクリプトのテスト

スクリプトが機能するか確認します。

root@replsv:# /share/scripts/ares/rsync_mainsv2replsv.sh    

 

スクリプト--delete”オプションを与えた行については、メインファイルサーバー上で削除されたフォルダはrsyncによってコピー先でも削除されています😀。

2. crontabの設定

crontabを設定します。

 

root@replsv:# crontab -e    

 

下記の内容で作成します。

0 * * * * /share/scripts/replsv/rsync_mainsv2replsv.sh

毎時0分に実行。

 

 

”/var/log/cron”を確認して、スクリプトが起動されたかを確認しておきます。

root@replsv:# tail -f /var/log/cron    

 

 

【次回に続く予定】

ブログランキング・にほんブログ村へにほんブログ村 IT技術ブログへ

出典・引用・備考

*1:この投稿の内容は、特定の機種並びに特定の環境での確認結果になります。同等機種や異なる環境での動作他を保証するものではありませんので、ご留意いただけます様お願いいたします。

*2:機械が出来ることは機械に任せておくことにしています。

*3:コピー元で削除されたファイルをコピー先から削除するオプションです。