文档章节

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

j
 java_龙
发布于 2017/06/21 18:04
字数 900
阅读 3080
收藏 106

概述

    此文是第一次搞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的标识行,专门用来对新命令做追加操作。

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

© 著作权归作者所有

j
粉丝 73
博文 104
码字总数 138429
作品 0
成都
程序员
私信 提问
加载中

评论(22)

实践哥
实践哥
appendonly yes打开后会马上把内存中的key都导入到aof里面的,是不是因为我是用redis3的,redis2没有这个功能?
实践哥
实践哥
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly yes
Mr岳
Mr岳
https://fengshao0907.github.io/2016/07/17/Redis-Protocol-specification%EF%BC%88Redis%E5%8D%8F%E8%AE%AE%E8%A7%84%E8%8C%83%EF%BC%89/
http://redis.io/topics/protocol
协议
老张大哥
老张大哥
rdb直接快照内存。数据比较完整,但及时性不好,有可能会丢掉某时间段的数据
j
java_龙 博主

引用来自“java_龙”的评论

引用来自“nidongwo-”的评论

总觉得手动操作爱出错,所以迁移的时候我都是用工具导出,然后再导入。
介绍一个工具,我一直用这个:https://github.com/delano/redis-dump

@nidongwo- 这个工具支持这种场景吗? A实例Db0有数据,B实例只有DB3有数据,两者进行合并

引用来自“nidongwo-”的评论

不支持。
嗯嗯..如果只是数据单纯的迁移,你这个工具确实很不错.....
cisiqo
cisiqo

引用来自“java_龙”的评论

引用来自“nidongwo-”的评论

总觉得手动操作爱出错,所以迁移的时候我都是用工具导出,然后再导入。
介绍一个工具,我一直用这个:https://github.com/delano/redis-dump

@nidongwo- 这个工具支持这种场景吗? A实例Db0有数据,B实例只有DB3有数据,两者进行合并
不支持。
j
java_龙 博主

引用来自“nidongwo-”的评论

总觉得手动操作爱出错,所以迁移的时候我都是用工具导出,然后再导入。
介绍一个工具,我一直用这个:https://github.com/delano/redis-dump

@nidongwo- 这个工具支持这种场景吗? A实例Db0有数据,B实例只有DB3有数据,两者进行合并
cisiqo
cisiqo
总觉得手动操作爱出错,所以迁移的时候我都是用工具导出,然后再导入。
介绍一个工具,我一直用这个:https://github.com/delano/redis-dump
老汉-憨憨
老汉-憨憨
经验之谈, 总结的不错。 👍
手握华为赛神仙
手握华为赛神仙

引用来自“java_龙”的评论

引用来自“Fenying”的评论

看到最后的换行符笑哭了,哈哈哈哈………Redis协议规定必须以\r\n间隔一个段
啊... 麻烦提供一下协议链接呢? 我看看还有其他注意事项吗.. 谢谢

刚好OSC首页就有一篇啊
Redis数据的导出和导入(dump和load方式)

网上有些文章已经不再适用,本人也是踩了些坑,在此记录下。 迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式...

iplusx
2018/07/18
3.1K
0
美团在Redis上踩过的一些坑-2.bgrewriteaof问题

转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 一、背景 1. AOF: Redis的AOF机制有点类似于Mysql binlog,是Redis的提供的一种持久化方式(另一种是RDB),它会将所有的写命令按...

付磊-起扬
2015/11/05
0
0
Redis 常见的性能问题和解决方法

本文来自温柔一刀的分享,介绍了他在实际工作中遇到的一些Redis问题以及对应的规避和解决方案,如果你也在用Redis,那么可能其中有一些经验可供参考。 原文链接:http://zhupan.iteye.com/b...

阿酷
2012/07/04
964
0
redis的一些坑

from:http://my.oschina.NET/u/875730/blog/378086 0 Redis跨机房使用问题 一般地,redis的每个实例都是一个master加上一个slave,这一主一备一般要放在同一个机房idc,否则会出现各种莫名其...

oldgril
2017/03/02
0
0
redis安装部署

Redis是一种高级key-value数据库。它跟memcached类似,不过数据 可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(differen...

pesen
2014/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

爬虫可以采集哪些数据?爬虫借用什么代理可以提高效率

学习爬虫的门槛非常低,特别是通过Python学习爬虫,即使是网上也能找到许多学习爬虫的方法,而且爬虫在数据采集方面效果比较好,比如可以采集几万、上百万网页数据进行分析,带来极有价值的数...

xiaotaomi
32分钟前
4
0
redis自建笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
33分钟前
4
0
没想到Spring Boot居然这么耗内存,有点惊讶

Spring Boot总体来说,搭建还是比较容易的,特别是Spring Cloud全家桶,简称亲民微服务,但在发展趋势中,容器化技术已经成熟,面对巨耗内存的Spring Boot,小公司表示用不起。如今,很多刚诞...

程序员修BUG
37分钟前
5
0
Spring Security 实战干货:Spring Boot 中的 Spring Security 自动配置初探

1. 前言 我们在前几篇对 Spring Security 的用户信息管理机制,密码机制进行了探讨。我们发现 Spring Security Starter相关的 Servlet 自动配置都在spring-boot-autoconfigure-2.1.9.RELEASE...

码农小胖哥
38分钟前
4
0
Docker 容器时区时间不一致 问题解决

解决方案: 1,最傻瓜也最方便的处理方式,运行新的容器前设置本机时区和时间文件与容器的映射 docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime ...1 -v /etc/...

突突突酱
40分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部