Share via


RunBefore och RunAfter med verktyget Azure Application Consistent Snapshot

Den här artikeln innehåller en guide för att använda --runbefore och --runafter funktionen för verktyget Azure Application Consistent Snapshot som du kan använda med Azure NetApp Files.

Introduktion

AzAcSnap kan köra externa kommandon före eller efter huvudkörningen med hjälp av alternativen --runbefore eller --runafter respektive.

--runbefore kör ett gränssnittskommando före huvudkörningen av azacsnap och tillhandahåller några av kommandoradsparametrarna azacsnap till shell-miljön. Som standard azacsnap väntar upp till 30 sekunder innan det externa gränssnittet slutförs innan processen avslutas och återgår till normal körning av azacsnap. Den här fördröjningen kan åsidosättas genom att lägga till ett tal som ska vänta i sekunder efter ett % tecken (till exempel --runbefore "mycommand.sh%60" väntar upp till 60 sekunder på mycommand.sh att slutföras).

--runafter kör ett gränssnittskommando efter huvudkörningen av azacsnap och tillhandahåller några av kommandoradsparametrarna azacsnap till shell-miljön. Som standard azacsnap väntar upp till 30 sekunder innan det externa gränssnittet slutförs innan processen avslutas och återgår till normal körning av azacsnap. Detta kan åsidosättas genom att lägga till ett tal att vänta i sekunder efter ett % tecken (till exempel --runafter "mycommand.sh%60" väntar i upp till 60 sekunder för mycommand.sh att slutföra).

Följande lista över miljövariabler genereras av azacsnap och skickas till gränssnittets förgrening för att köra kommandona som anges som parametrar till --runbefore och --runafter:

  • $azCommand = kommandoalternativet som skickades till -c (till exempel säkerhetskopiering, test osv.).
  • $azConfigFileName = konfigurationsfilens namn.
  • $azPrefix = --prefix-värdet.
  • $azRetention = värdet --retention.
  • $azSid = värdet --dbsid.
  • $azSnapshotName = namnet på ögonblicksbilden som genereras av azacsnap.

Kommentar

Det finns bara ett värde för $azSnapshotName i --runafter alternativet .

Exempel på användning

Ett exempel på användning för den här nya funktionen är att ladda upp en ögonblicksbild till Azure Blob i arkiveringssyfte med hjälp av azcopy-verktyget (Kopiera eller flytta data till Azure Storage med hjälp av AzCopy).

Följande crontab-post är en enda rad och körs azacsnap vid fem efter midnatt. Observera anropet till att snapshot-to-blob.sh skicka ögonblicksbildens namn och prefix för ögonblicksbild:

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')

Det här exempelskriptet har en särskild strof i slutet för att förhindra att AzAcSnap dödar det externa kommandot på grund av den timeout som beskrevs tidigare. Detta gör att ett tidskrävande kommando, till exempel att ladda upp stora filer med azcopy, kan köras utan att stoppas i förtid.

Ögonblicksbilderna måste monteras på systemet som gör kopian, med minst skrivskyddad behörighet. Basplatsen för monteringspunkten för ögonblicksbilderna ska anges för variabeln sourceDir i skriptet.

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 innehåller följande exempel på SAS-nyckel (innehåll har ändrats för säkerhet):

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

Nästa steg