RunBefore och RunAfter med verktyget Azure Application Consistent Snapshot
Den här artikeln innehåller en guide för att använda --runbefore
och --runafter
funktionen för verktyget Azure Application Consistent Snapshot som du kan använda med Azure NetApp Files.
Introduktion
AzAcSnap kan köra externa kommandon före eller efter huvudkörningen med hjälp av alternativen --runbefore
eller --runafter
respektive.
--runbefore
kör ett gränssnittskommando före huvudkörningen av azacsnap och tillhandahåller några av kommandoradsparametrarna azacsnap till shell-miljön.
Som standard azacsnap
väntar upp till 30 sekunder innan det externa gränssnittet slutförs innan processen avslutas och återgår till normal körning av azacsnap.
Den här fördröjningen kan åsidosättas genom att lägga till ett tal som ska vänta i sekunder efter ett %
tecken (till exempel --runbefore "mycommand.sh%60"
väntar upp till 60 sekunder på mycommand.sh
att slutföras).
--runafter
kör ett gränssnittskommando efter huvudkörningen av azacsnap och tillhandahåller några av kommandoradsparametrarna azacsnap till shell-miljön.
Som standard azacsnap
väntar upp till 30 sekunder innan det externa gränssnittet slutförs innan processen avslutas och återgår till normal körning av azacsnap.
Detta kan åsidosättas genom att lägga till ett tal att vänta i sekunder efter ett %
tecken (till exempel --runafter "mycommand.sh%60"
väntar i upp till 60 sekunder för mycommand.sh
att slutföra).
Följande lista över miljövariabler genereras av azacsnap
och skickas till gränssnittets förgrening för att köra kommandona som anges som parametrar till --runbefore
och --runafter
:
$azCommand
= kommandoalternativet som skickades till -c (till exempel säkerhetskopiering, test osv.).$azConfigFileName
= konfigurationsfilens namn.$azPrefix
= --prefix-värdet.$azRetention
= värdet --retention.$azSid
= värdet --dbsid.$azSnapshotName
= namnet på ögonblicksbilden som genereras av azacsnap.
Kommentar
Det finns bara ett värde för $azSnapshotName
i --runafter
alternativet .
Exempel på användning
Ett exempel på användning för den här nya funktionen är att ladda upp en ögonblicksbild till Azure Blob i arkiveringssyfte med hjälp av azcopy-verktyget (Kopiera eller flytta data till Azure Storage med hjälp av AzCopy).
Följande crontab-post är en enda rad och körs azacsnap
vid fem efter midnatt. Observera anropet till att snapshot-to-blob.sh
skicka ögonblicksbildens namn och prefix för ögonblicksbild:
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')
Det här exempelskriptet har en särskild strof i slutet för att förhindra att AzAcSnap dödar det externa kommandot på grund av den timeout som beskrevs tidigare. Detta gör att ett tidskrävande kommando, till exempel att ladda upp stora filer med azcopy, kan köras utan att stoppas i förtid.
Ögonblicksbilderna måste monteras på systemet som gör kopian, med minst skrivskyddad behörighet. Basplatsen för monteringspunkten för ögonblicksbilderna ska anges för variabeln sourceDir
i skriptet.
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 innehåller följande exempel på SAS-nyckel (innehåll har ändrats för säkerhet):
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>"