ローカルデータセンターからローカルデータセンターにファイルをコピーし、いくつかのフェイルオーバーを実行するには?

ローカルデータセンターからローカルデータセンターにファイルをコピーし、いくつかのフェイルオーバーを実行するには?

私はそれを言う変数があり、外部から渡されるHOSTNAMEので、どのスクリプトで実行されるかを知るスクリプトがあります。どのデータセンターがあるかをHOSTNAME確認しHOSTNAME、それに基づいて特定のコンピュータのファイルをコピーします。

  • アプリケーションサーバーがHOSTNAMEPHXにある場合は起動する必要がありますholdermachine.phx.host.com
  • アプリケーションサーバーがHOSTNAMESLCにある場合から起動する必要がありますholdermachine.slc.host.com
  • アプリケーションサーバーがHOSTNAMELVSにある場合は、から起動する必要があります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."

今私がすべきことは――

  • HOSTNAMEPHX、SLC、LVSであることを確認してください。次に、それに基づいてローカルデータセンターでレプリケーションを開始します。
  • ただし、ローカルデータセンターホルダーマシンでエラーが発生すると、問題の電子メールがリモートデータセンターホルダーマシンからコピーされます。また、ローカルデータセンターコンピュータがバックアップの場合、リモートデータセンターコンピュータの代わりにローカルデータセンターコンピュータで複製が開始されます。

私たちのアプリケーションサーバーのシステム名は次のとおりです。私たちが確認する唯一のことはor.phx.部分です。また、常に同じ位置にある必要はありません。なぜなら、マシン名に追加の内容があり、後ろまたは後に来るので、正しくチェックする必要があるからです。.slc..lvs.phxslclvs.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]}:)。

関連情報