导入数据到新的服务器

近期迁移服务器花了不少时间来导入用户数据到新的服务器中, 由于之前 redis 是在本地部署的, 现在需要切换到云 redis 中. 而 redis 本身并没有像 mysql 那样有一个 dump 程序. 所以上网找了一个 redis-dump 的工具, 先将数据从 redis 中导出成 json 数据. 然后再将此 json 文件导入到新的 redis 中. 我并没有去看里边的源码, 这个项目是以 ruby 语言编写的. 但基本的过程猜测了一下, 大致是使用 KEY 命令罗列所有的键名, 并获取他们的类型, 最后调用相应的命令去拿到数据并写入到 json 文件中. 导入的过程类似. 不知导入数据时, 如果之前存在旧的数据是先删除再写入, 还是直接覆盖, 如果是直接覆盖的话对于不同类型的键就需要使用特定的命令, 特别是对于 Lists 要使用 LSET 命令. 经过测试发现, 如果 List 之前有数据导入时候会在末尾增加数据, 这样就出错了. 除了这个 dump 工具, 还有 redis-rdb-tools 可以拿来分析 dump.rdb 文件, 包括转化为 json 数据以及内存占用分析. 说实话, 其实自己对 redis 的整个工作原理还有它所包含的各种特性还不是非常了解, 像集群、数据落地、事务、订阅这些工作机制了解还多非常少.

在导入的过程中发现在 redis 中存在大量日志数据, 比如下注的日志、签到领奖、购买的日志等. 当初同事设计这些的意思是先暂存在 redis 中, 然后由后台的定时任务取数据, 整理之后存入 mysql 并删除 redis 中的数据. 但由于异常或者某些没有考虑到的情况, 数据就不断累积到 7G 之大. 下周的花一些时间去整理这部分数据和代码, 否则等到真正的迁移时候会发现迁移时间很长. 目前我想到了两种方案, 第一是使用 rabbitMq 之类的消息队列将这种日志直接发送到队列中, 然后后台任务就直接订阅整理分析就完事了. 只要设计好数据格式, 订阅键的话应该不难. 另外一种方法改动起来就更为简单一些: 给这些日志键设置一个过期时间, 比如一天. 一旦这些数据最终没有被后台任务统计到并清理, 它们可以自行销毁. 第一种方案会遇到一个问题就是某些日志刚开始生成的时候是不完整的, 最后当过程完成时会添加或修改内容而生成一个完整的日志数据. 这样就要判断好开始结束点, 并且在结束点发送到消息队列, 并删除缓存. 因而工作量也会大一些.

另外一点我预估会遇到的问题就是在众多 redis 键中寻找哪些是日志键会比较困难. 名字很可能没有统一的后缀, 没有以游戏开头的前缀. 这些都会对此项工作造成一定影响. 我想首先还是得从后台任务入手, 从中找出部分的日志键修改, 当然, 可能要查看所有的键的工作可能是免不了的. 可见一个命名良好的数据对于后期的工作来说是多么的重要.