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 do shell antes da execução principal do AzacSnap e fornece alguns dos parâmetros de linha de comando do AzacSnap para o ambiente do shell.
Por padrão, azacsnap
aguarda até 30 segundos para que o comando shell externo seja concluído antes de encerrar o processo e retornar à execução normal do 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 do shell após a execução principal do AzacSnap e fornece alguns dos parâmetros de linha de comando do AzacSnap para o ambiente do shell.
Por padrão, azacsnap
aguarda até 30 segundos para que o comando shell externo seja concluído antes de encerrar 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, --runafter "mycommand.sh%60"
aguardará até 60 segundos para mycommand.sh
ser concluído).
azacsnap
gera a seguinte lista de variáveis de ambiente e as passa 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 para fazer backup no Armazenamento de Blobs do Azure
Importante
Os exemplos são fornecidos apenas para fins informativos. Não garantimos a precisão, integridade ou utilidade de qualquer informação fornecida. O uso desses exemplos é por sua conta e risco. Não aceitamos qualquer responsabilidade por qualquer perda ou dano que possa surgir do uso desses exemplos. Não oferecemos suporte para os exemplos fornecidos nesta documentação.
Um exemplo de uso para esse novo recurso é carregar um instantâneo no Blob do Azure para fins de arquivamento usando a ferramenta (Copiar ou mover dados para o Armazenamento do Azure usando o azcopy
AzCopy).
Script de shell para carregar no Armazenamento de Blobs do Azure
Este script de shell de exemplo tem uma sub-rotina especial no final para impedir que o AzAcSnap elimine o comando externo devido ao tempo limite descrito anteriormente. Essa sub-rotina permite que um comando de longa duração, 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.
O instantâneo é carregado como um único arquivo usando o comando para criar um tarball compactado tar
com gzip. Colocar os arquivos em um único tarball mantém as permissões e a propriedade do arquivo, caso contrário, o upload dos arquivos individualmente perde esses atributos.
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>"
Agendando o script de shell
A entrada crontab a seguir é uma única linha e é executada azacsnap
às 12:05. 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')
Restaurando do Armazenamento de Blobs do Azure
A restauração de um desses arquivos armazenados no armazenamento de Blobs do Azure em um alto nível é a seguinte:
- Copie o arquivo de instantâneo de volta para a máquina local. O local de destino deve ser separado dos arquivos do banco de dados e com capacidade suficiente para permitir o arquivamento do arquivo e a extração, por exemplo
/var/tmp
.- Se eles criaram o arquivo usando o script de
--runafter
shell de exemplo, eles poderão extrair o tarball compactado diretamente do Armazenamento de Blobs do Azure para o local de destino usando um pipe AzCopy para tar para extrair, por exemplo:cd ${TARGET_DIRECTORY}
azcopy cp "${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}" --from-to BlobPipe | tar zxvf -
- Se eles criaram o arquivo usando o script de
- Extraia o conteúdo do arquivo de snapshot.
- Revise o conteúdo do local de destino após a extração, comparando as permissões e a propriedade do arquivo com os arquivos de banco de dados originais.
- Por exemplo, faça
ls -lR
.
- Por exemplo, faça
- Desligue os processos do servidor de banco de dados.
- Copie os arquivos do local de destino restaurado na etapa 1 de volta ao local original.
- Prossiga com o processo normal de recuperação do banco de dados.