RunBefore e RunAfter usando a ferramenta Instantâneo Consistente do Aplicativo do Azure
Este artigo fornece um guia para usar a --runbefore
--runafter
e a 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
Executa um comando shell antes da execução principal do azacsnap e fornece alguns dos parâmetros de linha de comando azacsnap para o ambiente shell.
Por padrão, azacsnap
aguarda 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
Executa um comando shell após a execução principal do azacsnap e fornece alguns dos parâmetros de linha de comando azacsnap para o ambiente shell.
Por padrão, azacsnap
aguarda 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, --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 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 uso para fazer backup no armazenamento de Blob do Azure
Importante
Os exemplos são fornecidos apenas para fins informativos. Não garantimos a exatidão, integridade ou utilidade de qualquer informação fornecida. A utilização destes exemplos é por sua conta e risco. Não aceitamos qualquer responsabilidade por qualquer perda ou dano que possa surgir do uso destes 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 AzCopy).azcopy
Shell script para carregar no armazenamento de Blob do Azure
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. Esta estrofe 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.
O instantâneo é carregado como um único arquivo usando o tar
comando para criar um tarball compactado. Colocar os arquivos em um único tarball mantém as permissões e a propriedade do arquivo, caso contrário, carregar os 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 shell script
A seguinte entrada crontab é uma única linha e funciona azacsnap
às 12h05. 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')
Restaurando a partir do armazenamento de Blob do Azure
A restauração de um desses arquivos armazenados no armazenamento de Blob do Azure em um nível alto é a seguinte:
- Copie o arquivo de snapshot de volta para a máquina local. O local de destino deve ser separado dos arquivos de banco de dados e com capacidade suficiente para permitir o arquivamento e a extração, por exemplo
/var/tmp
.- Se eles criaram o arquivo usando o
--runafter
script de shell de exemplo, eles podem possivelmente extrair o tarball compactado diretamente do armazenamento de Blob 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
- Extraia o conteúdo do arquivo de snapshot.
- Revise o conteúdo do local de destino depois de extrair, 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 para a etapa 1 de volta ao local original.
- Prossiga com o processo normal de recuperação do banco de dados.