Condividi tramite


RunBefore e RunAfter usando app Azure strumento snapshot coerente con app Azure

Questo articolo fornisce una guida per l'uso --runbefore della funzionalità e --runafter dello strumento snapshot coerente app Azure cation che è possibile usare con Azure NetApp Files.

Introduzione

AzAcSnap può eseguire comandi esterni prima o dopo l'esecuzione principale usando rispettivamente le opzioni --runbefore o --runafter .

--runbefore esegue un comando shell prima dell'esecuzione principale di azacsnap e fornisce alcuni parametri della riga di comando azacsnap all'ambiente della shell. Per impostazione predefinita, azacsnap attende il completamento del comando della shell esterna fino a 30 secondi prima di uccidere il processo e tornare all'esecuzione normale di azacsnap. Questo ritardo può essere sottoposto a override aggiungendo un numero di attesa in secondi dopo un % carattere (ad esempio, --runbefore "mycommand.sh%60" attenderà fino a 60 secondi per mycommand.sh il completamento).

--runafter esegue un comando shell dopo l'esecuzione principale di azacsnap e fornisce alcuni parametri della riga di comando azacsnap all'ambiente della shell. Per impostazione predefinita, azacsnap attende il completamento del comando della shell esterna fino a 30 secondi prima di uccidere il processo e tornare all'esecuzione normale di azacsnap. Questo ritardo può essere sottoposto a override aggiungendo un numero di attesa in secondi dopo un % carattere (ad esempio, --runafter "mycommand.sh%60" attenderà fino a 60 secondi per mycommand.sh il completamento).

azacsnap genera l'elenco seguente di variabili di ambiente e le passa alla shell tramite fork per eseguire i comandi forniti come parametri a --runbefore e --runafter:

  • $azCommand = l'opzione di comando passata a -c (ad esempio, backup, test e così via).
  • $azConfigFileName = nome file di configurazione.
  • $azPrefix = valore --prefix.
  • $azRetention = il valore --retention.
  • $azSid = valore --dbsid.
  • $azSnapshotName = nome dello snapshot generato da azacsnap.

Nota

Esiste solo un valore per $azSnapshotName nell'opzione --runafter .

Esempio di utilizzo per eseguire il backup nell'archivio BLOB di Azure

Importante

Gli esempi vengono forniti solo a scopo informativo. Non garantiamo l'accuratezza, la completezza o l'utilità delle informazioni fornite. L'uso di questi esempi è a proprio rischio. Non accettiamo alcuna responsabilità per eventuali perdite o danni derivanti dall'uso di questi esempi. Non è disponibile il supporto per gli esempi forniti in questa documentazione.

Un esempio di utilizzo per questa nuova funzionalità consiste nel caricare uno snapshot nel BLOB di Azure a scopo di archiviazione usando lo azcopy strumento (copiare o spostare i dati in Archiviazione di Azure usando AzCopy).

Script della shell da caricare nell'archiviazione BLOB di Azure

Questo script della shell di esempio ha una stanza speciale alla fine per impedire ad AzAcSnap di uccidere il comando esterno a causa del timeout descritto in precedenza. Questa stanza consente l'esecuzione di un comando a esecuzione prolungata, ad esempio il caricamento di file di grandi dimensioni con azcopy, per l'esecuzione senza essere interrotto prematuramente.

Gli snapshot devono essere montati nel sistema che esegue la copia, con un privilegio di sola lettura minimo. La posizione di base del punto di montaggio per gli snapshot deve essere fornita alla sourceDir variabile nello script.

Lo snapshot viene caricato come singolo file usando il tar comando per creare un tarball con gzipped. L'inserimento dei file in un singolo tarball mantiene le autorizzazioni e la proprietà del file, altrimenti il caricamento dei file perde singolarmente questi attributi.

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 contiene la chiave di firma di accesso condiviso di esempio seguente (contenuto modificato per la sicurezza):

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

Pianificazione dello script della shell

La voce crontab seguente è una singola riga e viene eseguita azacsnap alle 12:05. Si noti la chiamata al snapshot-to-blob.sh passaggio del nome dello snapshot e del prefisso dello snapshot:

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

Ripristino da Archiviazione BLOB di Azure

Il ripristino da uno di questi archivi archiviati nell'archiviazione BLOB di Azure a livello generale è il seguente:

  1. Copiare nuovamente l'archivio snapshot nel computer locale. Il percorso di destinazione deve essere separato dai file di database e con capacità sufficiente per consentire l'archivio file e l'estrazione, ad esempio /var/tmp.
    1. Se l'archivio è stato creato usando lo --runafter script della shell di esempio, è possibile estrarre il tarball con gzipped direttamente dall'archivio BLOB di Azure nella posizione di destinazione usando una pipe AzCopy per tar per estrarre, ad esempio:
      1. cd ${TARGET_DIRECTORY}
      2. azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
  2. Estrarre il contenuto dell'archivio snapshot.
  3. Esaminare il contenuto del percorso di destinazione dopo l'estrazione, confrontando le autorizzazioni dei file e la proprietà con i file di database originali.
    1. Ad esempio, eseguire ls -lR.
  4. Arrestare i processi del server di database.
  5. Copiare i file dal percorso di destinazione ripristinato nel passaggio 1 nel percorso originale.
  6. Procedere con il normale processo di ripristino del database.

Passaggi successivi