[TOC]
线上redis迁移思路
背景
实际应用中,我们的系统在上线后,总会遇到一些问题,需要对redis进行迁移,或者说切实例。但是由于是线上系统,一个是要谨慎,一个是要保证服务可用,在不停服的情况进行处理。
比如,我们的redis实例的机器宕机、或者机器磁盘只读、或者redis服务异常;或者需要rename一些高危命令;或者业务底层redis存储机制更改。当我们遇到诸如此类的场景,那么就需要考虑切redis实例了,下面就一些常用场景来一一举例说明
一个大的前提是,业务访问资源,建议都是通过域名来访问,而不是ip来访问。
迁移方案
迁移从库
背景
如果redis实例所在机器异常,需要迁移,并且这个redis实例,是业务的从库,业务这边做了读写分离,写主库、读从库的话,切从库是最容易实现的,基本就是DBA切个DNS,当前,前提是业务访问是通过域名访问而不是直接通过ip访问
具体方案
假如主库是7526
-
先从主库上搭建新的从库
-
7526 挂载新的实例host 并下掉老的实例Host
-
确定老的从库的连接数,要保证老的从库没有连接,
- 可以通过info查看client, 也可以client list 查看
- DBA 可以通过监控查看, 也可以通过登录redis主机查看
-
如果老的从库没有连接了,并且新的从库有连接,就说明切从库实例ok
一般,通过DNS来解析的话,业务如果采用连接池等方式,那可能迁移的过程,业务需要重启,才能保证马上断开连接,实际中就发现虽然ping 从库域名已经是新的ip地址了,但是时间上,程序里面连接的还是老的ip,这个时候需要重启一下服务
迁移主库
背景
如果redis实例所在机器异常,或者其他需要迁移,并且这个redis实例,是业务的主库,那么迁移主库的流程,相对从库的流程就稍微麻烦一点。
具体方案
前提如下:
m7614.xxx.redis.com 对应的IP是 192.168.xxx.93
s7614.xxx.redis.com 对应的ip是 192.168.xxx.94
思路:
提升从实例为主实例,然后把主从域名都指向从实例去,然后再搭建新的从库
迁移流程是:
- 把192.168.xxx.94 slave_readonly 设置为no,并设置 slaveof no one(配置文件删slaveof 192.168.xxx.93 7614)
- 然后要注意192.168.xxx.94要同步完原主库的数据,等数据同步完后,再把m7614.xxx.redis.com 解析改到 192.168.xxx.94,然后业务确定域名是否解析正常
- 业务这边如果有长连接进程的话重启相关进程 ,重启老的主库实例进程(程序端),确保老库没有连接
- 重新搭建从实例。
- 新从库建好后,再重新搞一下从库的域名并挂载到新从库上
双写+迁移
背景
在某些场景下,如果直接切主库、切从库都不合适,可能会导致数据不一致或者数据丢失;或者需要停服或者短暂停写的情况下,我们就要考虑双写+迁移策略,双写+迁移策略是万能的,不仅仅针对redis,其他资源如mysql等也是好使的。
这个方案稍微繁琐一点,但是有个好处就是一定保证不停服,不影响用户,并且能够回滚,保证数据一致性。缺点就是需要业务方在修改代码,并且再代码里面增加开关配置,好的做法是通过配置文件就能够打开双写、读写新库等
具体方案
- 业务方修改代码,增加双写配置开关,然后更新上线
- 再在代码里面开启双写,也就是新库老库都写
- 后台进程或者脚本进行数据同步,把老库的数据同步到新库中,并要做check,确保数据一定是一致的
- 同步完成后,通过代码配置文件来控制停止双写,读写新库。
- 确保读写新库ok后,再清掉老库的某个迁移出去的db。
这个方案的两个关键点在于:
- 代码里面增加的双写开关配置,要做到抽象,确保通过配置,就能打开双写配置、停止双写、读写新库
- 后台脚本校验程序要做好,确保数据的一致性
总结
以上几种情况都是xxx项目在这一年多来遇到的,并且都是和运维、DBA一起做过迁移,算是一点点小经验。 另外一点就是开发人员要能够分析排查问题,遇到线上问题后,要能够通过各种手段定位到原因,再给出合适的解决方案