记一次redis key丢失的问题排查
最近测试环境的redis经常性发生某些key丢失的问题,最终的找到的问题让人大吃一惊。
复盘一下步骤:
1、发现问题
不知道从某天开始,后台经常报错,原因是某些key丢失,一开始不在意,以为是小bug,后来越来越频繁。
2、检查代码
看看是不是有误删除的情况,这些key的访问范围很小,压根没有删除的逻辑,也没有设置过期时间,通过ttl命令检查也是如此。
3、实在没辙,开启monitor监控
本以为终极大招肯定能发现问题,陆续抓取了几个出问题时段的全部redis指令序列,没有发现任何可疑的指令,内心奔溃。
4、检查redis.log
终于发现了这样一段
29014:M 25 Apr 00:10:47.906 - DB 0: 4121 keys (4061 volatile) in 8192 slots HT.
29014:M 25 Apr 00:10:47.906 - 100 clients connected (0 slaves), 4476640 bytes in use
29014:M 25 Apr 00:10:48.038 - Accepted xx.xx.xx.xx:57998
29014:M 25 Apr 00:10:48.119 # Failed opening the RDB file backup.db (in server root dir /etc/cron.d) for saving: Permission denied
29014:M 25 Apr 00:10:48.279 # Failed opening the RDB file root (in server root dir /etc/cron.d) for saving: Permission denied
29014:M 25 Apr 00:10:48.358 # Failed opening the RDB file root (in server root dir /etc/cron.d) for saving: Permission denied
29014:M 25 Apr 00:10:48.385 - Client closed connection
29014:M 25 Apr 00:10:48.397 - Accepted xx.xx.xx.xx:52018
29014:M 25 Apr 00:10:52.915 - DB 0: 2 keys (0 volatile) in 4 slots HT.
在00:10:48.119 这个时刻,尝试从/etc/cron.d下面的backup.db恢复数据,然后出错,然后就数据库被清空。
整个过程速度非常快,客户端都没有感觉。
我们内部没有人会在这个时刻去执行这个操作,redis的配置文件里面也不会有类似的配置。
网上搜索了一下,类似的情况说明,这是有人在尝试通过redis来攻击你的服务器。
由于机房设备不足,临时在腾讯云服上搭建了测试环境,没有做过多的安全性设置,redis也没有设置密码。
接下来做了两个设置:
1、redis设置了一个较为复杂的密码;
2、禁用了config指令
接下来几天,不再有类似问题。
折腾了几天,一开始完全没往安全这个方向去考虑,充分说明专业的事情还得专业的人来干,我这个运维临时工是不行的。
记一次redis key丢失的问题排查的更多相关文章
- 如何利用redis key过期事件实现过期提醒
https://blog.csdn.net/zhu_tianwei/article/details/80169900 redis自2.8.0之后版本提供Keyspace Notifications功能 ...
- 关于redis key命名规范的设计
一.实现目标 简洁,高效,可维护 二.键值设计规约 1 . Redis key命名风格 [推荐]Redis key命名需具有可读性以及可管理性,不该使用含义不清的key以及特别长的key名: [强制] ...
- Redis Key 命令
Redis Key 命令 del key1 key2 - keyn 删除键为key1,key2-keyn,空格分隔. persist key 移除给定 key 的生存时间,将这个 key ...
- springboot redis key乱码
原写法: @Autowired private RedisTemplate redisTemplate; 写入redis后,查看key值 127.0.0.1:6379> keys * 1) &q ...
- redis key的过期时间
设置redis key的生存过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) : EXPlRE 命令用于将键key 的生存时间设置为tt ...
- Spring boot实现监听Redis key失效事件实现和其它方式
需求: 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 用户绑定隐私号码当订单结束取消绑定等 解决方案1: 可以利用redis自带的key自动过期机制,下单时将订单id写入redis,过 ...
- SpringBoot实现监听redis key失效事件
需求: 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 解决方案1: 可以利用redis天然的key自动过期机制,下单时将订单id写入redis,过期时间30分钟,30分钟后检查订单状态 ...
- Redis Key操作
[Redis Key操作] 1.GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value). 当 key 存在但不是字符串类型时,返回一个错 ...
- 17 redis -key设计原则
书签系统 create table book ( bookid int, title char(20) )engine myisam charset utf8; insert into book va ...
随机推荐
- vue mixins的使用
官网传送 刚开始接触vue的时候,官网关于mixins的例子看了好几遍,发现还是不会用,包括vuex也是后来慢慢理解一点的,不过和vuex比起来.mixns还是很好理解,简单很多了 就我目前理解mix ...
- Struts2中的拦截器详解
exception:异常拦截器,拦截异常aliasservletConfig18nprepare:预备拦截器,这个拦截器就是为了ModelDriven准备对象的,若Action类实现了preparab ...
- MongoDB 使用 ObjectId 代替时间
An ObjectId is a 12-byte unique identifier consisting of: a 4-byte value representing the seconds si ...
- Golang开发支持平滑升级(优雅重启)的HTTP服务
Golang开发支持平滑升级(优雅重启)的HTTP服务 - tabalt的博客 http://tabalt.net/blog/graceful-http-server-for-golang/ http ...
- js foreach
array1.forEach(callbackfn[, thisArg]) 参数 定义 array1 必需. 一个数组对象. callbackfn 必需. 一个接受最多三个参数的函数. 对于数组中的每 ...
- Linux下安装谷歌访问助手,解压缩时出现中文乱码
1.sudo apt-get install unar 安装unar 2.unar 谷歌访问助手chrome版本.zip 注意:使用 lsar 命令可以查看压缩文件内有那些文件: 例:lsar 谷 ...
- MapReduce的核心编程思想
1.MapReduce的核心编程思想 2.yarn集群工作机制 3.maptask并行度与决定机制 4.maptask工作机制 5.MapReduce整体流程 6.shuffle机制 7.yarn架构
- Python的15个坑
1. 不要使用可变对象作为函数默认值 代码如下: In [1]: def append_to_list(value, def_list=[]): ...: def_list.ap ...
- C++继承模型
在C++继承模型中,一个派生类对象表现出来的东西,是其自己的成员加上其基类成员的总和.但这些成员怎样摆放,标准并未强制规定.一般而言,低地址放基类子对象,高地址放派生类对象. 以下从四个部分讨论C++ ...
- python学习笔记(二十)初识面向对象
面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为.对象作为程序的基本单位,将程序和数据封装其中, ...