工作中redis合库以及aof踩坑记

服务器

浏览数:49

2020-6-21


概述

    此文是第一次搞redis主从小白犯的错,大神可以忽略。记录为了让看到本博文的小白前车之鉴

软件资源

            centOs:6.5

            redis:2.8.10

 背景  

            公司现有架构均是单机模式,本文仅先介绍redis单机踩的坑– 即生产应用redis均是单一实例,一旦实例挂掉功能就会不可用。现公司业务使用了一台实例(业务实例),一台session共享实例(session实例)。

            现需要对现有架构升级(后续会出整个架构升级的相关博客),先从最简单的redis开始开刀,采用主从复制,启用哨兵监听进行主从切换(后续会有相关详细博客)。

基本问题

  •  线上redis仅启用了rdb持久化,需要启用AOF
  • 线上业务实例和session实例 keys<1W,可以把业务实例和session实例合并节约资源

踩坑记

    AOF挖坑

      已经搭建了主从模式,创建了多个key验证没问题, 很开心ing, 发现需要启用AOF,查看官方文档认为so easy, 于是乎 改改改配置,重启服务,在主节点添加了一个key,主从验证通过, 非常开心ing。

    【敲黑板,开始挖坑了哈】 此时模拟极端故障,把主从节点都停掉了,开始依次开启服务,发现仅有开启AOF后添加的一个key,泪崩ing。。。。

    AOF填坑

    经过多次尝试,终于找到问题

    问题解析:redis运行一段时间后 再开启AOF,AOF持久化文件是个空文件,它只会追加开启AOF后的操作记录,开启AOF之前的操作均不会记录,所以我挖坑过程中,开启AOF后没有对那些旧key做过任何操作,导致没有记录到旧key的操作,所有再次启动时,仅仅恢复了开启AOF后操作的key

    解决方案:运行了一段时间的redis,才开启AOF一定要记得先对实例进行一次AOF持久化,即持久化一下开启AOF持久化之前的数据

    合库挖坑

    因为要把session实例和业务实例做一次数据合并,太懒,不想写脚本做redis数据迁移。。想到了AOF持久化文件,将两个实例的AOF文件做一次合并,然后重启服务不就可以做合库操作了吗?

    【敲黑板,开始挖坑了哈】

    业务实例的AOF文件内容如下

    session实例的AOF文件内容如下:

把session实例AOF文件内容复制到业务实例AOF中,内容如下:

 

此处文件本身最后还有一个25行的空行, 本人洁癖,很开心的删掉了。

把文件放到服务器替换AOF文件,重启redis服务

报出了AOF损坏的错误

   合库填坑

    根据提示执行了修复命令,查看修复后的文件和我合并文件,发现最后一条命令自行修复删除了,推断是最后一条命令有问题

    问题解析:由于本人把最后的空行删除了,导致AOF检验失败,查看AOF文件格式,推断出那个空行是redis的标识行,专门用来对新命令做追加操作。

    解决方案:加上最后一行换行符,实践证明,手–贱是要付出代价的!!!手–贱是要付出代价的!!!手–贱是要付出代价的!!!

作者:java_龙