Comment créer et tourner Snapshot automatique?

sur le moteur de calcul, nous pouvons faire des instantanés, qui sont essentiellement des sauvegardes. Pourriez-vous essayer de comprendre comment nous pourrions créer un script pour faire des snapshots automatisés tous les jours et garder comme 4 snapshots, donc essentiellement après que nous avons 4, supprimer le plus ancien. C'est la seule préoccupation de la mienne sur Google Cloud est de ne pas avoir des sauvegardes programmées du serveur, sinon j'adore Compute Engine, son beaucoup plus facile Qu'Amazon à utiliser et son moins cher.

18
demandé sur jww 2014-12-11 11:33:29

8 réponses

Documentation est assez clair sur la façon de le faire:

gcloud compute disks snapshot DISK

Notez que

captures d'écran sont toujours créés sur la base du dernier succès instantané pris

et avant de supprimer un de vos snapshots -- jetez un oeil à ce diagramme: enter image description here

Plus informations sur l'API.

9
répondu Dmytro Sadovnychyi 2017-07-20 07:38:34

UPDATE:

Le script a beaucoup changé depuis que j'ai donné cette réponse - s'il vous plaît voir le dépôt Github pour la dernière version de code: https://github.com/jacksegal/google-compute-snapshot

RÉPONSE ORIGINALE:

j'ai eu le même problème, donc j'ai créé un script shell simple pour prendre un instantané quotidien et supprimer tous les instantanés sur 7 jours: https://github.com/Forward-Action/google-compute-snapshot

#!/usr/bin/env bash
export PATH=$PATH:/usr/local/bin/:/usr/bin

#
# CREATE DAILY SNAPSHOT
#

# get the device name for this vm
DEVICE_NAME="$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/disks/0/device-name" -H "Metadata-Flavor: Google")"

# get the device id for this vm
DEVICE_ID="$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/id" -H "Metadata-Flavor: Google")"

# get the zone that this vm is in
INSTANCE_ZONE="$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google")"

# strip out the zone from the full URI that google returns
INSTANCE_ZONE="${INSTANCE_ZONE##*/}"

# create a datetime stamp for filename
DATE_TIME="$(date "+%s")"

# create the snapshot
echo "$(gcloud compute disks snapshot ${DEVICE_NAME} --snapshot-names gcs-${DEVICE_NAME}-${DEVICE_ID}-${DATE_TIME} --zone ${INSTANCE_ZONE})"


#
# DELETE OLD SNAPSHOTS (OLDER THAN 7 DAYS)
#

# get a list of existing snapshots, that were created by this process (gcs-), for this vm disk (DEVICE_ID)
SNAPSHOT_LIST="$(gcloud compute snapshots list --regexp "(.*gcs-.*)|(.*-${DEVICE_ID}-.*)" --uri)"

# loop through the snapshots
echo "${SNAPSHOT_LIST}" | while read line ; do

   # get the snapshot name from full URL that google returns
   SNAPSHOT_NAME="${line##*/}"

   # get the date that the snapshot was created
   SNAPSHOT_DATETIME="$(gcloud compute snapshots describe ${SNAPSHOT_NAME} | grep "creationTimestamp" | cut -d " " -f 2 | tr -d \')"

   # format the date
   SNAPSHOT_DATETIME="$(date -d ${SNAPSHOT_DATETIME} +%Y%m%d)"

   # get the expiry date for snapshot deletion (currently 7 days)
   SNAPSHOT_EXPIRY="$(date -d "-7 days" +"%Y%m%d")"

   # check if the snapshot is older than expiry date
if [ $SNAPSHOT_EXPIRY -ge $SNAPSHOT_DATETIME ];
        then
     # delete the snapshot
         echo "$(gcloud compute snapshots delete ${SNAPSHOT_NAME} --quiet)"
   fi
done
27
répondu Jack Segal 2017-10-18 11:34:23

Ma solution est un peu plus simple. Je veux photographier tous les disques pas seulement le disque primaire.

en énumérant tous les disques dans le projet cela gère tous les serveurs à partir d'un seul script - aussi longtemps qu'il est exécuté dans un projet gcloud (et pourrait être modifié pour fonctionner en dehors d'un serveur de projet aussi.

pour ranger les vieux snapshots n'a pas besoin d'un traitement de date aussi complexe car il peut être manipulé à partir de la ligne de commande gcloud en utilisant un filtre

https://gitlab.com/alan8/google-cloud-auto-snapshot

#!/bin/bash
# loop through all disks within this project  and create a snapshot
gcloud compute disks list | tail -n +2 | while read DISK_NAME ZONE c3 c4; do
  gcloud compute disks snapshot $DISK_NAME --snapshot-names auto-$DISK_NAME-$(date "+%s") --zone $ZONE 
done
#
# snapshots are incremental and dont need to be deleted, deleting snapshots will merge snapshots, so deleting doesn't loose anything
# having too many snapshots is unwieldy so this script deletes them after 60 days
#
gcloud compute snapshots list --filter="creationTimestamp<$(date -d "-60 days" "+%Y-%m-%d") AND (auto.*)" --uri | while read SNAPSHOT_URI; do
  gcloud compute snapshots delete --quiet $SNAPSHOT_URI
done
#

notez aussi que pour les utilisateurs D'OSX vous devez utiliser quelque chose comme

$(date -j -v-60d "+%Y-%m-%d")
9
répondu Alan Fuller 2017-09-27 22:13:24

le Script suppose que $HOSTNAME est le même que disk-name (mon disque système principal prend le même nom que L'instance VM ou $HOSTNAME -- (change to your liking) en fin de compte, partout où il est dit $HOSTNAME, il doit pointer vers le disque système sur votre VM.

gcloud crée des instantanés différentiels de diff. Le plus ancien contiendra le plus d'informations. Vous n'avez pas besoin de vous soucier de créer un instantané complet. Supprimer le plus ancien fera du nouveau plus ancien snapshot la Primaire qui l'avenir des incréments sera la base de. Tout cela est fait sur la logique de Google side -- donc c'est automatique à gcloud.

nous avons ce script réglé pour exécuter un travail cron toutes les heures. Il crée un snapshot incrémental (abt 1 à 2 Go) et supprime tous ceux qui sont plus anciens que les jours de rétention. Google redimensionne magiquement le plus ancien snapshot (qui était auparavant un incrémental) pour être le snapshot de base. Vous pouvez le tester en supprimant le snapshot de base et en rafraîchissant la liste des snapshots (console.cloud.google.com) -- la "magie" se produit à l'arrière-plan et vous pouvez avoir besoin de lui donner une minute ou plus pour se rebaser. Ensuite, vous remarquerez que le cliché le plus ancien est la base et que sa taille reflétera la partie utilisée du disque sur laquelle vous exécutez le cliché.

$> instantané

#!/bin/bash

    . ~/.bash_profile > /dev/null 2>&1  # source environment for cron jobs

    retention=7 #days

    zone=`gcloud info|grep zone:|awk -F\[ '{print }'|awk -F\] '{print }'`
    date=`date +"%Y%m%d%H%M"`
    expire=`date -d "-${retention} days" +"%Y%m%d%H%M"`

    snapshots=`gcloud compute snapshots list --regexp "(${HOSTNAME}-.*)" --uri`

    # Delete snapshots older than $expire
    for line in "${snapshots[@]}"
    do
      snapshot=`echo ${line}|awk -F\/  '{print }'|awk -F\  '{print }'`
      snapdate=`echo $snapshot|awk -F\- '{print }'`
      if (( $snapdate <= $expire )); then
        gcloud compute snapshots delete $snapshot --quiet
      fi
    done

    # Create New Snapshot
    gcloud compute disks snapshot $HOSTNAME --snapshot-name ${HOSTNAME}-${date} --zone $zone --description "$HOSTNAME Disk snapshot ${date}"
2
répondu Neal Garrett 2016-11-16 17:51:41

ce qui suit est un script ruby très grossier pour accomplir cette tâche. S'il vous plaît, considérez cela comme un exemple de source d'inspiration.

tout feedback pour l'améliorer est le bienvenu ; -)

require 'date'

ARCHIVE = 30 # Days
DISKS   = [] # The names of the disks to snapshot
FORMAT  = '%y%m%d'

today = Date.today
date = today.strftime(FORMAT).to_i
limit = (today - ARCHIVE).strftime(FORMAT).to_i

# Backup
`gcloud compute disks snapshot #{DISKS.join(' ')} --snapshot-names #{DISKS.join("-#{date},")}-#{date}`

# Rotate
snapshots = []
`gcloud compute snapshots list`.split("\n").each do |row|
  name = date
  row.split("\s").each do |cell|
    name = cell
    break
  end
  next if name == 'NAME'
  snapshots << name if name[-6, 6].to_i < limit
end
`yes | gcloud compute snapshots delete #{snapshots.join(' ')}` if snapshots.length > 0
1
répondu panteo 2015-12-15 09:23:46

Si rien d'autre, je sais que [--set-scheduling] est un indicateur de gcloud situationnel et il y a un wait [process] qui empêchera la commande courante de s'exécuter jusqu'à ce que ce processus soit terminé. Combinez cela avec && operator (exécute les commandes same-statement après que le précédent est terminé), la tension de ce suceur ensemble ne devrait pas être trop difficile. Il suffit de l'exécuter au démarrage (lorsque vous créez une instance, il a l'option de commande de démarrage) et de lui faire compter le temps ou de faire l'une des fonctions de maintenance régulière déclencher les commandes. Mais honnêtement, pourquoi mélanger la syntaxe si vous n'avez pas à?

Cela pourrait fonctionner (ne pas copier/coller)

gcloud config set compute/zone wait [datetime-function] && \
gcloud compute disks snapshot snap1 snap2 snap3 \
        --snapshot-names ubuntu12 ubuntu14 debian8  \
        --description=\
            '--format="multi(\
                info:format=list always-display-title compact,\
                data:format=list always-display-title compact\
                )"'

en théorie, gcloud définira la zone de calcul mais devra attendre le temps spécifié. En raison de la double commande ampersand ( & & ), la commande suivante ne sera pas exécutée avant que la première commande soit terminée. J'ai peut-être exagéré sur la description, mais je l'ai fait pour montrer la simplicité de celle-ci, je sais que ça ne marchera pas comme ça mais je savent aussi que je ne suis pas loin. Après avoir regardé tout le code, on pourrait croire qu'on essaie de résoudre la séquence d'immortalité. Je ne pense pas que travailler sur un dossier bash soit la meilleure façon. gcloud a créé la ligne de commande pour les gens qui ne connaissent pas la ligne de commande. Nous avons été enseigné (ou appris... ou n'ont pas encore appris) à écrire du code d'une manière appropriée par rapport à l'environnement. Je propose que nous appliquions cela ici et que nous utilisions le SDK CLOUD à notre avantage.

0
répondu user1586275 2017-02-04 19:48:36

aussi, au moment d'écrire ceci, les instances Windows prennent en charge le service de copie D'ombre de Volume (VSS), mais pas les instances Linux.

par conséquent, vous pouvez snapshot en toute sécurité les lecteurs Windows pendant que l'instance tourne en utilisant le commutateur --guest-flush, mais pas pour les lecteurs Linux.

avant de snapshotter les lecteurs Linux, vous aurez besoin d'un autre mécanisme pour le préparer à snapshot, c'est-à-dire geler le lecteur, détacher le lecteur ou désactiver l'instance.

0
répondu Richard Salt 2018-03-28 11:49:35

il y a aussi un service tiers appelé VMPower.io qui peut automatiser la capture, la conservation et la restauration des snapshots pour google cloud. Il n'est pas gratuit mais fera ce que vous cherchez sans avoir à coder quoi que ce soit.

-1
répondu Steven Edouard 2017-05-19 07:38:07