RunBefore e RunAfter usando a ferramenta Instantâneo Consistente do Aplicativo do Azure

Este artigo fornece um guia para usar a e a --runbefore--runafter capacidade da ferramenta Instantâneo Consistente de Aplicativo do Azure que você pode usar com os Arquivos NetApp do Azure.

Introdução

AzAcSnap pode executar comandos externos antes ou depois de sua execução principal usando as opções --runbefore ou --runafter respectivamente.

--runbefore executará um comando shell antes da execução principal do azacsnap e fornecerá alguns dos parâmetros de linha de comando azacsnap para o ambiente shell. Por padrão, azacsnap aguardará até 30 segundos para que o comando shell externo seja concluído antes de matar o processo e retornar à execução normal do azacsnap. Esse atraso pode ser substituído adicionando um número para aguardar em segundos após um % caractere (por exemplo, --runbefore "mycommand.sh%60" aguardará até 60 segundos para mycommand.sh ser concluído).

--runafter executará um comando shell após a execução principal do azacsnap e fornecerá alguns dos parâmetros de linha de comando azacsnap para o ambiente shell. Por padrão, azacsnap aguardará até 30 segundos para que o comando shell externo seja concluído antes de matar o processo e retornar à execução normal do azacsnap. Isso pode ser substituído adicionando um número para aguardar em segundos após um % caractere (por exemplo, --runafter "mycommand.sh%60" aguardará até 60 segundos para mycommand.sh ser concluído).

A lista de variáveis de ambiente a seguir é gerada e passada para o shell bifurcado para executar os comandos fornecidos como parâmetros para --runbefore e azacsnap--runafter:

  • $azCommand = a opção de comando passada para -c (por exemplo, backup, teste, etc.).
  • $azConfigFileName = o nome do ficheiro de configuração.
  • $azPrefix = o valor --prefixo.
  • $azRetention = o valor --retenção.
  • $azSid = o valor --dbsid.
  • $azSnapshotName = o nome do instantâneo gerado pelo azacsnap.

Nota

Há apenas um valor para $azSnapshotName na --runafter opção.

Exemplo de utilização

Um exemplo de uso desse novo recurso é carregar um instantâneo no Blob do Azure para fins de arquivamento usando a ferramenta azcopy (Copiar ou mover dados para o Armazenamento do Azure usando AzCopy).

A seguinte entrada crontab é uma única linha e é executada azacsnap às cinco depois da meia-noite. Observe a chamada para snapshot-to-blob.sh passar o nome e o prefixo do 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')

Este exemplo de shell script tem uma estrofe especial no final para impedir que AzAcSnap mate o comando externo devido ao tempo limite descrito anteriormente. Isso permite que um comando de longa execução, como o upload de arquivos grandes com azcopy, seja executado sem ser interrompido prematuramente.

Os snapshots precisam ser montados no sistema que faz a cópia, com um privilégio mínimo somente leitura. O local base do ponto de montagem para os instantâneos deve ser fornecido à sourceDir variável no 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

O saskeyFile contém o seguinte exemplo de chave SAS (conteúdo alterado para segurança):

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

Próximos passos