RunBefore dan RunAfter menggunakan alat Azure Application Consistent Snapshot
Artikel ini menyediakan panduan untuk menggunakan --runbefore
dan --runafter
kemampuan alat Azure Application Consistent Snapshot yang dapat Anda gunakan dengan Azure NetApp Files.
Pendahuluan
AzAcSnap dapat menjalankan perintah eksternal sebelum atau sesudah eksekusi utamanya menggunakan opsi --runbefore
atau --runafter
masing-masing.
--runbefore
akan menjalankan perintah shell sebelum eksekusi utama azacsnap dan menyediakan beberapa parameter baris perintah azacsnap ke lingkungan shell.
Secara default, azacsnap
akan menunggu hingga 30 detik hingga perintah shell eksternal selesai sebelum membunuh proses dan kembali ke eksekusi normal azacsnap.
Penundaan ini dapat ditimpa dengan menambahkan angka untuk menunggu dalam detik %
setelah karakter (misalnya, --runbefore "mycommand.sh%60"
akan menunggu hingga 60 detik agar mycommand.sh
selesai).
--runafter
akan menjalankan perintah shell setelah eksekusi utama azacsnap dan menyediakan beberapa parameter baris perintah azacsnap ke lingkungan shell.
Secara default, azacsnap
akan menunggu hingga 30 detik hingga perintah shell eksternal selesai sebelum membunuh proses dan kembali ke eksekusi normal azacsnap.
Ini dapat ditimpa dengan menambahkan angka untuk menunggu dalam detik setelah %
karakter (misalnya, --runafter "mycommand.sh%60"
akan menunggu hingga 60 detik hingga mycommand.sh
selesai).
Daftar variabel lingkungan berikut dihasilkan oleh azacsnap
dan diteruskan ke shell forked untuk menjalankan perintah yang disediakan sebagai parameter ke --runbefore
dan --runafter
:
$azCommand
= opsi perintah diteruskan ke -c (misalnya, pencadangan, pengujian, dll.).$azConfigFileName
= nama file konfigurasi.$azPrefix
= nilai --prefix.$azRetention
= nilai --retensi.$azSid
= nilai --dbsid.$azSnapshotName
= nama rekam jepret yang dihasilkan oleh azacsnap.
Catatan
Hanya ada nilai untuk $azSnapshotName
dalam --runafter
opsi .
Contoh penggunaan
Contoh penggunaan untuk fitur baru ini adalah mengunggah rekam jepret ke Azure Blob untuk tujuan pengarsipan menggunakan alat azcopy (Menyalin atau memindahkan data ke Azure Storage dengan menggunakan AzCopy).
Entri crontab berikut adalah satu baris dan berjalan azacsnap
pada lima tengah malam lalu. Perhatikan panggilan untuk snapshot-to-blob.sh
meneruskan nama rekam jepret dan awalan rekam jepret:
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')
Contoh skrip shell ini memiliki stanza khusus di akhir untuk mencegah AzAcSnap membunuh perintah eksternal karena batas waktu yang dijelaskan sebelumnya. Ini memungkinkan perintah jangka panjang, seperti mengunggah file besar dengan azcopy, dijalankan tanpa dihentikan sebelum waktunya.
Rekam jepret perlu dipasang pada sistem yang melakukan penyalinan, dengan hak istimewa baca-saja minimum. Lokasi dasar titik pemasangan untuk rekam jepret harus disediakan untuk sourceDir
variabel dalam skrip.
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 berisi contoh Kunci SAS berikut (konten diubah untuk keamanan):
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>"