Azure Uygulaması Lication Tutarlı Anlık Görüntü aracını kullanarak RunBefore ve RunAfter
Bu makalede, Azure NetApp Files ile kullanabileceğiniz Azure Uygulaması Lication Tutarlı Anlık Görüntü aracının ve --runafter
özelliğini kullanmaya yönelik bir kılavuz --runbefore
sağlanır.
Giriş
AzAcSnap, sırasıyla veya seçeneklerini --runbefore
kullanarak ana yürütmeden önce veya --runafter
sonra dış komutları yürütebilir.
--runbefore
azacsnap'ın ana yürütülmesinden önce bir kabuk komutu çalıştırır ve kabuk ortamına azacsnap komut satırı parametrelerinden bazılarını sağlar.
Varsayılan olarak, azacsnap
işlemi sonlandırıp azacsnap normal yürütmesine dönmeden önce dış kabuk komutunun tamamlanması için 30 saniye kadar bekler.
Bu gecikme, karakterden sonra saniyeler içinde beklenecek bir %
sayı eklenerek geçersiz kılınabilir (örneğin, --runbefore "mycommand.sh%60"
tamamlanması için mycommand.sh
60 saniyeye kadar bekler).
--runafter
, azacsnap'ın ana yürütülmesinden sonra bir kabuk komutu çalıştırır ve kabuk ortamına azacsnap komut satırı parametrelerinden bazılarını sağlar.
Varsayılan olarak, azacsnap
işlemi sonlandırıp azacsnap normal yürütmesine dönmeden önce dış kabuk komutunun tamamlanması için 30 saniye kadar bekler.
Bu, karakterden sonra saniyeler içinde beklenecek bir %
sayı eklenerek geçersiz kılınabilir (örneğin, --runafter "mycommand.sh%60"
tamamlanması için mycommand.sh
60 saniyeye kadar bekler).
Aşağıdaki ortam değişkenleri listesi tarafından azacsnap
oluşturulur ve ve --runafter
için parametre --runbefore
olarak sağlanan komutları çalıştırmak için çatallanmış kabuğa geçirilir:
$azCommand
= -c'ye geçirilen komut seçeneği (örneğin, yedekleme, test vb.).$azConfigFileName
= yapılandırma dosya adı.$azPrefix
= --prefix değeri.$azRetention
= --retention değeri.$azSid
= --dbsid değeri.$azSnapshotName
= azacsnap tarafından oluşturulan anlık görüntü adı.
Dekont
seçeneğinde --runafter
yalnızca için $azSnapshotName
bir değer vardır.
Örnek kullanım
Bu yeni özelliğin örnek kullanımlarından biri, azcopy aracını kullanarak arşivleme amacıyla Azure Blob'a anlık görüntü yüklemektir (AzCopy kullanarak verileri kopyalama veya Azure Depolama taşıma).
Aşağıdaki crontab girdisi tek bir satırdır ve gece yarısından beş geçe çalışır azacsnap
. Anlık görüntü adını ve anlık görüntü ön ekini geçirme çağrısını snapshot-to-blob.sh
not edin:
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')
Bu örnek kabuk betiğinin sonunda AzAcSnap'ın daha önce açıklanan zaman aşımı nedeniyle dış komutu öldürmesini önlemek için özel bir stanza bulunur. Bu, azcopy ile büyük dosyaları karşıya yükleme gibi uzun süre çalışan bir komutun erken durdurulmadan çalıştırılmasını sağlar.
Anlık görüntülerin, en az salt okunur ayrıcalıkla kopyayı yapan sisteme bağlı olması gerekir. Anlık görüntüler için bağlama noktasının temel konumu betikteki sourceDir
değişkene sağlanmalıdır.
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 aşağıdaki SAS Anahtarını içerir (güvenlik için içerik değiştirildi):
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>"