我刚刚开始尝试使用 Amazon 的 EC2 服务来运行使用 SQL Server 2005 Express 数据库的 asp.net Web 应用程序。我对如何配置和操作它以实现最佳可靠性有一些疑问,我希望在这里利用一些集体智慧,因为这是我第一次尝试 EC2。
这是我目前的配置方式:
操作系统:Windows 2003 SQL Server Express 2005
存储在 EBS 卷(E 驱动器)数据库上的 Web 内容存储在 EBS 卷(E 驱动器)数据库上的数据存储到“C 驱动器”,然后复制到 S3。弹性 IP 地址附加到生产实例。
现在,当我更改操作系统配置时,我会使用捆绑功能创建新的 AMI。不幸的是,我发现这会导致大量停机时间。在创建捆绑包并启动新实例时。似乎当我准备好创建新的 AMI 时,我应该:
- 启动一个新的临时实例。
- 从生产实例中分离 EBS 卷。
- 从生产实例中分离 IP 地址。
- 将 IP 地址附加到临时实例。
- 将 EBS 卷附加到临时实例。
- 从生产实例创建 AMI。
- 生产实例重新启动后,执行反向连接/分离步骤即可将其重新投入生产。
这是防止 EBS 卷损坏的正确事件顺序吗?如果我在数据库写入时分离 EBS 卷,EBS 卷是否会损坏?我是否应该对生产实例的 EBS 卷进行快照并将其附加到临时实例?或者在使用 EBS 卷时对其进行快照是否会导致损坏?有什么建议可以提高可靠性和操作性?
答案1
这很大程度上取决于您所做的更改类型以及您的 AMI 设置方式。
假设您只是对操作系统进行更改,并且您的 AMI 不会自动安装您的 EBS 卷...
- 启动 AMI 的第二个实例
- 将您的更改应用到第二个实例和捆绑包。
- 捆绑完成后,终止第二个实例。
- 注册您的新包并启动它的一个实例。
此时,您应该有一个更新的实例正在运行,只需将 IP 地址和 EBS 卷传输到新实例即可。可能最简单的方法是彻底关闭您的第一个 Windows 实例,完成后只需将 IP 和 EBS 卷附加到新实例即可。就我个人而言,我更喜欢执行以下操作...以防第二个实例无法正常工作并且我想回到第一个实例...
- 关闭第一个实例上的 IIS 和数据库服务。(以及访问 EBS 卷的任何其他应用程序/服务)
- 拍摄 EBS 卷的快照
- 从第一个实例中完全分离 EBS 卷。(http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1841)
- 将 EBS 卷和 IP 地址附加到第二个实例。
- 启动第二个实例上的 IIS 和数据库服务器并进行冒烟测试
由于您在 ami 的第二个实例上进行所有更新,因此在捆绑过程中不会出现停机时间。您还可以随时进行更新,即使在工作日期间,因为您不会触及生产实例。您唯一的停机时间是将 EBS 卷和 IP 转移到新实例时。另一个好处是,如果更新或有关新实例的任何内容不起作用,您可以恢复使用原始实例。
另外,还有一件事……在写入时强制分离数据库肯定会导致问题。小心您的 EBS 卷以及备份和快照。EBS 很棒,但它仍然可能会失败。