RunBefore a RunAfter pomocí nástroje Aplikace Azure Konzistentní snímek
Tento článek obsahuje průvodce používáním --runbefore
a --runafter
schopností nástroje Aplikace Azure Konzistentní snímek, který můžete použít se službou Azure NetApp Files.
Úvod
AzAcSnap může spouštět externí příkazy před nebo po jeho hlavním spuštění pomocí možností --runbefore
nebo --runafter
v uvedeném pořadí.
--runbefore
spustí příkaz prostředí před hlavním spuštěním azacsnap a poskytne některé parametry příkazového řádku azacsnap prostředí.
Ve výchozím nastavení počká až 30 sekund, azacsnap
než se příkaz externího prostředí dokončí, a pak se vrátí do normálního spuštění azacsnap.
Toto zpoždění lze přepsat přidáním čísla, které bude čekat v sekundách po znaku %
(například --runbefore "mycommand.sh%60"
počká až 60 sekund, než mycommand.sh
se dokončí).
--runafter
spustí příkaz prostředí po hlavním spuštění azacsnap a poskytne některé parametry příkazového řádku azacsnap prostředí.
Ve výchozím nastavení počká až 30 sekund, azacsnap
než se příkaz externího prostředí dokončí, a pak se vrátí do normálního spuštění azacsnap.
Můžete ho přepsat tak, --runafter "mycommand.sh%60"
že po znaku %
přidáte číslo, které bude čekat v sekundách (například počká až 60 sekund, než mycommand.sh
se dokončí).
Následující seznam proměnných prostředí je generován azacsnap
a předán prostředí forked ke spuštění příkazů zadaných jako parametry a --runbefore
--runafter
:
$azCommand
= možnost příkazu předaná do -c (například zálohování, testování atd.).$azConfigFileName
= název souboru konfigurace.$azPrefix
= hodnota --prefix.$azRetention
= hodnota --retention.$azSid
= hodnota --dbsid.$azSnapshotName
= název snímku vygenerovaný azacsnap.
Poznámka:
Tato možnost má jenom hodnotu $azSnapshotName
--runafter
.
Příklad využití
Příkladem použití této nové funkce je nahrání snímku do objektu blob Azure pro účely archivace pomocí nástroje azcopy (kopírování nebo přesun dat do služby Azure Storage pomocí AzCopy).
Následující položka crontab je jeden řádek a běží azacsnap
na pěti o půlnoci. Všimněte si volání předání snapshot-to-blob.sh
názvu snímku a předpony snímku:
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')
Tento ukázkový skript prostředí má na konci speciální stanza, která zabrání azAcSnap v zabíjení externího příkazu kvůli vypršení časového limitu popsaného výše. To umožňuje dlouhotrvající příkaz, například nahrávání velkých souborů pomocí azcopy, aby se spouštělo bez předčasného zastavení.
Snímky musí být připojené k systému, který provádí kopírování, s minimálními oprávněními jen pro čtení. Základní umístění přípojného bodu pro snímky by se mělo poskytnout sourceDir
proměnné ve skriptu.
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
Soubor SASkeyFile obsahuje následující příklad klíče SAS (obsah se změnil pro zabezpečení):
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>"