Azure 애플리케이션 일관성 스냅샷 도구를 사용하는 RunBefore 및 RunAfter
이 문서에서는 Azure NetApp Files와 함께 사용할 수 있는 Azure Application Consistent Snapshot 도구의 --runbefore
및 --runafter
기능을 사용하기 위한 가이드를 제공합니다.
소개
AzAcSnap은 각각 --runbefore
또는 --runafter
옵션을 사용하여 기본 실행 전후에 외부 명령을 실행할 수 있습니다.
--runbefore
은 azacsnap의 기본 실행 전에 셸 명령을 실행하고 일부 azacsnap 명령줄 매개 변수를 셸 환경에 제공합니다.
기본적으로 azacsnap
은 프로세스를 종료하고 azacsnap 일반 실행으로 돌아가기 전에 외부 셸 명령이 완료될 때까지 최대 30초 동안 기다립니다.
이 지연은 %
문자 뒤에 대기할 숫자(예: --runbefore "mycommand.sh%60"
은 mycommand.sh
가 완료될 때까지 최대 60초 대기)를 추가하여 무시할 수 있습니다.
--runafter
는 azacsnap의 기본 실행 후 셸 명령을 실행하고 일부 azacsnap 명령줄 매개 변수를 셸 환경에 제공합니다.
기본적으로 azacsnap
은 프로세스를 종료하고 azacsnap 일반 실행으로 돌아가기 전에 외부 셸 명령이 완료될 때까지 최대 30초 동안 기다립니다.
이는 %
문자 뒤에 대기할 숫자를 추가하여 재정의할 수 있습니다(예: --runafter "mycommand.sh%60"
은 mycommand.sh
가 완료될 때까지 최대 60초 동안 기다립니다).
다음 환경 변수 목록은 azacsnap
에 의해 생성되고 --runbefore
및 --runafter
에 대한 매개 변수로 제공된 명령을 실행하기 위해 포크된 셸로 전달됩니다.
$azCommand
= -c에 전달된 명령 옵션(예: backup, test 등).$azConfigFileName
= 구성 파일 이름.$azPrefix
= --prefix 값.$azRetention
= --retention 값.$azSid
= --dbsid 값.$azSnapshotName
= azacsnap에서 생성한 스냅샷 이름입니다.
참고 항목
--runafter
옵션에는 $azSnapshotName
에 대한 값만 있습니다.
예제 사용
이 새 기능의 사용 예는 azcopy 도구(AzCopy를 사용하여 Azure Storage로 데이터 복사 또는 이동)를 사용하여 보관 목적으로 Azure Blob에 스냅샷을 업로드하는 것입니다.
다음 crontab 항목은 한 줄이며 자정 이후 5시에 azacsnap
를 실행합니다. 스냅샷 이름과 스냅샷 접두사를 전달하는 snapshot-to-blob.sh
에 대한 호출에 유의합니다.
5 0 * * * ( . ~/.bash_profile ; cd /home/azacsnap/bin ; ./azacsnap -c backup --volume data --prefix daily --retention 1 --configfile HANA.json --trim --ssl openssl --runafter 'env ; ./snapshot-to-blob.sh $azSnapshotName $azPrefix')
이 셸 스크립트 예에는 AzAcSnap이 앞에서 설명한 시간 제한으로 인해 외부 명령을 종료하는 것을 방지하기 위해 끝에 특수 스탠자가 있습니다. 이를 통해 azcopy를 사용하여 대용량 파일을 업로드하는 것과 같은 장기 실행 명령을 조기에 중지하지 않고 실행할 수 있습니다.
스냅샷은 최소 읽기 전용 권한으로 복사를 수행하는 시스템에 탑재되어야 합니다. 스냅샷 탑재 지점의 기본 위치는 스크립트의 sourceDir
변수에 제공되어야 합니다.
cat snapshot-to-blob.sh
#!/bin/bash
# Utility to upload-to/list Azure Blob store.
# If run as snapshot-to-blob.sh will upload a gzipped tarball of the snapshot.
# If run as list-blobs.sh will list uploaded blobs.
# e.g. `ln -s snapshot-to-blob.sh list-blobs.sh`
# _START_ Change these
SAS_KEY_FILE="${HOME}/bin/blob-credentials.saskey"
# the snapshots need to be mounted locally for copying, put source directory here
SOURCE_DIR="/mnt/saphana1/hana_data_PR1/.snapshot"
# _END_ Change these
# _START_ AzCopy Settings
#Overrides where the job plan files (used for progress tracking and resuming) are stored, to avoid filling up a disk.
export AZCOPY_JOB_PLAN_LOCATION="${HOME}/.azcopy/plans/"
#Overrides where the log files are stored, to avoid filling up a disk.
export AZCOPY_LOG_LOCATION="${HOME}/.azcopy/logs/"
#If set, to anything, on-screen output will include counts of chunks by state
export AZCOPY_SHOW_PERF_STATES=true
# _END_ AzCopy Settings
# do not change any of the following
# Make sure we got some command line args
if [ "$(basename "$0")" = "snapshot-to-blob.sh" ] && ([ "$1" = "" ] || [ "$2" = "" ]); then
echo "Usage: $0 <SNAPSHOT_NAME> <PREFIX>"
exit 1
fi
# Make sure we can read the SAS key credential file.
if [ -r "${SAS_KEY_FILE}" ]; then
source "${SAS_KEY_FILE}"
else
echo "Credential file '${SAS_KEY_FILE}' not found, exiting!"
fi
# Assign the rest of the Global variables.
SNAPSHOT_NAME=$1
PREFIX=$2
BLOB_STORE="$(echo "${PORTAL_GENERATED_SAS}" | cut -f1 -d'?')"
BLOB_SAS_KEY="$(echo "${PORTAL_GENERATED_SAS}" | cut -f2 -d'?')"
ARCHIVE_LOG="logs/$(basename "$0").log"
# Archive naming (daily.1, daily.2, etc...)
DAY_OF_WEEK=$(date "+%u")
MONTH_OF_YEAR=$(date "+%m")
ARCHIVE_BLOB_TGZ="${PREFIX}.${DAY_OF_WEEK}.tgz"
#######################################
# Write to the log.
# Globals:
# None
# Arguments:
# LOG_MSG
#######################################
write_log(){
LOG_MSG=$1
date=$(date "+[%d/%h/%Y:%H:%M:%S %z]")
echo "$date ${LOG_MSG}" >> "${ARCHIVE_LOG}"
}
#######################################
# Run and Log the command.
# Globals:
# None
# Arguments:
# CMD_TO_RUN
#######################################
run_cmd(){
CMD_TO_RUN="${1}"
write_log "[RUNCMD] ${CMD_TO_RUN}"
bash -c "${CMD_TO_RUN}"
}
#######################################
# Check snapshot exists and then background the upload to Blob store.
# Globals:
# SOURCE_DIR
# SNAPSHOT_NAME
# ARCHIVE_LOG
# Arguments:
# None
#######################################
snapshot_to_blob(){
# Check SOURCE_DIR and SNAPSHOT_NAME exist
if [ ! -d "${SOURCE_DIR}/${SNAPSHOT_NAME}" ]; then
echo "${SOURCE_DIR}/${SNAPSHOT_NAME} not found, exiting!" | tee -a "${ARCHIVE_LOG}"
exit 1
fi
# background ourselves so AzAcSnap exits cleanly
echo "Backgrounding '$0 $@' to prevent blocking azacsnap"
echo "write_logging to ${ARCHIVE_LOG}"
{
trap '' HUP
# the script
upload_to_blob
list_blob >> "${ARCHIVE_LOG}"
} < /dev/null > /dev/null 2>&1 &
}
#######################################
# Upload to Blob store.
# Globals:
# SOURCE_DIR
# SNAPSHOT_NAME
# ARCHIVE_BLOB_TGZ
# BLOB_STORE
# BLOB_SAS_KEY
# ARCHIVE_LOG
# Arguments:
# None
#######################################
upload_to_blob(){
# Copy snapshot to blob store
echo "Starting upload of ${SNAPSHOT_NAME} to ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
run_cmd "azcopy env ; cd ${SOURCE_DIR}/${SNAPSHOT_NAME} && tar zcvf - * | azcopy cp \"${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}\" --from-to PipeBlob && cd -"
echo "Completed upload of ${SNAPSHOT_NAME} ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
# Complete
echo "Finished ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")" >> "${ARCHIVE_LOG}"
echo "--------------------------------------------------------------------------------" >> "${ARCHIVE_LOG}"
# col 12345678901234567890123456789012345678901234567890123456789012345678901234567890
}
#######################################
# List contents of Blob store.
# Globals:
# BLOB_STORE
# BLOB_SAS_KEY
# Arguments:
# None
#######################################
list_blob(){
LOG_MSG="Current list of files stored in ${BLOB_STORE}"
write_log "${LOG_MSG}"
echo "${LOG_MSG}"
run_cmd "azcopy list \"${BLOB_STORE}?${BLOB_SAS_KEY}\" --properties LastModifiedTime "
}
# Log when script started.
write_log "Started ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")"
# Check what this was called as ($0) and run accordingly.
case "$(basename "$0")" in
"snapshot-to-blob.sh" )
snapshot_to_blob
;;
"list-blobs.sh" )
list_blob
;;
*)
echo "Command '$0' not recognised!"
;;
esac
saskeyFile에는 다음 예 SAS 키(보안을 위해 변경된 콘텐츠)가 포함되어 있습니다.
cat blob-credentials.saskey
# we need a generated SAS key, get this from the portal with read,add,create,write,list permissions
PORTAL_GENERATED_SAS="https://<targetstorageaccount>.blob.core.windows.net/<blob-store>?sp=racwl&st=2021-06-10T21:10:38Z&se=2021-06-11T05:10:38Z&spr=https&sv=2020-02-10&sr=c&sig=<key-material>"