Freigeben über


„runbefore“ und „runafter“ zur Verwendung des Tools für konsistente Momentaufnahmen in Azure-Anwendungen für Azure NetApp Files

Dieser Artikel enthält eine Anleitung zum Verwenden der Funktionen --runbefore und --runafter des Tools für konsistente Momentaufnahmen in Azure-Anwendungen, das Sie mit Azure NetApp Files verwenden können.

Einführung

AzAcSnap kann externe Befehle vor oder nach der Hauptausführung mithilfe der Optionen --runbefore oder --runafter ausführen.

--runbefore führt vor der Hauptausführung von azacsnap einen Shellbefehl aus und stellt einige der azacsnap-Befehlszeilenparameter für die Shellumgebung bereit. Standardmäßig wartet azacsnap bis zu 30 Sekunden, bis der externe Shellbefehl abgeschlossen ist, bevor der Prozess beendet und zur normalen Ausführung von azacsnap zurückgekehrt wird. Diese Verzögerung kann überschrieben werden, indem eine Zahl hinzugefügt wird, um anzugeben, wie viele Sekunden nach einem %-Zeichen gewartet wird (z. B. bei --runbefore "mycommand.sh%60" wird bis zu 60 Sekunden auf den Abschluss von mycommand.sh gewartet).

--runafter führt nach der Hauptausführung von azacsnap einen Shellbefehl aus und stellt einige der azacsnap-Befehlszeilenparameter für die Shellumgebung bereit. Standardmäßig wartet azacsnap bis zu 30 Sekunden, bis der externe Shellbefehl abgeschlossen ist, bevor der Prozess beendet und zur normalen Ausführung von azacsnap zurückgekehrt wird. Dies kann überschrieben werden, indem eine Zahl hinzugefügt wird, um anzugeben, wie viele Sekunden nach einem %-Zeichen gewartet wird (z. B. bei --runafter "mycommand.sh%60" wird bis zu 60 Sekunden auf den Abschluss von mycommand.sh gewartet).

Die folgende Liste der Umgebungsvariablen wird von azacsnap generiert und an die verzweigte Shell übergeben, um die Befehle auszuführen, die als Parameter für --runbefore und --runafter bereitgestellt werden:

  • $azCommand = die Befehlsoption, die an -c übergeben wird (z. B. Sicherung, Test usw.)
  • $azConfigFileName = der Name der Konfigurationsdatei
  • $azPrefix = der Präfixwert
  • $azRetention = der Aufbewahrungswert
  • $azSid = der --dbsid-Wert
  • $azSnapshotName = der von azacsnap generierte Name der Momentaufnahme

Hinweis

In der Option --runafter gibt es nur einen Wert für $azSnapshotName.

Beispielverwendung

Ein Beispiel für die Verwendung dieses neuen Features ist das Hochladen einer Momentaufnahme in ein Azure-Blob zu Archivierungszwecken mithilfe des azcopy-Tools (Kopieren oder Verschieben von Daten in Azure Storage mit AzCopy).

Der folgende crontab-Eintrag ist eine einzelne Zeile und führt azacsnap um 5 Minuten nach Mitternacht aus. Beachten Sie den Aufruf von snapshot-to-blob.sh zur Übergabe des Namens und des Präfixes der Momentaufnahme:

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

Dieses Beispielshellskript verfügt über einen speziellen Abschnitt am Ende, um zu verhindern, dass AzAcSnap den externen Befehl aufgrund des zuvor beschriebenen Timeouts beendet. Dies ermöglicht die Ausführung eines zeitintensiven Befehls, z. B. das Hochladen großer Dateien mit azcopy, ohne vorzeitig beendet zu werden.

Die Momentaufnahmen müssen mit mindestens schreibgeschützten Berechtigungen auf dem System bereitgestellt werden, das die Kopie erstellt. Der Basisspeicherort des Bereitstellungspunkts für die Momentaufnahmen sollte für die Variable sourceDir im Skript angegeben werden.

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 enthält den folgenden SAS-Beispielschlüssel (Inhalt aus Sicherheitsgründen geändert):

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ächste Schritte