在计算引擎上我们可以做快照,基本上是备份。您是否可以尝试弄清楚我们如何创建脚本以每天执行自动快照并保留4个快照,所以基本上在我们有4个快照之后,删除最旧的快照。这是我在Google Cloud上唯一关心的问题就是没有定时备份服务器,否则我喜欢Compute Engine,它比亚马逊更容易使用而且更便宜。
答案 0 :(得分:30)
<强>更新强>:
自从我第一次给出这个答案以来,脚本发生了很大变化 - 请参阅Github repo获取最新代码:https://github.com/jacksegal/google-compute-snapshot
原始答案:
我遇到了同样的问题,所以我创建了一个简单的shell脚本来拍摄每日快照并删除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
答案 1 :(得分:11)
我的解决方案稍微简单一些。我想快照所有磁盘而不仅仅是主磁盘。
通过列出项目中的所有磁盘,它可以处理来自一个脚本的所有服务器 - 只要它在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过滤器
答案 2 :(得分:10)
Documentation非常清楚如何做到这一点:
gcloud compute disks snapshot DISK
注意,
始终根据上次成功拍摄的快照创建快照
在您删除任何快照之前 - 请查看该图表:
关于API的More信息。
答案 3 :(得分:3)
GCP中现在有一个称为“快照计划”的功能。
它似乎仍处于Beta中,并且有关此功能的文档还很少。 但这是一个简单的过程。 首先,创建快照计划,并在设置快照计划后将其分配给永久磁盘。
另请参阅命令行参考以使用相应的gcloud命令创建计划:
gcloud 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: 从昨天开始,有blog announcement关于计划的快照功能,并且在scheduled snapshots的Compute Engine文档中也有一个页面。
答案 4 :(得分:2)
脚本假定$ HOSTNAME与disk-name相同(我的主系统磁盘假设与VM实例的名称相同或$ HOSTNAME - (最不喜欢),无论它在哪里说$ HOSTNAME,它都需要指向VM上的系统磁盘。
gcloud创建增量差异快照。最早的将包含最多的信息。您无需担心创建完整快照。删除最旧的快照将使新的最新快照成为未来增量的基础。这一切都是在Google端逻辑上完成的 - 因此它对gcloud来说是自动化的。
我们将此脚本设置为每小时在cron作业上运行。它会创建增量快照(abt 1到2GB)并删除任何早于保留天数的快照。 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}"
答案 5 :(得分:1)
以下是完成此任务的非常粗鲁的ruby脚本。请考虑一下作为灵感的一个例子。
欢迎任何改进它的反馈; - )
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
答案 6 :(得分:1)
在我的示例中,我有一个维护窗口来为MySQL创建快照。它假定服务帐户有权执行gcloud snapshots命令。希望对您有所帮助:
#!/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
答案 7 :(得分:0)
如果没有其他我知道[--set-scheduling]
是一个情境gcloud标志,并且wait [process]
将阻止当前命令执行,直到该过程完成。将它与&&
运算符(在前一个运算完成后执行相同的语句命令)相结合,将这个sucker串在一起不应该太难。只需在启动时运行它(当你创建一个具有启动命令选项的实例时)并让它计算时间或使其中一个常规维护功能触发命令。但老实说,为什么要混合语法,如果你不必?
这可行(不要复制/粘贴)
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将设置计算/区域,但必须等到指定的时间。由于双符号(&amp;&amp;),下一个命令直到第一个命令完成后才会执行。我可能已经过分了解描述,但我这样做是为了展示它的简单性,我知道它不会按原样工作,但我也知道我并不是那么遥远。哇看了所有的代码后,人们可能会相信我们正试图解决不朽的序列。我不认为在bash文件中进行操作是最好的方法。 gcloud为那些不了解命令行的人提供了命令行。我们已经教过(或者学习了......或者还没有学到)以相对于环境的正确方式编写代码。我说我们在这里应用它并使用CLOUD SDK来发挥我们的优势。
答案 8 :(得分:0)
此外,在撰写本文时,Windows实例支持卷影复制服务(VSS),但Linux实例不支持。
因此,您可以使用--guest-flush开关在实例运行时安全地对Windows驱动器进行快照,但对于Linux驱动器则不然。
在快照Linux驱动器之前,您需要一些其他机制来准备快照,即冻结驱动器,分离驱动器或关闭实例电源。
答案 9 :(得分:-1)
还有一个名为VMPower.io的第三方服务,它可以自动捕获,保留和恢复谷歌云的快照。它不是免费的,但无需编写任何代码即可完成您正在寻找的内容。