私はそれを言う変数があり、外部から渡されるHOSTNAME
ので、どのスクリプトで実行されるかを知るスクリプトがあります。どのデータセンターがあるかをHOSTNAME
確認しHOSTNAME
、それに基づいて特定のコンピュータのファイルをコピーします。
- アプリケーションサーバーが
HOSTNAME
PHXにある場合は起動する必要がありますholdermachine.phx.host.com
。 - アプリケーションサーバーが
HOSTNAME
SLCにある場合から起動する必要がありますholdermachine.slc.host.com
。 - アプリケーションサーバーが
HOSTNAME
LVSにある場合は、から起動する必要がありますholdermachine.lvs.host.com
。
フェールオーバーシナリオの場合、1つでもholdermachine
失敗した場合、スクリプトは別のデータセンターholdermachine
(ランダムに選択可能)から複製する必要がありますが、ローカルデータセンターがholdermachine
バックアップされたら、リモートデータセンターではなくローカルデータセンターで複製を開始する必要があります。データセンターholdermachine
。また、可能であれば、この問題が終了し、応答がないことをメールでお知らせください。holdermachine
リモートからコピーを開始してくださいholdermachine
。
現時点では、以下HOLDER_LOCATION_phx
のスクリプトはファイルのみをコピーするため、上記のロジックを操作する方法は混乱しています。
#!/bin/bash
export PRIMARY=/test01/primary # copy PRIMARY_PARTITION into this folder
export SECONDARY=/test02/secondary # copy SECONDARY_PARTITION into this folder
readonly HOLDER_LOCATION_phx=(holdermachine.phx.host.com) # we might have more machines in future
readonly HOLDER_LOCATION_slc=(holdermachine.slc.host.com) # we might have more machines in future
readonly HOLDER_LOCATION_lvs=(holdermachine.lvs.host.com) # we might have more machines in future
export HOLDER_LOCATION_1=${HOLDER_LOCATION_phx[0]}
export HOLDER_LOCATION_2=${HOLDER_LOCATION_slc[0]}
export HOLDER_LOCATION_3=${HOLDER_LOCATION_lvs[0]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers and it is being passed from outisde
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers and it is being passed from outisde
export FILE_LOCATION=/batch/data/pk_snapshot
readonly HOSTNAME=$hostname # this is the hostname on which this script will be running where we are copying the files.
readonly FILE_TIMESTAMP=$file_timestamp
export dir3=$FILE_LOCATION/$FILE_TIMESTAMP
# I need to delete before copying the files.
find "$PRIMARY" -mindepth 1 -delete
find "$SECONDARY" -mindepth 1 -delete
do_Copy() {
el=$1
PRIMSEC=$2
scp david@$HOLDER_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$HOLDER_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$HOLDER_LOCATION_3:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.
}
export -f do_Copy
# copying 10 files in parallel simultaneously in primary and secondary folder
parallel --retries 10 -j 10 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" &
parallel --retries 10 -j 10 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" &
wait
echo "All files copied."
今私がすべきことは――
HOSTNAME
PHX、SLC、LVSであることを確認してください。次に、それに基づいてローカルデータセンターでレプリケーションを開始します。- ただし、ローカルデータセンターホルダーマシンでエラーが発生すると、問題の電子メールがリモートデータセンターホルダーマシンからコピーされます。また、ローカルデータセンターコンピュータがバックアップの場合、リモートデータセンターコンピュータの代わりにローカルデータセンターコンピュータで複製が開始されます。
私たちのアプリケーションサーバーのシステム名は次のとおりです。私たちが確認する唯一のことはor.phx.
部分です。また、常に同じ位置にある必要はありません。なぜなら、マシン名に追加の内容があり、後ろまたは後に来るので、正しくチェックする必要があるからです。.slc.
.lvs.
phx
slc
lvs
.phx.
.slc.
.lvs.
appservermachineA.phx.host.com
appservermachineB.slc.host.com
appservermachineC.lvs.host.com
答え1
部品をかなり簡単に取り出す方法はいくつかあります。たとえば、foo.bar.baz.code.provider.com
datacenter="$(echo "$HOSTNAME" | rev | cut -d. -f3 | rev)"
case
データセンター名がこのような単純なパターンと一致しない場合は、シェルパターン全体に基づいてステートメントと一致を使用できます。
case "$HOSTNAME" in
*phx.provider.com) DATACENTER="dc1" ;;
*lax.otherprovider.com) DATACETNER="dc2" ;;
*.weirdness.*) DATACENTER="dc3" ;;
# ⋮
esac
フェールオーバーの場合は、コンピュータがダウンしていることを確認する方法を決定する必要があります。scp
ゼロ以外の終了状態が返される場合、最も簡単な方法は別のシステムを試すことです。これがあなたがやっていることです||
。
parallel
(そこには他にもあります。たとえば、callはシェル関数ではなくコマンドに適用されるため、うまくいかないと確信しています。)
答え2
@derobertの答えに基づいて、次のことができます。
#!/usr/bin/env bash
primary="/test01/primary" # copy primary_partition into this folder
secondary="/test02/secondary" # copy secondary_partition into this folder
holder_location_phx=("holdermachine.phx.host.com") # we might have more machines in future
holder_location_slc=("holdermachine.slc.host.com") # we might have more machines in future
holder_location_lvs=("holdermachine.lvs.host.com") # we might have more machines in future
primary_partition=(550 274 2 546 278) # this will have more file numbers and it is being passed from outisde
secondary_partition=(1643 1103 1372 1096 1369 1568) # this will have more file numbers and it is being passed from outisde
file_location="/batch/data/pk_snapshot"
file_timestamp="$file_timestamp"
dir3="$file_location"/"$file_timestamp"
# I need to delete before copying the files.
find "$primary" -mindepth 1 -delete
find "$secondary" -mindepth 1 -delete
## Find where we are and choose the primary and alternative
## targets accordingly.
case "$HOSTNAME" in
*phx.host.com)
datacenter=("${holder_location_phx[@]}")
alternative1=("${holder_location_slc[@]}")
alternative2=("${holder_location_lvs[@]}")
;;
*lax.host.com)
datacenter=("${holder_location_lax[@]}")
alternative1=("${holder_location_phx[@]}")
alternative2=("${holder_location_lvs[@]}")
;;
*lvs.host.com)
datacenter=("${holder_location_lvs[@]}")
alternative1=("${holder_location_slc[@]}")
alternative2=("${holder_location_phx[@]}")
;;
*) echo "uknown host, exiting." && exit 1 ;;
# ⋮
esac
do_copy() {
el=$1
primsec=$2
scp david@"${datacenter[0]}":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$primsec"/ || scp david@"${alternative1[0]}":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$primsec"/ || scp david@"${alternative2[0]}":"$dir3"/new_weekly_2014_"$el"_200003_5.data "$primsec"/
}
export -f do_copy
# copying 10 files in parallel simultaneously in primary and secondary folder
parallel --retries 10 -j 10 do_copy {} "$primary" ::: "${primary_partition[@]}" &
parallel --retries 10 -j 10 do_copy {} "$secondary" ::: "${secondary_partition[@]}" &
wait
echo "all files copied."
parallel
あなたの電話が有効であるかどうかは全くわかりません。また、スクリプトの他の問題も修正し、少し単純化しました。後でもっとサーバーに拡張したいと言われたので、配列構造を維持しました。これにより、配列に保存されているサーバー名を繰り返す必要があります。現在は、各要素の最初の要素のみを使用します(例${datacenter[0]}
:)。