数据库确定了,但是又有一个大问题,因为腾讯云和阿里云不是同一个云服务商,所以只能走外网,那就必须将所有服务一起迁移到阿里云上面才可以。这个过程难点有两个,一个是在迁移完成最后切换的过程,要保证服务可用,不能中断。第二个难点是需要切分新的分支,因为两边的Dockerfile文件是不一样的。
挑战2
阿里云的PolarDB-X虽然兼容原生的MYSQL,但是个别的SQL还是不兼容,需要根据PolarDB-X的规则进行修改。所以我们在全面迁移之前,得兼容PolarDB-X的SQL规则,保证所有的SQL都是可执行的。
挑战3
因为是进行系统迁移,必须要进行回归测试,不仅仅是API服务的还有数据服务,测试流程长且繁琐。
三、当前系统
迁移之前先给大家介绍一下当前系统架构,因为这些模块都是必须的,阿里云平台上面肯定也需要对等的创建这些模块才可以。
技术栈:
XXL-JOB(分布式调度系统)
RabbitMQ(Linux服务器上面部署,非容器)
Java(开发语言)
Nginx(Linux服务器上面部署,非容器,前端vue项目就是放在里面)
腾讯云服务平台
MYSQL(腾讯云服务)
Redis(腾讯云服务)
架构图:
腾讯云的k8s采用的物理节点初始化加入到集群中,所有容器实际是运行在各个物理节点下面。
四、阿里云平台服务筛选
4.1 容器服务选择
阿里云的容器服务有ack和ask两种,他们之间最大的区别就是ack需要购买物理节点,而ask不需要。经过研讨确定之后,我们最终选择了无节点的ask容器服务。
4.2 云盘选择
只要是程序就必然会产生文件,现在因为采用ask无节点的容器服务,那日志就必须通过专门的盘来放置。对这个盘需要有如下几点要求:
有多种类型可供选择,像日志文件存储,不需要多强的性能,容量够用即可,像MQ的消息就要求吞吐量要足够高才可以。
可以设置过期自动删除策略,因为像日志文件不需要长时间保留,一般保留最近7天就可以。
要有完善的监控服务。
针对上诉要求,最终我们选择了NAS云盘服务。
4.3 监控选择
因为没有实际物理节点,很多报警指标都没办法设置,只能借助第三方的服务来进行监控和报警,这边我们选择了Prometheus作为监控和报警。
4.4 RabbitMQ选择
阿里云有MQ队列服务,可以直接购买使用,但是会有很多限制,所以MQ还是只能用原生的。
4.5 Redis选择
Redis直接买阿里云的Redis服务,直接和腾讯云进行对等购买就可以。
五、部署运行
因为阿里云采用ask容器服务,没有实际的物理节点,所以之前部署在节点上面的服务都要进行容器化才可以,例如Nginx、RabbitMQ。
创建镜像容器
第一步我们需要创建各个应用对应的镜像以及容器,这边需要注意的时候,镜像的命名空间最好以公司为主,容器的命名空间以类型为主。
虽然阿里云集成了k8s的功能,但是关键字、功能等还是采用原生的k8s,上面的命名空间就是k8s的命名空间。
导入测试数据
为了解决PolarDB-X的SQL兼容问题,需要将某一用户的数据从腾讯云的MYSQL导入到阿里云的PolarDB-X中,数据导入可以借助阿里云的DTS来实现。
回归测试
PolarDB-X测试数据准备完毕,所有的镜像和容器也都创建之后,就可以开始回归测试了。
如果有测试用例,那测试阶段就可以大大提高测试效率,这也是为什么我们平时最好要写测试用例的原因之一。
六、迁移前准备
Po
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
larDB-X的SQL兼容性修改完毕之后,就可以全面迁移数据了,迁移数据还是采用阿里云的DTS来进行,迁移数据可以分多个组进行,同步进行迁移,这种情况可以避免某些表因为频繁的进行修改,导致bin-log日志数据量突增,导致迁移的速度小于数据产生的速度(生产大于消费模型)。
当数据全部迁移过来之后,就可以开始正式迁移云服务平台了,在迁移之前我们需要做如下准备:
阿里云对应的分支是否和腾讯云对应分支最新代码一致。
阿里云的HTTPS SSL证书配置是否正确。1. 阿里云各个容器的配置、JVM参数设置、端口是否和腾讯云一致。
Redis、RabbitMQ脚本是否正确无误。
容器中各个服务配置(数据库、Redis、MQ等)是否正确。
腾讯云服务停止和阿里云服务启动顺序。
Nginx配置修改。
我们系统服务可以分为四大类:
API服务
监控服务
数据服务
分布式调度服务
除了API服务,其它三类短时间停止,不会有很大问题。
6.1 停止推送服务
第一步先将腾讯云数据推送服务停止,确定新的数据不会产生,将MQ中不可删除的消息,通过MQ脚本迁移到阿里云MQ中,确保MQ没有消息存在。
在停止服务之前,先要确定哪些服务在运行阶段是不可被打断的,如果被打断就会存在数据缺失的情况,这种任务就得特殊对待,等它执行完再停止。
6.2 迁移Redis
数据服务全部停止之后,迁移腾讯云的Redis数据到阿里云Redis中。
6.3 启动阿里云服务
将阿里云的API服务全部启动,保证阿里云平台的系统可用。
6.4 修改DNS转发
停止阿里云DTS数据迁移任务,将DNS解析修改为阿里云IP,将原本Nginx中转发也转到对应IP中(因为客户端可能存在DNS缓存,还是会走之前的IP)。
6.5 关闭腾讯云服务
关闭腾讯云剩余所有服务,启动阿里云所有服务,并检查各个服务健康状态。
至此腾讯云的服务就全部迁移到阿里云平台中来了,整个切换的过程没有发生很大的问题,但是切换过来之后,问题就频繁出现了。
七、迁移后遗症
7.1 带宽受限
迁移过来之后,系统页面可以打开,但是各个数据服务消费速度异常慢,检查错误发现基本都是网络连接错误,也就是丢包问题。容器本身CPU、内存、IO都是正常的,最终发现是网关连接数超标导致的丢包问题,升级网关配置,数据消费服务就正常了。(HTTP请求的TCP连接数过大,应该是应用程序出问题导致的,因为情况比较紧急,所以先升配置,具体问题后面再检查)。
网关配置升级不仅仅是连接数升级,还需要一起升级带宽,不然带宽达到上限也会导致丢包问题发生。