在发上一个线上版本之前,由于开发的同学把流程性的东西抛到一边,只想着省事,很多到测试这边的版本都没有打tag,也没有给转测试的脚本文件,为了这次版本的顺利发布,要做一次线上环境的模拟发布流程。所以需要把生产上的redis数据导到测试的redis上面来。
我们的生产redis用的是阿里云的集群模式,在这里要说明一下,阿里云上面的redis的集群备份显示让我有点谜糊,因为他上面保存的显示的都是DB0开头的文件,当时我还以为只是redis的db0的数据,因为我们用的是db10,所以当时提了工单到阿里云,就问他们怎么只有db0数据,没有db10数据,等了四五个小时,阿里云那边才给回复说db0代表集群中的第一个数据库,不是代表的DB0。好吧,因为是集群模式,下载的下来的redis备份文件是两个rdb文件,但是由于测试环境只是单机模式,那这两个rdb文件要如何还原到单机的redis上面来呢?
找了好久,终于找到一个方法,那就是把手动把rdb文件合并成一个后,再还原到redis中去,合并方式如下:
cat 1.rdb > dump.rdb
cat 2.rdb >> dump.rdb
如果超过两个,后面的可以依次通过cat x.rdb >> dump.rdb往同一个文件后面合并就行了。
合并后把dump.rdb的文件放到redis的data目录下,重启redis即可生效。
后面测试了一下数据,redis的相关数据是完整的。
生产上mysql相关数据结构也还原到测试环境上,然后进行了预发布,预发布成功后,发现还是有一些脚本少了,更新脚本后,业务正常。
这一次经历有以下几点可以借鉴:
1、关于流程,一定要规范化,否则很容易出现类似的问题。尽管我们现在的技术团队这一块做得不是很好,但是本人一直在驱动着组内的成员,不管是开发、还是测试或者是运维。只有规范了,这种问题相对来讲会少很多,但也不能完全保证,因为代码和脚本的提交是由开发人员提交,这跟个人的经验以及工作态度和责任心有很大的关系。
2、关于手动合并rdb问题,开始时想了很久一直没想明白要如何还原多个rdb,这个可以算是一个比较好的经验积累。
3、关于预部署,在流程不规范的情况下,这种方式有助于提高发布时不会出现问题的机率。