RunBefore e RunAfter usando app Azure strumento snapshot coerente con app Azure
Questo articolo fornisce una guida per l'uso --runbefore
della funzionalità e --runafter
dello strumento snapshot coerente app Azure cation che è possibile usare con Azure NetApp Files.
Introduzione
AzAcSnap può eseguire comandi esterni prima o dopo l'esecuzione principale usando rispettivamente le opzioni --runbefore
o --runafter
.
--runbefore
esegue un comando shell prima dell'esecuzione principale di azacsnap e fornisce alcuni parametri della riga di comando azacsnap all'ambiente della shell.
Per impostazione predefinita, azacsnap
attende il completamento del comando della shell esterna fino a 30 secondi prima di uccidere il processo e tornare all'esecuzione normale di azacsnap.
Questo ritardo può essere sottoposto a override aggiungendo un numero di attesa in secondi dopo un %
carattere (ad esempio, --runbefore "mycommand.sh%60"
attenderà fino a 60 secondi per mycommand.sh
il completamento).
--runafter
esegue un comando shell dopo l'esecuzione principale di azacsnap e fornisce alcuni parametri della riga di comando azacsnap all'ambiente della shell.
Per impostazione predefinita, azacsnap
attende il completamento del comando della shell esterna fino a 30 secondi prima di uccidere il processo e tornare all'esecuzione normale di azacsnap.
Questo ritardo può essere sottoposto a override aggiungendo un numero di attesa in secondi dopo un %
carattere (ad esempio, --runafter "mycommand.sh%60"
attenderà fino a 60 secondi per mycommand.sh
il completamento).
azacsnap
genera l'elenco seguente di variabili di ambiente e le passa alla shell tramite fork per eseguire i comandi forniti come parametri a --runbefore
e --runafter
:
-
$azCommand
= l'opzione di comando passata a -c (ad esempio, backup, test e così via). -
$azConfigFileName
= nome file di configurazione. -
$azPrefix
= valore --prefix. -
$azRetention
= il valore --retention. -
$azSid
= valore --dbsid. -
$azSnapshotName
= nome dello snapshot generato da azacsnap.
Nota
Esiste solo un valore per $azSnapshotName
nell'opzione --runafter
.
Esempio di utilizzo per eseguire il backup nell'archivio BLOB di Azure
Importante
Gli esempi vengono forniti solo a scopo informativo. Non garantiamo l'accuratezza, la completezza o l'utilità delle informazioni fornite. L'uso di questi esempi è a proprio rischio. Non accettiamo alcuna responsabilità per eventuali perdite o danni derivanti dall'uso di questi esempi. Non è disponibile il supporto per gli esempi forniti in questa documentazione.
Un esempio di utilizzo per questa nuova funzionalità consiste nel caricare uno snapshot nel BLOB di Azure a scopo di archiviazione usando lo azcopy
strumento (copiare o spostare i dati in Archiviazione di Azure usando AzCopy).
Script della shell da caricare nell'archiviazione BLOB di Azure
Questo script della shell di esempio ha una stanza speciale alla fine per impedire ad AzAcSnap di uccidere il comando esterno a causa del timeout descritto in precedenza. Questa stanza consente l'esecuzione di un comando a esecuzione prolungata, ad esempio il caricamento di file di grandi dimensioni con azcopy, per l'esecuzione senza essere interrotto prematuramente.
Gli snapshot devono essere montati nel sistema che esegue la copia, con un privilegio di sola lettura minimo. La posizione di base del punto di montaggio per gli snapshot deve essere fornita alla sourceDir
variabile nello script.
Lo snapshot viene caricato come singolo file usando il tar
comando per creare un tarball con gzipped. L'inserimento dei file in un singolo tarball mantiene le autorizzazioni e la proprietà del file, altrimenti il caricamento dei file perde singolarmente questi attributi.
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 contiene la chiave di firma di accesso condiviso di esempio seguente (contenuto modificato per la sicurezza):
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>"
Pianificazione dello script della shell
La voce crontab seguente è una singola riga e viene eseguita azacsnap
alle 12:05. Si noti la chiamata al snapshot-to-blob.sh
passaggio del nome dello snapshot e del prefisso dello snapshot:
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')
Ripristino da Archiviazione BLOB di Azure
Il ripristino da uno di questi archivi archiviati nell'archiviazione BLOB di Azure a livello generale è il seguente:
- Copiare nuovamente l'archivio snapshot nel computer locale. Il percorso di destinazione deve essere separato dai file di database e con capacità sufficiente per consentire l'archivio file e l'estrazione, ad esempio
/var/tmp
.- Se l'archivio è stato creato usando lo
--runafter
script della shell di esempio, è possibile estrarre il tarball con gzipped direttamente dall'archivio BLOB di Azure nella posizione di destinazione usando una pipe AzCopy per tar per estrarre, ad esempio:cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- Se l'archivio è stato creato usando lo
- Estrarre il contenuto dell'archivio snapshot.
- Esaminare il contenuto del percorso di destinazione dopo l'estrazione, confrontando le autorizzazioni dei file e la proprietà con i file di database originali.
- Ad esempio, eseguire
ls -lR
.
- Ad esempio, eseguire
- Arrestare i processi del server di database.
- Copiare i file dal percorso di destinazione ripristinato nel passaggio 1 nel percorso originale.
- Procedere con il normale processo di ripristino del database.