针对 Amazon EC2 实例/卷的简单备份策略?

针对 Amazon EC2 实例/卷的简单备份策略?

您已输入由 Amazon EC2 EBS 支持的 Windows 映像 010 的介绍性备份...

我一直在绞尽脑汁寻找一种简单的备份策略,用于运行 SharePoint Services 的单个 Windows 2008 服务器。这是一台服务器的 EBS 支持的映像,具有一个数据卷。我不需要任何奇特的东西。我只需要一个“每日”备份(丢失一天的数据并不是什么灾难)。

我们已经创建并保存了一个我们习惯使用的 EBS 支持的 AMI 映像(Windows 2008)。我们开始通过简单地创建一个新的 EBS AMI 映像进行备份。这真的很简单,但在创建映像的前 10 到 15 分钟内,正在运行的服务器处于离线状态——这并不理想。

创建备份的标准方法似乎是创建连接到正在运行的实例的卷的快照。同样,这非常简单,并且服务器在快照生成期间仍然可用。明显的 Catch-22 是您不能直接从快照启动新实例。

我知道如何将正在运行的实例捆绑到 S3 存储,然后从 S3 存储桶注册 AMI。这确实允许我捕获正在运行的实例的备份,并且如果正在运行的实例丢失,则从 S3 存储桶注册 AMI 并启动新的 AMI 来恢复实例,但这似乎真的很复杂,而且必须在 AWS 控制台和 Firefox 的 S3 Organizer 插件之间来回切换才能完成此操作,这似乎很荒谬。(请不要提及命令行方法,这是 010 级课程)。

通过尝试使用 EBS 支持的图像,以下方法似乎对我有用(所有操作都在 AWS 控制台中完成):

1.对于您的备份,只需根据需要对系统卷 (/dev/sda1) 进行快照即可。2.如果您丢失了正在运行的实例,请执行以下操作:a.从上次快照备份创建新卷b.启动起始 AMI 的另一个实例(必须由 EBS 支持)c.停止此实例。d.从新停止的实例中分离现有系统卷并丢弃。e.将新创建的卷作为系统卷 (/dev/sda1) 附加到已停止的实例。f.重新启动新实例。我已经测试了几次,它似乎对我有用。

问:这种做法有什么问题吗?

答案1

您的方法听起来非常好 - 但我可以想到一种可能的方法来改进它。

为了减少自上次备份以来数据丢失和 EBS 卷故障(不太可能,但仍有可能)的影响,您可以将数据存储在与系统文件不同的 EBS 卷上,并且比系统卷更频繁地备份数据卷。

使用当前策略,您将丢失上次备份和实例失败之间创建的所有数据。使用新方法,数据卷将一直写入,直到实例失败,因此您可以在新实例启动并运行后将其重新附加到新实例。

答案2

我使用 bash 脚本为我的帐户中的每个卷生成快照

#!/bin/bash

ec2-describe-volumes | awk '{ print $2 }' | sort -u >  /tmp/ebs_volumes

for i in $(cat /tmp/ebs_volumes); do
   echo $i;
   ec2-create-snapshot $i;
done

答案3

以下脚本将为 VPC 内的所有 ec2 实例创建 AMI 备份

#!/bin/bash
#Script to Automate AMI backup

echo "----------------------------------\n   `date`   \n----------------------------------"

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-xxx |   awk '{ print $8 }' | sort -n   | grep  "i-" > /tmp/instanceid.txt

echo "Starting the Daily AMI creation: "

 #To create AMI from instance-id 

for i in $(cat /tmp/instanceid.txt); do
        echo "Creating AMI for Instance id $i ......."


echo "instance-`date +%d%b%y`-$i" > /tmp/aminame.txt

aws ec2 create-image --instance-id $i --name "`cat /tmp/aminame.txt`" --description "This is created by ami-backup.sh" --no-reboot | grep -ir ami | awk '{print $4}' > /tmp/amiID.txt

echo  "AMI Name is: `cat /tmp/aminame.txt`\n"

done

echo done

相关内容