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

Este artigo fornece um guia para usar as funcionalidades --runbefore e --runafter da ferramenta de Instantâneo Consistente do Aplicativo Azure que você pode usar com o Azure NetApp Files.

Introdução

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

--runbefore executa um comando de shell antes da execução principal de azacsnap e fornece alguns dos parâmetros de linha de comando de azacsnap para o ambiente do shell. Por padrão, azacsnap aguardará até 30 segundos para que o comando do shell externo seja concluído antes de encerrar o processo e voltar à execução normal de azacsnap. Esse atraso pode ser substituído adicionando-se 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 executa um comando de shell após a execução principal de azacsnap e fornece alguns dos parâmetros de linha de comando de azacsnap para o ambiente do shell. Por padrão, azacsnap aguardará até 30 segundos para que o comando do shell externo seja concluído antes de encerrar o processo e voltar à execução normal de 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á por até 60 segundos para mycommand.sh ser concluído).

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

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

Observação

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

Exemplo de uso

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 Microsoft Azure usando AzCopy).

A entrada crontab a seguir é apenas uma linha e executa azacsnap à meia-noite e cinco. Observe a chamada para snapshot-to-blob.sh passando o nome e o prefixo do instantâneo:

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 script de shell tem uma estrofe especial no final para impedir que AzAcSnap elimine o comando externo devido ao tempo limite descrito anteriormente. Isso permite que um comando de execução prolongada, como carregar arquivos grandes com azcopy, seja executado sem ser interrompido prematuramente.

Os instantâneos precisam ser montados no sistema fazendo a cópia com, pelo menos, privilégio somente leitura. O local base do ponto de montagem para os instantâneos deve ser fornecido à variável sourceDir 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óximas etapas