Share via


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 --runafteriç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>"

Sonraki adımlar