RunBefore i RunAfter przy użyciu narzędzia aplikacja systemu Azure spójnej migawki

Ten artykuł zawiera przewodnik dotyczący korzystania z --runbefore narzędzia do tworzenia migawek spójnych na poziomie aplikacja systemu Azure, --runafter którego można używać z usługą Azure NetApp Files.

Wprowadzenie

AzAcSnap może wykonywać polecenia zewnętrzne przed lub po jego głównym wykonaniu przy użyciu opcji --runbefore lub --runafter odpowiednio.

--runbefore Uruchomi polecenie powłoki przed głównym wykonaniem azacsnap i udostępnia niektóre parametry wiersza polecenia azacsnap do środowiska powłoki. Domyślnie azacsnap polecenie zewnętrznej powłoki będzie czekać do 30 sekund przed zabiciem procesu i powrót do normalnego wykonania azacsnap. To opóźnienie może zostać zastąpione przez dodanie liczby do oczekiwania w sekundach po % znaku (na przykład --runbefore "mycommand.sh%60" poczeka do 60 sekund na mycommand.sh ukończenie).

--runafter Uruchomi polecenie powłoki po głównym wykonaniu azacsnap i udostępnia niektóre parametry wiersza polecenia azacsnap do środowiska powłoki. Domyślnie azacsnap polecenie zewnętrznej powłoki będzie czekać do 30 sekund przed zabiciem procesu i powrót do normalnego wykonania azacsnap. Może to zostać zastąpione przez dodanie liczby do oczekiwania w sekundach po % znaku (na przykład --runafter "mycommand.sh%60" poczeka do 60 sekund na mycommand.sh ukończenie).

Następująca lista zmiennych środowiskowych jest generowana azacsnap przez program i przekazywana do rozwidlenia powłoki w celu uruchomienia poleceń podanych jako parametry do --runbefore i --runafter:

  • $azCommand = opcja polecenia przekazana do -c (na przykład kopia zapasowa, test itp.).
  • $azConfigFileName = nazwa pliku konfiguracji.
  • $azPrefix = wartość --prefiks.
  • $azRetention = wartość --retention.
  • $azSid = wartość --dbsid.
  • $azSnapshotName = nazwa migawki wygenerowana przez azacsnap.

Uwaga

Opcja zawiera tylko wartość $azSnapshotName--runafter .

Przykładowe użycie

Przykładem użycia tej nowej funkcji jest przekazanie migawki do usługi Azure Blob do celów archiwalnych przy użyciu narzędzia azcopy (kopiowanie lub przenoszenie danych do usługi Azure Storage przy użyciu narzędzia AzCopy).

Poniższy wpis crontab jest pojedynczym wierszem i działa azacsnap o pięciu poprzednich północy. Zwróć uwagę na wywołanie snapshot-to-blob.sh przekazywania nazwy migawki i prefiksu migawki:

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

Ten przykładowy skrypt powłoki ma specjalną stanzę na końcu, aby uniemożliwić azAcSnap zabicie polecenia zewnętrznego z powodu przekroczenia limitu czasu opisanego wcześniej. Dzięki temu można uruchomić długotrwałe polecenie, takie jak przekazywanie dużych plików za pomocą narzędzia azcopy, bez przedwczesnego zatrzymania.

Migawki muszą być zainstalowane w systemie, wykonując kopię, z co najmniej uprawnieniami tylko do odczytu. Podstawowa lokalizacja punktu instalacji dla migawek powinna zostać dostarczona do sourceDir zmiennej w skry skrycie.

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

Plik saskeyFile zawiera następujący przykładowy klucz SYGNATURy dostępu współdzielonego (zawartość zmieniona na potrzeby zabezpieczeń):

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

Następne kroki