线上redis迁移思路

[TOC]mysql

线上redis迁移思路

背景

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

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

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

迁移方案

迁移从库

背景

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

具体方案

假如主库是7526cdn

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

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

  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一块儿作过迁移,算是一点点小经验。 另一点就是开发人员要可以分析排查问题,遇到线上问题后,要可以经过各类手段定位到缘由,再给出合适的解决方案

【"欢迎关注个人微信公众号:Linux 服务端系统研发,后面会大力经过微信公众号发送优质文章"】

个人微信公众号
相关文章
相关标签/搜索