Bagikan melalui


RunBefore dan RunAfter menggunakan alat Azure Application Consistent Snapshot

Artikel ini menyediakan panduan untuk menggunakan --runbefore dan --runafter kemampuan alat Azure Application Consistent Snapshot yang dapat Anda gunakan dengan Azure NetApp Files.

Pendahuluan

AzAcSnap dapat menjalankan perintah eksternal sebelum atau sesudah eksekusi utamanya menggunakan opsi --runbefore atau --runafter masing-masing.

--runbefore akan menjalankan perintah shell sebelum eksekusi utama azacsnap dan menyediakan beberapa parameter baris perintah azacsnap ke lingkungan shell. Secara default, azacsnap akan menunggu hingga 30 detik hingga perintah shell eksternal selesai sebelum membunuh proses dan kembali ke eksekusi normal azacsnap. Penundaan ini dapat ditimpa dengan menambahkan angka untuk menunggu dalam detik % setelah karakter (misalnya, --runbefore "mycommand.sh%60" akan menunggu hingga 60 detik agar mycommand.sh selesai).

--runafter akan menjalankan perintah shell setelah eksekusi utama azacsnap dan menyediakan beberapa parameter baris perintah azacsnap ke lingkungan shell. Secara default, azacsnap akan menunggu hingga 30 detik hingga perintah shell eksternal selesai sebelum membunuh proses dan kembali ke eksekusi normal azacsnap. Ini dapat ditimpa dengan menambahkan angka untuk menunggu dalam detik setelah % karakter (misalnya, --runafter "mycommand.sh%60" akan menunggu hingga 60 detik hingga mycommand.sh selesai).

Daftar variabel lingkungan berikut dihasilkan oleh azacsnap dan diteruskan ke shell forked untuk menjalankan perintah yang disediakan sebagai parameter ke --runbefore dan --runafter:

  • $azCommand = opsi perintah diteruskan ke -c (misalnya, pencadangan, pengujian, dll.).
  • $azConfigFileName = nama file konfigurasi.
  • $azPrefix = nilai --prefix.
  • $azRetention = nilai --retensi.
  • $azSid = nilai --dbsid.
  • $azSnapshotName = nama rekam jepret yang dihasilkan oleh azacsnap.

Catatan

Hanya ada nilai untuk $azSnapshotName dalam --runafter opsi .

Contoh penggunaan

Contoh penggunaan untuk fitur baru ini adalah mengunggah rekam jepret ke Azure Blob untuk tujuan pengarsipan menggunakan alat azcopy (Menyalin atau memindahkan data ke Azure Storage dengan menggunakan AzCopy).

Entri crontab berikut adalah satu baris dan berjalan azacsnap pada lima tengah malam lalu. Perhatikan panggilan untuk snapshot-to-blob.sh meneruskan nama rekam jepret dan awalan rekam jepret:

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

Contoh skrip shell ini memiliki stanza khusus di akhir untuk mencegah AzAcSnap membunuh perintah eksternal karena batas waktu yang dijelaskan sebelumnya. Ini memungkinkan perintah jangka panjang, seperti mengunggah file besar dengan azcopy, dijalankan tanpa dihentikan sebelum waktunya.

Rekam jepret perlu dipasang pada sistem yang melakukan penyalinan, dengan hak istimewa baca-saja minimum. Lokasi dasar titik pemasangan untuk rekam jepret harus disediakan untuk sourceDir variabel dalam skrip.

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

SaskeyFile berisi contoh Kunci SAS berikut (konten diubah untuk keamanan):

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

Langkah berikutnya