【redis】客户端案例分析

1.redis内存陡增

(1)现象
服务端现象:redis主节点内存陡增,几乎用满maxmemory,而从节点内存并没有变化
(正常情况下,主从节点内存基本相同)
客户端现象:客户端产生了OMM异常,也就是redis主节点使用的内存已经超过了
maxmemory的设置,无法写入新的数据。
redis.clients.jedis.exception.JedisDataException:OOM command not allowed 
when used memory >'maxmemory'

(2)原因分析 
1)确实有大量的写入,但是主从复制出现问题:查询redis复制相关信息,
复制是正常的,主从数据基本一致。
dbsize 
2)其他原因造成主节点内存使用过大:排查是否由客户端缓冲区造成主节点内存
陡增,使用info clients命令。

192.168.1.7:6379> info clients
# Clients
connected_clients:1819
client_longest_output_list:225698
client_biggest_input_buf:0
blocked_clients:0

很明显输出缓冲区不太正常,最大的客户端输出缓冲区队列已经超过了
20万个对象,于是需要通过client list命令找到omem不正常的连接,
一般大部分omem为0;
id=9 addr=192.168.1.7:35728 fd=7 name= age=127 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=2129300608 events=rw cmd=monitor

omem=2129300608 events=rw cmd=monitor
很明显这里是在执行monitor;

(3)处理方法 
使用client kill 命令杀掉这个连接,即可恢复正常。
避免问题:
从运维层面禁止monitor命令,例如使用rename-command命令重置
monitor命令为一个随机字符串。或者监控client list,观察是否有monitor; 
从开发层面进行培训,禁止在生产环境中使用monitor命令,因为有时候 
monitor命令在测试的时候还是比较有有用的,完全禁止不太现实。
限制输出缓冲区的大小。
使用专业的redis运维工具。CacheCloud.

2.客户端周期性超时 

(1)现象 
客户端现象:客户端出现大量超时,经过分析发现超时是周期性出现的。
Caused by:redis.clients.jedis.exception.JedisConnectionException:
java.ennt.SocketTimeoutException:connet timed out; 

服务端现象: 
服务端并没有明显的异常,只是有一些慢查询操作。
(2)分析 
网络原因:服务端和客户端之间的网络出现周期性问题,经过观察网络是正常的。
redis本身:经过观察redis日志统计,并没有发现异常。
客户端:由于是周期性出现问题,就和慢查询日志的历史记录对应了一下时间,发现
只要慢查询出现,客户端就会产生大量连接超时,两个时间点基本一致。

最终找到问题是慢查询造成的,通过执行hlen 发现有200W个元素,这种操作必然会
造成redis阻塞,通过与应用方沟通了解到他们有个定时任务,每5分钟执行一次
hgetall操作。
(3)处理方法
业务方处理慢出现。避免问题需要注意:
从运维层面,监控慢查询,一旦超过了阀值,就发出报警。
从开发层面,加强对于redis的理解,避免不正确的使用方式。
使用专业的redis运维工具。 

3.重点回顾 

resp(redis serialization protocol)保证客户端和服务端正常的通信是各种
变成语言开发客户端的基础。
要选择社区活跃客户端,在实际项目中使用稳定版本的客户端。
区分jedis直连和连接池的区别,在生产环境中,应该使用连接池。
Jedis.close()在直连下是关闭连接,在连接池则是归还连接。
Jedis客户端没有内置序列化,需要自己选用。
客户端输入缓冲区不能配置,强制限制在1g之内,但是不会收到Maxmemory
限制。
客户端输出缓冲区支持普通客户端,发布订阅客户端,复制客户端,但是不会 
收到Maxmemory的限制。
redis的timeout配置可以自动关闭闲置客户端,tcp-keepalive参数可以周期性
检查关闭无效TCP连接
monitor命令虽然好用,但是在大并发下存在输出缓冲区暴涨的可能性。
info clients 帮助开发和运维人员找到客户端可能存在的问题。
理解redis通信原理和建立完善的监控系统对快速定位解决客户端
常见问题非常有帮助。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值