传统业务公有云迁移避坑指南

目前国内很多企业已经在深入的使用公有云了。随着业务的发展,这些企业大部分会考虑做多云的双活或灾备以及根据云上产品功能和成本考虑从一家云迁到另一家云。下面几点希望能帮助每个运维在遇到类似的问题时能快速解决。

传统业务公有云迁移避坑指南

数据库同步问题

数据库同步使用DTS工具来做的,目前主流的公有云都有各家的DTS工具,DTS的工具原理基本都是从源库binlog读取数据然后插入到目标数据库。但各家的DTS工具容错性还是相差比较大的。下面我就说说数据库同步碰到的那些坑。

1、数据库中的表字段要允许NULL

在MySQL 同步过程中出现 Error 3140: Invalid JSON text: “The document is empty.” at position 0 in value for column,

原因是源库校验不严格。数据库中的字段要求为 NOT NULL,但是数据中存在值为 NULL 的数据。

有两个解决方法,根据需要处理:

(1)对源库中的数据进行修复,将所有值 NULL 的数据修正为正确的值 (这也符合业务逻辑需要)。

(2)对目标库中的表进行修改,将字段修改为允许为 NULL。例如表为 xxxx,字段为 total

ALTER TABLE `xxxx` CHANGE `total` `total` JSON NULL;

2、数据库源库binlog要保留时间久一点

在执行数据库同步的时候可能会碰到问题而导致需要重新启动做增量同步,但是有时这个同步是在晚上进行的,早上人为发现问题可能距离出现问题已经过去了好几个小时。

如果源库这个时候binlog只保留1~2个小时的话会导致用户在早上重启同步任务时找不到对应的binlog文件,从而只能再次做全量同步。建议源库binlog在同步时保留2~3天以上。

3、目标数据库磁盘空间建议是源库的2倍

在执行数据库同步的时候目标库除了会有大量的写入外还会有一些临时表及日志产生。如果两个库的磁盘空间一样大很容易产生目标库磁盘空间不足导致写入失败的问题。这样无疑会浪费很多的时间去处理。

所以建议是目标数据库磁盘空间先申请源库的2倍空间。如果费用相差不大迁完后就不要降了。

4、数据库同步时不能有计划任务

在同步数据库时DTS突然报出了一个主键ID错误的日志,同时同步也中断了。后来经过调研发现用户数据库有计划任务在跑导致的。所以在同步数据库时必须关闭针对数据库的计划任务。

ES迁移问题

ES迁移本身并没有什么问题,但是ES不同版本之间是有较大差异的,不仔细测试是发现不了一些隐藏的问题的。

客户碰到的ES问题是之前在XX云用的是ES低版本,默认分片为5。切换至XX云用的是ES 7版本,默认分片是1。

正常客户业务使用时需要根据业务去修改分片数,来适配业务。但客户并没有这么做导致了生产事故。帮客户去重建索引调整分片数后问题得到了解决。

DNS问题

迁移最后必定会经历域名的切换,域名切换覆盖全国和全世界时间都是不一定的,且不同的区域都会有一定的差异。

客户就碰到了某个项目访问有问题的情况。我们的做法是,在原公有云入口部署nginx,只要还是访问到原nginx的都proxy_pass到新的公有云入口。这样就保证了不会有人访问到老环境的情况。

结论:应用跨云迁移,看似一件非常简单的事情,实则充满了很多未知的问题。这些问题可能是公有云产品造成的可能是业务代码造成的。

原创文章,作者:zhou, jiajia,如若转载,请注明出处:https://www.yidc.net/archives/16411