나는 그것을 말할 변수가 있고 외부에서 전달되기 HOSTNAME
때문에 어떤 스크립트에서 실행될지 아는 스크립트를 가지고 있습니다 . 어떤 데이터 센터가 있는지 HOSTNAME
확인 HOSTNAME
하고 이를 기반으로 특정 컴퓨터의 파일을 복사하겠습니다.
- 애플리케이션 서버가
HOSTNAME
PHX에 있는 경우 에서 시작해야 합니다holdermachine.phx.host.com
. - 애플리케이션 서버가
HOSTNAME
SLC에 있는 경우 에서 시작해야 합니다holdermachine.slc.host.com
. - 어플리케이션 서버가
HOSTNAME
LVS에 있다면, 에서 시작해야 합니다holdermachine.lvs.host.com
.
이제 장애 조치 시나리오의 경우 하나라도 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
0이 아닌 종료 상태가 반환되는 경우 가장 쉬운 방법은 다른 시스템을 사용해 보는 것입니다. 이것이 당신이 하고 있는 일입니다 ||
.
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]}
).