线上redis迁移思路

[TOC]

线上redis迁移思路

背景

实际应用中,我们的系统在上线后,总会遇到一些问题,需要对redis进行迁移,或者说切实例。但是由于是线上系统,一个是要谨慎,一个是要保证服务可用,在不停服的情况进行处理。

比如,我们的redis实例的机器宕机、或者机器磁盘只读、或者redis服务异常;或者需要rename一些高危命令;或者业务底层redis存储机制更改。当我们遇到诸如此类的场景,那么就需要考虑切redis实例了,下面就一些常用场景来一一举例说明

一个大的前提是,业务访问资源,建议都是通过域名来访问,而不是ip来访问。

迁移方案

迁移从库

背景

如果redis实例所在机器异常,需要迁移,并且这个redis实例,是业务的从库,业务这边做了读写分离,写主库、读从库的话,切从库是最容易实现的,基本就是DBA切个DNS,当前,前提是业务访问是通过域名访问而不是直接通过ip访问

具体方案

假如主库是7526

  1. 先从主库上搭建新的从库

  2. 7526 挂载新的实例host 并下掉老的实例Host

  3. 确定老的从库的连接数,要保证老的从库没有连接,

    • 可以通过info查看client, 也可以client list 查看
    • DBA 可以通过监控查看, 也可以通过登录redis主机查看
  4. 如果老的从库没有连接了,并且新的从库有连接,就说明切从库实例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

思路:

提升从实例为主实例,然后把主从域名都指向从实例去,然后再搭建新的从库

迁移流程是:
  1. 把192.168.xxx.94 slave_readonly 设置为no,并设置 slaveof no one(配置文件删slaveof 192.168.xxx.93 7614)
  2. 然后要注意192.168.xxx.94要同步完原主库的数据,等数据同步完后,再把m7614.xxx.redis.com 解析改到 192.168.xxx.94,然后业务确定域名是否解析正常
  3. 业务这边如果有长连接进程的话重启相关进程 ,重启老的主库实例进程(程序端),确保老库没有连接
  4. 重新搭建从实例。
  5. 新从库建好后,再重新搞一下从库的域名并挂载到新从库上

双写+迁移

背景

在某些场景下,如果直接切主库、切从库都不合适,可能会导致数据不一致或者数据丢失;或者需要停服或者短暂停写的情况下,我们就要考虑双写+迁移策略,双写+迁移策略是万能的,不仅仅针对redis,其他资源如mysql等也是好使的。

这个方案稍微繁琐一点,但是有个好处就是一定保证不停服,不影响用户,并且能够回滚,保证数据一致性。缺点就是需要业务方在修改代码,并且再代码里面增加开关配置,好的做法是通过配置文件就能够打开双写、读写新库等

具体方案
  1. 业务方修改代码,增加双写配置开关,然后更新上线
  2. 再在代码里面开启双写,也就是新库老库都写
  3. 后台进程或者脚本进行数据同步,把老库的数据同步到新库中,并要做check,确保数据一定是一致的
  4. 同步完成后,通过代码配置文件来控制停止双写,读写新库。
  5. 确保读写新库ok后,再清掉老库的某个迁移出去的db。

这个方案的两个关键点在于:

  1. 代码里面增加的双写开关配置,要做到抽象,确保通过配置,就能打开双写配置、停止双写、读写新库
  2. 后台脚本校验程序要做好,确保数据的一致性

总结

以上几种情况都是xxx项目在这一年多来遇到的,并且都是和运维、DBA一起做过迁移,算是一点点小经验。 另外一点就是开发人员要能够分析排查问题,遇到线上问题后,要能够通过各种手段定位到原因,再给出合适的解决方案

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值