RunBefore en RunAfter met behulp van Azure-toepassing hulpprogramma Consistente momentopname

Dit artikel bevat een handleiding voor het gebruik van het --runbefore hulpprogramma --runafter Azure-toepassing Consistente momentopname die u kunt gebruiken met Azure NetApp Files.

Introductie

AzAcSnap kan externe opdrachten uitvoeren vóór of na de hoofduitvoering met behulp van de opties --runbefore of --runafter respectievelijk.

--runbefore voert een shell-opdracht uit voordat de hoofduitvoering van azacsnap wordt uitgevoerd en biedt enkele van de opdrachtregelparameters van azacsnap aan de shell-omgeving. azacsnap Standaard wacht u tot 30 seconden totdat de externe shell-opdracht is voltooid voordat het proces wordt afgesloten en terugkeert naar de normale uitvoering van azacsnap. Deze vertraging kan worden overschreven door een getal toe te voegen dat in seconden na een % teken moet worden gewacht (bijvoorbeeld --runbefore "mycommand.sh%60" wacht maximaal 60 seconden voordat mycommand.sh het is voltooid).

--runafter voert een shell-opdracht uit na de hoofduitvoering van azacsnap en biedt enkele van de azacsnap-opdrachtregelparameters aan de shell-omgeving. azacsnap Standaard wacht u tot 30 seconden totdat de externe shell-opdracht is voltooid voordat het proces wordt afgesloten en terugkeert naar de normale uitvoering van azacsnap. Dit kan worden overschreven door een getal toe te voegen dat in seconden na een % teken moet worden gewacht (wacht bijvoorbeeld --runafter "mycommand.sh%60" tot 60 seconden voordat mycommand.sh het is voltooid).

De volgende lijst met omgevingsvariabelen wordt gegenereerd azacsnap en doorgegeven aan de shell die is gesplitst om de opdrachten uit te voeren die zijn opgegeven als parameters voor --runbefore en --runafter:

  • $azCommand = de opdrachtoptie doorgegeven aan -c (bijvoorbeeld back-up, test, enzovoort).
  • $azConfigFileName = de bestandsnaam van de configuratie.
  • $azPrefix = de --voorvoegselwaarde.
  • $azRetention = de --retentiewaarde.
  • $azSid = de waarde --dbsid.
  • $azSnapshotName = de naam van de momentopname die is gegenereerd door azacsnap.

Notitie

Er is alleen een waarde voor $azSnapshotName in de --runafter optie.

Voorbeeld van gebruik

Een voorbeeld van het gebruik voor deze nieuwe functie is het uploaden van een momentopname naar Azure Blob voor archivering met behulp van het azcopy-hulpprogramma (Gegevens kopiëren of verplaatsen naar Azure Storage met behulp van AzCopy).

De volgende crontab-vermelding is één regel en wordt om vijf uur na middernacht uitgevoerd azacsnap . Noteer de aanroep voor snapshot-to-blob.sh het doorgeven van de naam van de momentopname en het voorvoegsel van de momentopname:

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

Dit voorbeeldshellscript heeft een speciale stanza aan het einde om te voorkomen dat AzAcSnap de externe opdracht beëindigt vanwege de eerder beschreven time-out. Hierdoor kan een langlopende opdracht, zoals het uploaden van grote bestanden met azcopy, worden uitgevoerd zonder voortijdig te worden gestopt.

De momentopnamen moeten worden gekoppeld aan het systeem dat de kopie uitvoert, met minimaal alleen-lezenrechten. De basislocatie van het koppelpunt voor de momentopnamen moet worden opgegeven voor de sourceDir variabele in het script.

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

Het saskeyFile bevat de volgende voorbeeld-SAS-sleutel (inhoud gewijzigd voor beveiliging):

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

Volgende stappen