在几乎不停机的情况下从 RDS MySQL 迁移到 Aurora MySQL
简介
在本教程中,我们将查看如何在最短停机时间内从 Amazon RDS MySQL 迁移到 Amazon Aurora MySQL。与任何数据库迁移一样,迁移方案有多种选择。为了将数据从 MySQL 数据库实例迁移到 Amazon Aurora MySQL 数据库集群,我们建议为源 MySQL 数据库实例使用一种特殊类型的节点,称为 Aurora 读副本。Amazon RDS 使用 MySQL 数据库引擎的二进制日志复制功能,对源 MySQL 数据库实例所做的更新会异步复制到 Aurora 读副本。当源数据库实例和 Aurora 读副本之间的复制延迟时间接近零时,将您的客户端应用程序重定向到 Aurora 读副本,然后使 Aurora 读副本成为独立的 Aurora MySQL 数据库集群。有关详细信息,请参阅 Amazon Aurora 文档。
本教程中讨论的方法和步骤适用于驻留在 Amazon RDS MySQL 数据库实例上且需要迁移到 Aurora MySQL 数据库集群的任何应用程序数据库。
本教程不在免费套餐范围内,只要您按照教程中的步骤进行操作并在本教程结束时终止您的资源,所需费用将不超过 1 美元。
学习内容
- 如何使用 RDS 读副本在最短停机时间内从 RDS MySQL 迁移到 Aurora MySQL
- 如何将读副本提升为新的独立 Aurora MySQL 数据库集群
- 如何将应用程序连接到新的数据库集群
前提条件
- 拥有 AWS 账户,如果您没有 AWS 账户,则可以创建新账户后开始使用。
- Amazon EC2 密钥对用于通过 SSH 安全连接到基于 Linux 的 EC2 实例。如果您已有密钥对,可以在本教程中使用它。如果您没有密钥对,请在完成本教程的首选区域中按照说明创建新密钥对。
- 建议您在默认 VPC 中完成本教程。在每个区域中,系统会自动使用其默认 VPC 创建每个包含基本网络配置的 AWS 账户,在基本网络配置中,您可以在该区域的任何可用区中预配资源,资源可以直接访问互联网。在极少数情况下,客户可以将这些默认 VPC 用于其他用途或将其完全删除。如果您在账户和区域中找不到默认 VPC,可通过执行此处列出的步骤重新创建默认 VPC。
操作步骤
-
步骤 1:设置 Web 应用程序
1.1 GitHub 页面上的 CloudFormation.yaml 模板将启动类型为 t2.micro 且具有最新 Amazon Linux 2 操作系统的 Amazon EC2 实例、引导 Apache/PHP,并安装简单的地址簿 Web 应用程序。该模板还将在免费套餐中创建一个 Amazon RDS MySQL 数据库实例(即没有多可用区设置或读副本的 db.t2.micro 类型的实例)。WebTier 安全组仅允许通过 SSH 和 HTTP 连接到 Web 服务器(EC2 实例),DBTier 安全组仅允许 WebTier 安全组通过 TCP 端口 3306 发起与 RDS 数据库实例的数据库连接请求。
前往 GitHub 链接并下载如下所示的文件。
点击 Code(代码)按钮,然后点击 Download ZIP(下载 ZIP)。您的浏览器将下载该 zip 文件夹。
前往该文件夹在您计算机上的位置,然后解压缩该文件夹。您将看到如上所示的所有文件。
(点击放大)1.2 - 打开 AWS CloudFormation 控制台并使用您的 AWS 账户凭据登录。选择 Region(区域)下拉菜单,然后选择适当的 AWS 区域。本教程使用的是 US West (Oregon) 区域。点击 Create stack(创建堆栈)。
(点击放大)选择 Template is ready(模板就绪),然后选择 Upload a template file(上传模板文件)作为源模板。然后点击 Choose file(选择文件)并上传 CloudFormation.yaml(在上一步中下载的文件)。点击 Next(下一步)。
(点击放大)使用下面指定的值填充表单,然后点击 Next(下一步):
Stack Name(堆栈名称):不带空格的唯一标识符
DBInstanceID:RDS 数据库实例标识符。默认值为 rdsdb
DatabaseName:数据库名称。默认值为 mydb
KeyName:此账户和区域中现有的密钥对
LatestAmild:不要更改此参数,它将安装最新的 Amazon Linux 2 OS AMI
MasterUsername:用于访问 MySQL 数据库的用户名
MasterPassword:用于访问 MySQL 数据库的密码
SubnetID:选择用于部署实例的子网
VPC:选择 VPC(上面的子网应属于此 VPC)
注意:此处创建的资源将以 Stack Name(堆栈名称)中指定的值为前缀。请指定在您的账户中具有唯一性的值。
在点击 Stack Options(堆栈选项)页上的 Next(下一步)之后,接受所有默认值,然后单击 Next(下一步)。
在 Review(查看)页面上,点击 Create stack(创建堆栈)。
(点击放大)1.3 - 此时,系统会将您重新定向到 CloudFormation 控制台,您将看到状态为 CREATE_IN_PROGRESS。请在此耐心等待,直到状态更改为 COMPLETE 为止。
(点击放大)您可以点击刷新图标以查看资源创建进度。
(点击放大)待 CloudFormation 状态更改为 CREATE_COMPLETE 之后,前往 Outputs(输出)页签。
记录您已启动的 CloudFormation 环境中的 Output(输出)值,因为您需要在本实验的后续步骤中使用此信息。
在本教程中,这些值设置为:
- RDS 数据库实例端点 - rdsdb.cp94ll5qcjxh.us-west-2.rds.amazonaws.com
这是您数据库实例的 DNS 名称,您将需要使用它连接到数据库。 - Web 服务器 URL - http://ec2-35-165-91-1.us-west-2.compute.amazonaws.com/
这是 Amazon EC2 实例的公共 DNS 名称。
(点击放大)1.4 – 打开一个新的浏览器页签,在浏览器中输入 EC2 实例的 Public DNS(公共 DNS)名称(来自上一步中)进入 Web 服务器界面。您应当会看到一个类似示例的网站。
点击 RDS 页签。
(点击放大)输入所示的凭据和数据库名称。输入在上一步中记录的 RDS 端点名称。点击 Submit(提交)按钮。
(点击放大)您将看到如图所示的简短消息,其中说明应用程序尝试连接到 RDS 数据库实例上的数据库。
您将查看 rds.conf.php 文件的内容
(点击放大)连接成功后,系统会将您重定向到一个简单的地址簿应用程序,其中会显示数据库中的所有信息。
(点击放大)在地址簿中随意浏览,并通过使用 Address Book(地址簿)中的 Add Contact(添加联系人)、Edit(编辑)和 Remove(删除)链接在 RDS 数据库中添加、编辑和删除内容。系统将显示在本教程中对地址簿所做的更改。
(点击放大)1.5 - 前往 EC2 控制台,选择 EC2 实例 (WebServer),然后点击 Connect(连接)。
(点击放大)在 Connect to your instance(连接到您的实例)对话框中,选择 EC2 Instance Connect (browser-based SSH connection)(EC2 实例连接(基于浏览器的 SSH 连接)),然后点击 Connect(连接)。系统将打开一个浏览器窗口,显示 EC2 实例命令行界面 (CLI)。
(点击放大)从命令行中,前往 /var/www/html 目录。通过发出 ls command 来列出文件和目录。通过使用 more command 来查看 rds.conf.ph 文件的内容。此配置文件已捕获有关数据库端点 DNS 名称、凭据和数据库名称的信息,这些信息是您将应用程序连接到数据库时在步骤 1.4 中输入的信息。在步骤 5 中,您将再次访问此文件。
(点击放大) - RDS 数据库实例端点 - rdsdb.cp94ll5qcjxh.us-west-2.rds.amazonaws.com
-
步骤 2:创建 Aurora 读副本
Amazon RDS 使用 MySQL 数据库引擎的二进制日志复制功能,为源 MySQL 数据库实例创建一种特殊类型的数据库集群,称为 Aurora 读副本。对源 MySQL 数据库实例所做的更新会异步复制到 Aurora 读副本。在此步骤中,您将创建 Aurora 读副本并监控复制进度。
2.1 - 打开 Amazon RDS 控制台,在左侧导航窗格中选择 Databases(数据库),然后选择要用作 Aurora 读副本源的 MySQL 数据库实例。在 Actions(操作)下拉菜单中,选择 Create Aurora read replica(创建 Aurora 读副本)。(点击放大)2.2 – 在本教程中,您将使用默认值配置 Aurora 读副本,并为 DB instance identifier(数据库实例标识符)输入一个适当的名称,如示例所示。
选择 Create read replica(创建读副本)
(点击放大)(点击放大)(点击放大)(点击放大)(点击放大)2.3 – 使用以下 2 个实例创建 Aurora 数据库集群:写实例和读实例。几分钟后,数据库集群的状态会更改为 Available(可用)。请注意,源 RDS 数据库实例的 rdsdb 角色会从步骤 2.1 中看到的角色更改为 Master(主)。
(点击放大)2.4 – 点击 Aurora 数据库集群以显示其详细信息。点击 Configuration(配置)页签,在 Database(数据库)部分中,确认 DB cluster role(数据库集群角色)是 Replica(副本), Replication source(复制源)是 RDS MySQL 数据库实例 rdsdb 的 ARN。
(点击放大)2.5 - 点击 Connectivity & security(连接和安全性)页签,记录 Endpoints(端点)部分下面 Writer 实例类型的 Endpoint name(端点名称)– 在本教程中,端点名称为 aurora-db-cluster.cluster-cp94ll5qcjxh.us-west-2.rds.amazonaws.com。
(点击放大) -
步骤 3:将 RDS 数据库实例更改为只读模式
在将 Aurora 读副本提升为独立数据库集群(步骤 5)并将应用程序重定向到 Aurora 读副本的终端(步骤 6)之前,请停止向源 RDS MySQL 数据库实例写入任何事务。执行此操作的方法是对分配给 RDS 数据库实例的参数组中的 read_only 参数进行修改。
3.1 – 前往 RDS 控制台上的 Parameter groups(参数组),选择自定义的参数组(由 CloudFormation 模板创建),然后从 Parameter group actions(参数组操作)下拉菜单中选择 Edit(编辑)。
(点击放大)3.2 – 在 Parameters(参数)部分中,搜索 read_only 参数。默认值为 {TrueIfReplica}。将此值显式设置为 1,这会将实例转换为只读模式。
(点击放大)3.3 – 点击 Save changes(保存更改)。此参数的 Apply type(应用类型)为 dynamic(动态),这意味着其设置会立即生效且无需重启。
(点击放大) -
步骤 4:确认已完成从 RDS 到 Aurora 的复制4.1 - 创建 Amazon Aurora 集群并加载初始数据集后,Amazon RDS 服务会创建从 RDS MySQL 实例到 Amazon Aurora 集群的 Binlog 复制。您可以通过观察 Amazon Aurora 集群上的 CloudWatch 指标 Aurora Binlog Replica Lag(Aurora Binlog 副本延迟)来监控复制进度。该指标定义为在 Aurora 上运行且与 MySQL 兼容的副本数据库集群落后于源数据库集群的时间长度。选择 Monitoring(监控)页签,然后在 CloudWatch 部分下面搜索所示的 Binlog 指标。
(点击放大)4.2 – CloudWatch 指标 Aurora Binlog Replica Lag(Aurora Binlog 副本延迟)为您提供 Binlog 副本延迟的高级视图,您可以通过登录新创建的 Amazon Aurora 集群来查找更精确的度量方式。为此,请使用 MySQL 客户端并运行 show slave status\G 命令。此命令会返回许多非常有用的信息,但我们需要的特定指标为 Seconds_Behind_Master。当该指标为 0(即复制没有延迟)时,说明新创建的 Amazon Aurora 集群与原始 RDS MySQL 数据库实例同步。
按照步骤 1.5 中的说明通过 SSH 进入 EC2 实例,然后连接到 Aurora 数据库集群的 Writer 端点(在步骤 2.5 中记录的 aurora-db-cluster.cluster-cp94ll5qcjxh.us-west-2.rds.amazonaws.com),然后执行 show slave status\G 命令。
Amazon Aurora 集群与源 RDS 数据库实例具有相同的主用户名和主密码。
此时,从源 RDS MySQL 数据库实例到 Aurora 数据库集群的数据库迁移已完成。
(点击放大) -
步骤 5:将 Aurora 读副本提升为独立集群
在此步骤中,您会将 Aurora 读副本提升为独立 Aurora 集群。提升应当很快就会完成,您可以在提升期间读取和写入 Aurora 读副本。
5.1 – 若要将 Aurora 读副本提升为 Aurora 数据库集群,请前往 Amazon RDS 控制台。在左侧导航窗格中,选择 Databases(数据库)。为 Aurora 读副本选择数据库集群 aurora-db-cluster。在 Actions(操作)下拉菜单中,选择 Promote(提升)。(点击放大)点击 Promote Read Replica(提升读副本)。
(点击放大)5.2 – 确认提升过程已完成。点击 Aurora 数据库集群,选择 Logs & events(日志和事件)页签,向下滚动到 Recent events(最近事件)部分并确认系统记录了一个 Promoted Read Replica cluster to stand-alone database cluster(已将读副本集群提升为独立数据库集群)的事件。
(点击放大)(点击放大)Aurora 数据库集群角色将更改为 Master(主),如 Configuration(配置)页签上的 Database(数据库)部分下面所示。在发生提升事件之前,角色为 Replica(副本),如步骤 2.4 中所示。
(点击放大)5.3 – 您还将注意到,源 RDS MySQL 数据库实例 rdsdb 的角色不再是 Master(主),如步骤 2.3 中所示。它现在的角色为 Instance(实例)。
(点击放大)5.4 – 在提升完成之后,源 RDS MySQL 数据库实例将与 Aurora 读副本取消链接。若有需要,您可以安全删除 RDS 数据库实例。AWS 建议您在删除生产 RDS 数据库实例之前创建其快照。
在本教程中,您将在没有创建快照的情况下停止 RDS MySQL 数据库实例。在左侧导航窗格中,选择 Databases(数据库)。选择源 RDS 数据库实例 rdsdb。在 Actions(操作)下拉菜单中,选择 Stop(停止)。
(点击放大)在 Create snapshot?(创建快照?)下选择 No(否)。
然后点击 Yes, Stop Now(是,立即停止)。
(点击放大)5.5 – 您将看到 RDS 数据库实例 rdsdb 现在处于 Stopped(已停止)状态。
(点击放大) -
步骤 6:将应用程序重定向以使用独立 Aurora 集群
应用程序现在可以开始向 Aurora 独立集群中写入数据了。
6.1 – 通过 SSH 进入 Web 服务器 EC2 实例,前往 /var/www/html 目录。将通过执行 sudo vi rds.conf.php 命令来修改 rds.conf.ph 文件。
(点击放大)6.2 – 将 RDS_URL 参数更改为 Aurora 集群 Writer 节点的 DNS 名称(即步骤 2.4 中记录的 aurora-db-cluster.cluster-cp94ll5qcjxh.us-west-2.rds.amazonaws.com)。然后保存该文件。
(点击放大)6.3 – 通过再次读取 cat rds.conf.php 文件来确认所做的更改是否生效。
(点击放大)6.4 – 打开一个新的浏览器页签,在浏览器中输入 EC2 实例的 Public DNS(公共 DNS)名称(即 ec2-34-219-103-10.us-west-2.compute.amazonaws.com)进入 Web 服务器界面。选择 RDS 页签。该 Web 服务器将连接到 Aurora 独立集群并显示数据库中相同的地址簿信息。
(点击放大)6.5 – 确认您还可以对 Aurora 独立集群上托管的此数据库执行写事务。在地址簿中随意浏览,并通过使用 Address Book(地址簿)中的 Add Contact(添加联系人)、Edit(编辑)和 Remove(删除)链接在您的数据库中添加、编辑和删除内容。系统将显示在本教程中对地址簿所做的更改。注意:本教程未考虑某些存储限制,但是当您进行生产迁移时应当考虑这些约束。有关更多详细信息,请参阅“将数据库迁移到 Amazon Aurora”白皮书和 文档。(点击放大) -
步骤 7:清除账户
最佳做法是删除不再使用的实例和资源,以免继续为其付费。请记住,所有正在运行的 Amazon EC2 和 RDS 资源都将以小时为单位按需计费。
7.1 - 将本教程中创建的所有 Aurora 数据库实例从 RDS 控制台中删除。
a. 选择 Aurora Reader 实例,点击 Actions(操作),然后选择 Delete(删除)。在该字段中输入 delete me。然后按下 Delete(删除)按钮。
b. 选择 Aurora Writer 实例,点击 Actions(操作),然后选择 Delete(删除)。取消选中 Create final snapshot(创建最终快照)和 Retain automated backups(保留自动备份)。对于生产数据库,您需要创建最终快照,以备恢复数据库时需要。勾选 I acknowledge(我确认)复选框,并在该字段中输入 delete me。然后按下 Delete(删除)按钮。此操作还将删除 Aurora 数据库集群。
7.2 - 删除在本教程中创建的 EC2 实例。在 EC2 控制台主页中,点击 Running Instances(运行中的实例);或者点击左侧菜单中的 Instances(实例实例)。勾选为 Web 应用程序创建的 EC2 实例旁边的复选框。然后依次点击 Actions(操作)、Instance State(实例状态)和 Terminate(终止)。在出现提示时点击 Yes, Terminate(是,终止)。
7.3 - 删除 EC2 密钥对(如果您在本教程中创建了新密钥对)。点击 EC2 控制台上左侧菜单中的 Key Pairs(密钥对)。勾选所创建的密钥对旁边的复选框。然后点击 Delete(删除)。
7.4 – 前往 AWS CloudFormation 控制台,然后选择为部署本教程中的资源而创建的 CloudFormation 堆栈。点击右上角的 Delete(删除)按钮。CloudFormation 将自动删除它先前启动的所有资源。(点击放大)点击 Delete stack(删除堆栈),然后在 CloudFormation 控制台上检查堆栈信息,确保系统已删除所选堆栈。
(点击放大)