Как создать и повернуть Автоматический снимок?
В Compute Engine мы можем делать снимки, которые в основном являются резервными копиями. Не могли бы вы попытаться выяснить, как мы могли бы создать script, чтобы делать автоматические снимки каждый день и сохраняться как 4 моментальных снимка, поэтому в основном после того, как у нас есть 4, удалите самый старый. Это единственная проблема, с которой я столкнулся в Google Cloud, не имеет запланированных резервных копий сервера, иначе мне нравится Compute Engine, это намного проще, чем Amazon для использования и дешевле.
Ответы
Ответ 1
Документация довольно ясно о том, как это сделать:
gcloud compute disks snapshot DISK
Обратите внимание, что
Снимки всегда создаются на основе последнего успешного снимка, сделанного
И прежде чем вы удалите любой из ваших снимков - посмотрите на эту диаграмму:
![enter image description here]()
Подробнее о API.
Ответ 2
ОБНОВЛЕНИЕ:
Сценарий сильно изменился с тех пор, как я впервые дал этот ответ - см. Репозиторий Github для получения последнего кода: https://github.com/jacksegal/google-compute-snapshot
ОРИГИНАЛЬНЫЙ ОТВЕТ:
У меня была та же проблема, поэтому я создал простой сценарий оболочки для ежедневного снимка и удаления всех снимков за 7 дней: 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
Ответ 3
Мое решение немного проще. Я хочу сделать снимок всех дисков, а не только основного диска.
Перечисляя все диски в проекте, это обрабатывает все серверы из одного единственного script - если он запущен в проекте gcloud (и может быть изменен для запуска за пределами сервера проекта.
Для упорядочивания старых снимков не требуется такая сложная обработка даты, как это может быть обработано из командной строки gcloud с помощью фильтра
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
#
Также обратите внимание, что для пользователей OSX вам нужно использовать что-то вроде
$(date -j -v-60d "+%Y-%m-%d")
для фильтра creationTimestamp
Ответ 4
Теперь в GCP доступна функция "Расписание снимков".
По-видимому, он все еще находится в бета-версии, и документации по этой функции пока немного. Но это прямой процесс, чтобы включить его. Сначала вы создаете расписание моментального снимка и можете назначить его постоянным дискам после его настройки.
![Snapshot Schedule Creation via GUI]()
См. Также ссылку на командную строку для создания расписания с соответствующей командой gcloud:
gcloud beta compute resource-policies create-snapshot-schedule
https://cloud.google.com/sdk/gcloud/reference/beta/compute/resource-policies/create-snapshot-schedule
Чтобы назначить расписание постоянному диску, вы можете использовать команду
gcloud beta compute disks add-resource-policies
https://cloud.google.com/sdk/gcloud/reference/beta/compute/disks/add-resource-policies
Обновление 2019-02-15: Со вчерашнего дня в блоге объявляется функция запланированных снимков, а также страница документации Compute Engine для запланированных снимков.
Ответ 5
Script предполагает, что $HOSTNAME совпадает с именем диска (мой основной системный диск принимает то же имя, что и экземпляр VM, или $HOSTNAME - (по своему усмотрению), где бы он ни назывался $HOSTNAME, он необходимо указать на системный диск на вашей виртуальной машине.
gcloud создает инкрементные снимки синхронизации. Самая старая информация будет содержать самую большую информацию. Вам не нужно беспокоиться о создании полного моментального снимка. Удаление самого старого приведет к тому, что новый старейший моментальный снимок станет основным, из которого будут основываться будущие инкрементности. Все это делается по боковой логике Google - так что это автоматически для gcloud.
У нас есть этот script набор, который запускается на задание cron каждый час. Он создает инкрементный снимок (от 1 до 2 ГБ) и удаляет все, что старше дней хранения. Google волшебным образом изменяет размер самого старого моментального снимка (который ранее был инкрементным) в качестве базового моментального снимка. Вы можете проверить это, удалив базовый снимок и обновив список снимков (console.cloud.google.com) - "волшебство" происходит в фоновом режиме, и вам может понадобиться дать ему минуту или около того, чтобы переупаковать себя. Впоследствии вы заметите, что самый старый моментальный снимок - это база, и размер будет отражать использованную часть диска, на котором выполняется моментальный снимок.
$ > моментальный снимок
#!/bin/bash
. ~/.bash_profile > /dev/null 2>&1 # source environment for cron jobs
retention=7 #days
zone=`gcloud info|grep zone:|awk -F\[ '{print $2}'|awk -F\] '{print $1}'`
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 $10}'|awk -F\ '{print $1}'`
snapdate=`echo $snapshot|awk -F\- '{print $3}'`
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}"
Ответ 6
Ниже приведен очень грубый рубин script для выполнения этой задачи. Пожалуйста, рассмотрите это как пример, из которого можно вдохнуть вдохновение.
Любая обратная связь для улучшения приветствуется; -)
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
Ответ 7
Похоже, это очень распространенный запрос от пользователей облачных вычислений, но большинство облачных сервисов не реализуют эту функцию. Я разработал автоматизированный снимок для OpenStack Cinder первый, и я перенесла код в Google Compute Cloud для проекта домашних животных.
Код свежий и не полностью протестирован, но не стесняйтесь сотрудничать и предлагать идеи.
Ответ 8
Если ничего другого, я не знаю, что [--set-scheduling]
- это ситуационный флаг gcloud, а там wait [process]
, который предотвратит выполнение текущей команды до тех пор, пока этот процесс не будет завершен. Объедините это с оператором &&
(выполняет команды с теми же операциями после того, как предыдущий завершен), наложение этой присоски не должно быть слишком сложным. Просто запустите его при запуске (когда вы создаете экземпляр, у которого есть опция для запуска) и подсчитайте время или сделайте одну из функций регулярного обслуживания триггером команд. Но, честно говоря, зачем смешивать синтаксис, если вам не нужно?
Это может работать (не копировать/вставлять)
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\
)"'
В теории gcloud будет устанавливать вычисление/зону, но придется ждать до указанного времени. Из-за двойного амперсанда (&) следующая команда не будет выполняться до завершения первой команды. Возможно, я проиграл описание, но я сделал это ради того, чтобы показать простоту, я знаю, что это не сработает, но я также знаю, что я не так далеко. Ничего себе, посмотрев на весь код, можно подумать, что мы пытаемся решить последовательность бессмертия. Я не думаю, что работать с ним в файле bash - это лучший способ. gcloud сделала командную строку для людей, которые не знают командной строки. Мы учились (или учились... или еще не научились) писать код надлежащим образом относительно окружающей среды. Я говорю, что мы применяем это здесь и используем CLOUD SDK в наших интересах.
Ответ 9
Кроме того, на момент написания этой статьи экземпляры Windows поддерживают службу теневого копирования томов (VSS), а экземпляры Linux - нет.
Следовательно, вы можете безопасно снимать диски Windows, пока экземпляр работает, с помощью ключа --guest-flush, но не для дисков Linux.
Перед созданием моментальных снимков дисков Linux вам понадобится какой-то другой механизм для подготовки его к моментальному снимку, т.е. остановка диска, отсоединение диска или отключение питания экземпляра.
Ответ 10
в моем примере у меня есть окно обслуживания для создания снимка для MySQL. предполагается, что учетная запись службы имеет разрешение на выполнение команд снимков gcloud. Надеюсь, поможет:
#!/bin/bash
days_to_keep=7
disk='curl -s "http://metadata.google.internal/computeMetadata/v1/instance/disks/1/device-name" -H "Metadata-Flavor: Google"'
zone='curl -s "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google"'
project='curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google"'
zone='basename ${zone}'
storage_location='echo ${zone}|sed 's/-[a-z]$//''
systemctl stop mysqld
sleep 5
# flush file system buffers
sync
# create snapshot
gcloud -q compute disks snapshot ${disk} --project=${project} --snapshot-names=${disk}-$(date +%s) --zone=${zone} --storage-location=${storage_location}
systemctl start mysqld
delete_date=$(date -d "-${days_to_keep} days" "+%Y-%m-%d")
# get list of snapshots to delete
to_del=$(gcloud compute snapshots list --filter="name ~ ${disk}* AND creationTimestamp<$delete_date" --format "csv[no-heading](name)")
# delete bulk of old snapshots
if [[ ! -z ${to_del} ]]
then
gcloud compute snapshots delete -q ${to_del}
fi
Ответ 11
Также существует сторонний сервис под названием VMPower.io, который может автоматизировать захват, сохранение и восстановление моментальных снимков для облака Google. Это не бесплатно, но будет делать то, что вы ищете, не имея при себе никакого кода.