Redis cluster Hget hash field value异常分析案例--一个空格带来的惨案
一个空格带来的惨案
- 案例背景
- 问题分析
- 问题原因
- 解决办法
案例背景
研发同事反馈线上某redis cluster 某个hashmap异常, 应用日志中已经明确对于这个hashmap 特定的field1 hset成功了,但是其他的业务模块在hget 对应的field时,读不到对应数据。
问题分析
根据业务提供的field到DB里面查询相应信息,查询redis
$redis-cli -p port -a -c
127.0.0.1:4410> hget hashmapa f1087507-c90f-4b08-b028-b3f14efc49f3/01
-> Redirected to slot [5265] located at IP:port
(nil)
注: HGET KEY_NAME FIELD_NAME 返回给定字段的值。如果给定的字段或 key 不存在时,返回 nil 。
这里需要注意,因为是redis cluster所以连接的使用切记加上-c进入cluster 模式
redis说你这根本就不存在这个field,但研发言之凿凿这个field一定是设置成功了的,redis说这个锅我可不背,这种时候最好的办法就是把证据(一口大黑锅)甩他脸上。
思索片刻之后,我们环境中cluster的从节点都是开启了aof持久化,那有无可能通过分析aof,来分析历史执行命令,从而定位问题?当然有可能。前提是需要考虑aof是否已经重写了,如果没有重写可以直接分析aof文件。
AOF的重写机制,分为手工触发和自动触发。
手动触发:调用bgrewriteaof命令。
自动触发:aof_current_size > auto-aof-rewrite-min-size && (aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite_percentage(默认100%)
幸运的是 ,问题现象能够复现,那就没必要去分析不确定的历史aof,现在的问题就是如何在业务触发的时候,记录下这段时间redis的操作日志。
方法一: 可以使用redis本身的monitor 命令,但这一个繁忙的系统中,会对系统有一定的性能损耗(当然也可以选择在从节点执行 )。
方法二: 使用linux命令对aof文件进行tail -200f db.aof >res.log,也可以将这段时间内的命令记录下来。
此处我们采用方法二。接下来的任务问题就是cluster里面有非常多的分片,那我们要需要提前确定这个key目前在哪个分片上。
127.0.0.1:PORT> CLUSTER KEYSLOT userTokenMap
(integer) 5265
127.0.0.1:PORT> CLUSTER SLOTS
4) 1) (integer) 27312) (integer) 54603) 1) "IP1"2) (integer) PORT13) "e6e62c68eed8a9869b6e31aed5bac3291270688f"4) 1) "IP2"2) (integer) PORT23) "bedc109fa35821d379567649e2f3a2ded3771b73"
通过cluster命令我们定位到了key所在分片。
在业务开始触发时开启收集日志,在复现结束后停止,并分析。下面是tail aof文件的结果(二进制)
这里可以看到值是存在的
IP:PORT> HGET userTokenMap "f1087507-c90f-4b08-b028-b3f14efc49f3 /01"
"50017d18bf4a427e0111c1e7386c37f557ef39d3644d393d598c4fe8b986c1b30aa26f1b5f24e7394cb2ef99a0d5549d6980"
分析日志发现,结果很明显 ,程序在使用这个field(f1087507-c90f-4b08-b028-b3f14efc49f3 /01)的时候会截取**/**部分, 默认的规则field都是无空格的,但是这个field 由于程序存取环节异常导致多了空格,从而引起应用其他模块使用该key的部分field异常,至此真相大白。
问题原因
hset的时候拼接部分多了多了个空格
解决办法
程序后续版本对field前半部分进行trim取消无效空格之后再拼接。
Redis cluster Hget hash field value异常分析案例--一个空格带来的惨案相关推荐
- Redis集群Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式
在搭建Redis5.x版本的集群环境出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况 在Linux同一台服务器下搭建伪集群-- 127 ...
- Redis Cluster 源码分析
作者介绍 姓名:李航 工作经历: 5 年多互联网工作经验,先后在 58 同城,汽车之家,优酷土豆集团工作.目前主要在优酷土豆集团任职高级开发工程师,目前主要负责大数据基础平台 Redis 集群开 ...
- 高性能分布式缓存redis(持久化原理 安全策略 过期删除内存淘汰策略 性能压测 高可用 Redis Cluster)
redis redis(持久化原理 安全策略 过期删除&内存淘汰策略 性能压测 高可用 Redis Cluster) 1. 持久化原理 1.1 持久化流程(落盘) 1.2 RDB详解 1.2. ...
- Redis Cluster 实战 - 图解 - 秒懂 - 史上最全
文章很长,而且持续更新,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 免费赠送 经典图书 : 极致经典 + 社群大片好评 < Java 高 ...
- Python操作Redis中的hash
Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). Python的re ...
- [Java工程师面试精选]Redis cluster集群模式的原理
redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放一部分数据 提供内 ...
- redis集群之REDIS CLUSTER
redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00 NoSQL_博客园 原文 http://www.cnblogs.com/zhanchenjin/p/537 ...
- redis cluster集群选主
redis 选主过程分析 当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master.由于挂掉的master可能会有多个slave.Failover的 ...
- Redis Cluster 原理你了解不?
1. redis cluster 介绍 1.1 自动将数据进行分片,每个master上放一部分数据 1.2 提供内置的高可用支持,部分master不可用时,这是可以继续工作的 在redis clust ...
- Redis cluster集群模式的原理
redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放一部分数据 提供内 ...
最新文章
- 扩散模型就是自动编码器!DeepMind研究学者提出新观点并论证
- C语言从来都没有过时,你大爷终究是你大爷
- 从源码安装mysql_从源代码安装mysql
- 智能指针变量做函数参数的一个值得注意的地方
- Terracotta - 分布式共享对象
- 【Mybatis】mapper文件的解析
- VMware利用unlocker开启MacOS支持
- 怎么从零基础学计算机打字,新手学电脑打字 0基础打字快速上手教程
- 西门子dcs系统组态手册下载_PLC/DCS/HMI 知识普及
- 医学影像常用Python包
- 群晖域名注册_小白瞎折腾 篇九:玩转群晖NAS:域名注册技巧,及SSL证书获取...
- 2.2.7 虚拟Ethernet以太网卡
- 余世雄 - 与上司沟通的7个技巧
- 如何修改文件最后一次修改时间?
- 前后端离线开发相关软件下载地址大全
- kubectl源码分析之cordon and uncordon
- python pandas读取csv文件指定行_python pandas获取csv指定行 列的操作方法
- cayina计算机主板怎么改路线,七彩虹计算机主板biOs设置(图文).doc
- haxm intel庐_如何开启Intel HAXM功能
- 通过巧妙设置确保局域网安全
热门文章
- 【评价模型】层次分析法(AHP) 个人总结 续更
- 一级计算机考试如何移动文件夹,2010年职称计算机考试:文件或文件夹的移动...
- 国内外实行HACCP情况(转载)
- 微信小程序获取Appsecret报错40125“invalid appsecret”
- 《居里夫人自传》的读后感作文1700字
- Photoshop水平线快捷键怎么使用的?
- ps: 如何调出辅助线
- 【前端面试之缓存】js本地缓存、浏览器缓存、服务器缓存
- php+redis+保存多个值,php向redis list一次性lPush多个值
- 关于C语言常量需要注意的点