Amazon Web Services 第 2 部分 - 为您的网站添加数据库





5.00/5 (2投票s)
在 AWS 上为您的网站添加数据库,
引言
这是关于将您的网站部署到 Amazon Web Services (AWS) 系列文章的第二部分,AWS 是亚马逊与 Windows Azure 相对应的服务。
在 第一部分 中,我们研究了一个带有负载均衡的 Web 服务器和自动故障转移的 SQL Server 数据库的网站架构。然后,我们实现了一个不带数据库的简单网站。在这一部分,我们将添加数据库。也就是说,我们将完成下面绿色部分的内容。红色部分(DNS 名称服务器,以便您的网站使用您自己的域名)将在 另一部分 中介绍。

本文假定您已按照 第一部分 中的描述,使用 Elastic Beanstalk 应用程序 将网站部署到了 AWS。我们将首先创建数据库,然后 部署一个使用该数据库的新版本网站。
自动故障转移,又称 Multi-AZ 部署
AWS 将自动故障转移功能称为 Multi-AZ 部署。AZ 代表可用区 (Availability Zone)。AZ 本质上是一个数据中心,拥有自己的电源等。
通过 Multi-AZ 部署,AWS 会在同一区域内的另一个可用区中创建一个备份数据库服务器。对主数据库服务器的修改会持续镜像到另一台服务器。如果主数据库服务器出现故障,另一台服务器会自动成为主服务器(故障转移)。由于它与主数据库拥有相同的 DNS 名称,因此您的应用程序不需要新的连接字符串。
故障转移过程可能需要几分钟。在此期间,您的应用程序将看到数据库连接中断。AWS 会自动启动一个新的备份数据库服务器。
由于备份服务器位于不同的数据中心,因此主服务器和备份服务器同时出现故障的可能性非常小。由于它们位于同一区域,因此从主服务器到备份服务器的数据传输仍然很快。
请注意,SQL Server 数据库的自动故障转移 目前仅在 美国东部(弗吉尼亚北部)、美国西部(俄勒冈)和欧洲(爱尔兰)AWS 区域可用。
带故障转移的数据库需要付费
如果您使用的是 AWS 免费套餐,则可以 免费 使用运行 SQL Server Express 的数据库服务器(截至 2015 年 3 月)。
问题在于,Amazon 使用 SQL Server 镜像功能 实现 SQL Server 服务器的故障转移。此功能 不适用于 SQL Server Express。
支持镜像的最便宜的选项是 db.m1.small 实例上的 SQL Server Standard Edition 数据库(定价)。
因此,我将在下面讨论 SQL Server Express(无故障转移)和 SQL Server Standard Edition(带故障转移,需要付费)的安装。
创建 SQL Server Express 数据库
-
选择引擎 - 点击页面顶部的 服务 | RDS | 立即开始 | SQL Server 图标 | 选择 SQL Server Express。
-
指定数据库详细信息 - 在这里输入数据库的大部分详细信息。
字段 值 数据库实例类 db.t1.micro 分配的存储 免费套餐最多提供 20GB,所以保持在这个值。请注意,SQL Server Express 需要 20GB 或更多,因此 20GB 是最佳选择。 数据库实例标识符 在同一区域内的数据库中必须唯一。可以起一个不太起眼的名称,例如“dbinstance1”。 用户名、密码 托管在 RDS 上的 SQL Server 数据库 只能使用 SQL Server 身份验证,不能使用 Windows 身份验证。您在此处输入的用户名和密码也必须用于您的应用程序在 AWS 上使用的连接字符串。 点击右下角的 下一步。
-
配置高级设置 - 可以保留所有默认设置。点击 启动数据库实例。点击 查看您的数据库实例 以转到您真正想去的地方。
- 您现在位于显示数据库服务器的 RDS 页面。它将显示您的服务器正在启动,这需要一段时间。
创建 SQL Server Standard Edition 数据库
-
选择引擎 - 点击页面顶部的 服务 | RDS | 立即开始 | SQL Server 图标 | 选择 SQL Server SE。
-
生产环境? - 考虑到您在此是为了自动故障转移(即 Multi-AZ 部署),因此选择 是 是合理的。点击 下一步。
-
指定数据库详细信息 - 在这里输入数据库的大部分详细信息。
字段 值 许可模式 除非您自带 SQL Server 许可证,否则您将希望 AWS 来处理许可证:license-included。 数据库实例类 db.m1.micro 是最便宜的选项,但它可能不够强大(比较实例)。 分配的存储 Standard Edition 需要 200GB 或更多。 数据库实例标识符 在同一区域内的数据库中必须唯一。可以起一个不太起眼的名称,例如“dbinstance1”。 用户名、密码 托管在 RDS 上的 SQL Server 数据库 只能使用 SQL Server 身份验证,不能使用 Windows 身份验证。您在此处输入的用户名和密码也必须用于您的应用程序在 AWS 上使用的连接字符串。 点击右下角的 下一步。
-
配置高级设置 - 可以保留所有默认设置。点击 启动数据库实例。点击 查看您的数据库实例 以转到您真正想去的地方。
- 您现在位于显示数据库服务器的 RDS 页面。它将显示您的服务器正在启动,这需要一段时间。
在创建 Elastic Beanstalk 应用程序时添加数据库
在 第一部分 中,在浏览创建 Web 服务器和负载均衡器的向导时,有一个 其他资源 步骤,向导提供了创建数据库的选项。
当时无疑可以创建一个数据库。向导会询问您的用户名、密码、数据库实例等,甚至是否需要 Multi-AZ 部署。
但是,如果您选择“是”,Elastic Beanstalk 在实际尝试创建应用程序时会抛出错误。这是因为 SQL Server 的 Multi-AZ 部署要求创建一个 选项组 并将其附加到 SQL Server 数据库服务器上,以启用镜像。然而,Elastic Beanstalk 无法完成此操作。由于此 bug,直接从 RDS 控制台创建数据库会更方便。
请注意,如果您创建了带有 Multi-AZ 部署的 SQL Server Standard Edition 数据库服务器,可以在此处查看其选项组:服务 | RDS | 实例 | 点击您的数据库(将显示数据库详细信息)| 在详细信息部分点击选项组。
查找数据库服务器名称
在为新的数据库服务器创建连接字符串时,以及尝试使用 SSMS 连接它时,您需要知道服务器名称。
该名称在 RDS 控制台上显示为“Endpoint”。

将您的当前架构和数据复制到新数据库
顺便说一句,没有什么可以阻止您从 SQL Server Management Studio (SSMS) 访问您在 AWS 上的新数据库。只需使用 前面找到的数据库名称 以及创建新数据库时指定的用户名和密码创建新连接即可。
如果您的网站使用 Entity Framework Code First 并且您还没有任何数据,事情会很简单。这是因为 EF Code First 在首次在空服务器上运行时会创建数据库架构。
我的试用网站 SimpleSiteWithDb(位于 Github)使用 EF Code First。因此,如果您使用的是这个,您就已经完成了!
如果您的应用程序不使用 Entity Framework Code First,或者您需要在网站启动前预加载数据,您将希望将现有数据库的架构复制到新的 AWS 数据库,然后再复制数据。
这里有一个问题是,AWS 不允许您登录 RDS 数据库服务器。这意味着您不能简单地备份现有数据库并将其恢复到 AWS 上的新数据库服务器。
但是,您可以使用 SQL Database Migration Wizard 轻松复制架构。这个工具讽刺的是,它是在微软内部创建的,用于将数据库迁移到 Microsoft Azure。
- 下载 SQL Database Migration Wizard。它会给您一个 .zip 文件。
- 解压缩 .zip 文件。结果将包含一个名为 SQLAzureMW.exe 的文件。
- 运行 SQLAzureMW.exe。将出现一个向导。
- 选择进程 - 将 Analyze / Migrate 设置为 Database。将 Target Server 设置为 SQL Server。勾选其他所有选项。点击 Next。
- Connect to Server 对话框 - 输入源数据库的详细信息。
- 在向导中,它允许您保存一个创建架构的脚本。您可以使用 SSMS 来执行此操作,但如果您点击 Next,它将为您应用该脚本。
- Setup Target Server Connection - Connect to Server 对话框 - 输入您在 AWS 上的新数据库的详细信息。将 Database 保留为 Master DB。点击 Connect。
- Setup Target Server Connection - 点击您的目标数据库。点击 Create Database。它现在将传输架构。点击 Exit。
完成后,您可以使用 SQL Server Import and Export Wizard 将数据从当前数据库复制到新的 AWS 数据库。
- 打开 SQL Server Management Studio;
- 连接到您的当前服务器;
- 右键单击您的当前数据库 | Tasks | Export Data。
使用数据库的试用网站
如果您有一个使用 SQL Server 数据库的网站项目,您可以使用它。MVC 和 WebForms 都可以。
否则,您可以随时从 Github 获取我的试用网站 SimpleSiteWithDb。
我假设您首先想在本地计算机上运行此网站,并使用本地数据库,然后再尝试将其部署到 AWS。在这种情况下,请在本地计算机上运行 之前 执行以下步骤:
- 确保您有权访问 SQL Server 数据库服务器。如果没有,请免费安装 SQL Server Express。
- 编辑 web.config 文件中的连接字符串,使其指向您的数据库服务器。
如果您使用自己的网站,请确保所有指向 Web 应用程序外部的引用都将 Copy Local 设置为 True(我的试用网站已完成此操作)。特别是对于 NuGet 包,因为它们通常位于项目目录外的 packages 目录中。框架 DLL 应该没问题,因为 AWS EC2 Web 服务器将安装 .Net Framework。

最后,确保您的网站的 Release 版本有一个指向 AWS 数据库服务器的连接字符串,而不是您的本地数据库服务器。
您可以通过 Web.config 转换 来实现这一点,方法是在 Web.config 文件所在的目录中添加一个 Web.Release.config 文件。Web.Release.config 文件包含 XSLT,用于将 Web.config 文件转换为 Release 版本。
我的试用网站已经有这样一个文件。请务必修改它,以填写您自己的数据库名称、用户名和密码。
否则,此 Web.Release.config 文件可以起到作用。
<?xml version="1.0"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <connectionStrings> <add name="<connection string name used in web.config>" connectionString="Data Source=........rds.amazonaws.com;Initial Catalog=....;User Id=.....; Password=.......;" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> </configuration>
别忘了填写您的服务器名称、用户名和密码。
一些连接字符串使用 Integrated Security=SSPI;。请勿在 AWS 托管的网站上使用此设置。这会导致 AWS 尝试使用 NT AUTHORITY\ANONYMOUS LOGON 帐户而不是您自己的帐户登录您的数据库,这将失败。
部署您的网站
- 为您的网站创建一个 应用程序源包;
- 打开 Elastic Beanstalk 控制台:点击 服务 | Elastic Beanstalk | 您的应用程序(您在 第一部分 中创建的)。
- 如果您停止了 Web 服务器,请使您的应用程序重新运行:Actions | Rebuild Environment。
- 在 Elastic Beanstalk 控制台上点击 Upload and Deploy 以部署您的应用程序源包。
- 部署完您的网站后,点击新环境的 URL(紧挨着您的环境名称标题),即可看到您的网站出现。
后续章节
在 后续部分 中,您将看到如何将您自己的域名指向您在 AWS 托管的网站,以及如何使用证书为您的网站提供安全连接(https 而不是 http)。