资讯专栏INFORMATION COLUMN

redis过期key未删除故障处理

IT那活儿 / 3170人阅读
redis过期key未删除故障处理
redis简介


Redis(RemoteDictionary Server ),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。


redis是一个key-value存储系统,支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。


业务场景


redis


组件版本

redis:5.0.3


节点架构:

3主3从、6主机


1. 问题描述


某业务系统采用rediscluster架构,一批业务数据采用string类型设置过期时间key,业务部分过期key未删除,在redis集群里查找该key存在产生数据错误的故障。


2. 结构及详细说明


Redis集群大致架构图:

一组RedisCluster是由多个Redis实例组成,官方推荐使用6实例,其中3个为主节点,3个为从结点。一旦有主节点发生故障的时候,RedisCluster可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高可用性。


对于客户端来说,如何知道对应key是要路由到哪一个节点的那?这里RedisCluster把所有的数据划分为16384个不同的槽位,可以根据机器的性能把不同的槽位分配给不同的Redis实例,对于Redis实例来说,他们只会存储部门的Redis数据,当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。



3. 问题定位


通过对提供的部分key在集群里查看状态为未删除,然后查看了业务设置过期时间的代码看无问题,如下:


通过对redis集群状态检查、槽数量、epoch等检查,redis集群状态正常,如下:


软件层检查后,再对主机linux层检查内存出现异常主要在swap层,趋势图如下:

swap快速增长

可判断由于业务数据量增长导致内存、swap增长,由于部分数据进入swap后导致部分key过期后未删除


4. 解决过程


从问题定位来看,解决方法有几种:

  1. 扩容内存使数据不占用swap并重启redis集群。


  2. 判断数据的重要性,可关闭redis本身的持久化,避免持久化过程中占用内存,进而占用swap。


  3. 扩容节点及增加主机、增加主节点来分散数据使单个节点内存占用量减少。


均衡当时的资源情况及数据重要性,决定采取第一种方法扩容内存6台主机从48G扩容到64G。


通过扩容内存后结合业务进行几天的观察后swap得到有效得控制,swap趋势图如下:


后续业务未发生过期key未删除的情况


   总   结
   


1、redis如果占用了swap,可能会导致各种问题(如之前过期key未删除等),建议在搭建环境时尽量统计业务数据量根据数据量来设置内存大小、并安装linux系统时关闭swap。


2、由于该redis开了持久化,在持久化过程中会占用当前主机内存,所以建议在开启持久化的时候建议主机内存的大小是redismaxmemory大小的的2倍以上。


3、redis集群一般建议多主机多节点,单节点内存不超过maxmemory20G。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130186.html

相关文章

  • redis/codis

    摘要:长度小于等于字节的字符数组。强制大于变量目前版本中,的值为当字典的填充率低于时,程序就可以对这个字典进行收缩操作过程大小为的两倍,记录的索引位置。当某元素长度超过时要整体升级编码方式。当键值超过了常量的值,此键值对用多条命令来存储。 redis内存k-v,支持多种数据结构,第一个重点在于如何操作更快和适当的节省内存,第二个重点在于分布式管理。本文redis基于3.0。第一部分将介绍所有...

    frolc 评论0 收藏0
  • Redis学习

    摘要:单线程执行命令。文件描述符事件。内部原因不合理使用或数据结构可能由此导致慢查询等饱和是单线程,只会使用单个持久化阻塞操作产生阻塞,对硬盘的操作产生阻塞或写操作阻塞等。内存达到时执行内存溢出控制策略。 最近在看《Redis开发与运维》,把自己学会的知识点记录下来,毕竟好记性不如烂笔头。 一.Redis是什么。 Redis是一个Key-Value的NoSQL数据库. 二.Redis的特点。...

    miguel.jiang 评论0 收藏0
  • Redis学习

    摘要:单线程执行命令。文件描述符事件。内部原因不合理使用或数据结构可能由此导致慢查询等饱和是单线程,只会使用单个持久化阻塞操作产生阻塞,对硬盘的操作产生阻塞或写操作阻塞等。内存达到时执行内存溢出控制策略。 最近在看《Redis开发与运维》,把自己学会的知识点记录下来,毕竟好记性不如烂笔头。 一.Redis是什么。 Redis是一个Key-Value的NoSQL数据库. 二.Redis的特点。...

    big_cat 评论0 收藏0
  • Redis 实现分布式锁(Redlock 算法)

    摘要:而且这些节点全都是相互独立的,都是节点,且不使用分布式协调方案。例如锁过期时间为,那么请求超时时间应该设置在大约之间。但这样会完全牺牲性能,使其和传统的系统的分布式锁方案没有区别但事情往往不像第一眼看上去这么糟 先介绍两个概念 Safety Properties, 在程序运行中不会进入非预期的状态(如非法调用参数, 数组下标越界等运行错误)Liveness Properties, 在...

    894974231 评论0 收藏0
  • 【NoSQL】redis基本介绍

    摘要:在此基础上,支持各种不同方式的排序支持主从同步。假如自启动至今还没有进行过重写,那么启动时文件的大小会被作为基准值。这个基准值会和当前的大小进行比较。虽然重写也需要进行,但无论重写的执行间隔有多长,数据的耐久性都不会有任何损失。 redis简介 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list...

    paulli3 评论0 收藏0
  • Redis

    摘要:哈希表数组哈希表大小哈希表大小掩码,用于计算索引值该哈希表已有节点的数量键值的字典中包含两个哈希表,这是为了方便进行操作。采用渐进式会导致字典中的数据分散在两个中,因此对字典的操作也会在两个哈希表上进行。取消命令对所有的监视。 数据结构与对象 数据类型 可以存储的值 操作 String 字符串、整数或浮点型 对整个字符串或者字符串的对整数和浮点数执行自增或自减操作 Lis...

    GitCafe 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<