前言
为了减轻对数据库的运维压力,将自建的mysql数据库转为RDS数据库。
迁移环境
- 阿里云RDS——专有网络
- 阿里云ECS——经典网络(应用服务器)
- 阿里云ECS——经典网络(DB服务器)
- 咨询过阿里云,我们ECS经典网络不支持直接从经典网络迁移到专有网络,需购买新的服务器。
相关IP以及应用网络配置
IP 服务器类别 类别 外网IP
10.10.3.10 应用服务器 应用服务器-A 183.44.79.28
10.10.3.11 自建mysql 自建数据库-B *
172.10.10.11 阿里云RDS RDS-C *
172.10.10.12 (新购)阿里云ECS-应用服务器 新购VPS服务器-D 183.44.79.27
我们需要将应用从A迁移到D;将数据库从B迁移到D
迁移步骤
1.先在服务器D中搭建好相关的应用运行环境———APR-Tomcat、JDK、Nginx
2.使用阿里云提供的ClassicLink将经典网络与专有网络互通。也就是上面的四台服务器都能相互ping通,目的是让D服务器能链接上B的数据库。
3.将应用从A服务器中复制到D服务器中去,启动D中的应用,观察应用是否能正常启动。
4.在D服务器中的应用能正常启动后,需修改A的Nginx配置,配置一份代理,类型是backup,目的是在A应用stop后,此backup会将请求转发到D服务器的应用中去。
5.停止A服务的应用,观察A中的Nginx是否能将请求都转发到D的应用中去。如果正常,则说明我们应用已成功迁移到D服务器中。
6.最后修改域名指向的外网IP,将183.44.79.28修改为183.44.79.27。因CDN有缓存,故修改后,从域名进来的请求并不会立刻请求到183.44.79.27的IP上,还需保留A服务器的Nginx应用正常服务一到两天。目的是为了保持所有请求都会转发到D服务器中。
到此,我们已经迁移好了应用了。但是数据库这块还需要迁移。
7.为了能正常快速迁移,我们并没有使用阿里云提供的自建Mysql迁移到RDS上的工具。
此处需要提一下我们的业务:天猫的充值业务;整个过程比较简单,将天猫请求的数据,保存至数据库后,再发送充值到充值系统,然后等待充值系统的结果通知,根据结果业务闭环
8.最初的想法是在D中启动多一份应用,但是此引用链接的是RDS数据库;在天猫请求过来的充值数据用新的线程post一份至此应用中。但是仔细想了一下,这样会硬气引起自建数据库与RDS自增主键不一致的问题。如果天猫同时推送3笔充值数据过来,那么就有可能订单A的主键ID在自建mysql是10001,而在RDS的自增主键却有可能是10002
9.最后的方法是在订单请求充值后,查询一次订单,然后将订单的信息post到新的应用(连接到RDS),在此post的接口处理的逻辑仅仅是将数据插入到数据库中(此处用了Nutz Dao简单而方便
)。
10.然后在接收通知结果的接口中,直接将接收到的数据,启用新的线程post一份至连接到RDS应用中。
这样我们就能将从此刻起的数据,在自建数据库同步至RDS数据库
。
11.观察一段时间的订单,对比订单的数据,如果没有差异,则说明上述的步骤是支持我们的逻辑,而且对天猫来说是透明,不需要停机就能完成迁移了。