前言

简单整理一下客户端案例分析。

正文

现象一:

服务端现象:Redis主节点内存陡增,几乎用满maxmemory,而从节点 内存并没有变化。

客户端现象:客户端产生了OOM异常,也就是Redis主节点使用的内存 已经超过了maxmemory的设置,无法写入新的数据.

2.分析原因

1)确实有大量写入,但是主从复制出现问题:查询了Redis复制的相关 信息,复制是正常的,主从数据基本一致。

2)其他原因造成主节点内存使用过大:排查是否由客户端缓冲区造成 主节点内存陡增,使用info clients命令查询相关信息如下:

很明显输出缓冲区不太正常,最大的客户端输出缓冲区队列已经超过了 20万个对象,于是需要通过client list命令找到omem不正常的连接,一般来 说大部分客户端的omem为0(因为处理速度会足够快),于是执行如下代 码,找到omem非零的客户端连接:

redis-cli client list | grep -v "omem=0"

已经很明显是因为有客户端在执行monitor命令造成的。

3.处理方法和后期处理

只要使用client kill命令杀掉这个连 接,让其他客户端恢复正常写数据即可。但是更为重要的是在日后如何及时 发现和避免这种问题的发生,基本有三点:

  1. 从运维层面禁止monitor命令,例如使用rename-command命令重置 monitor命令为一个随机字符串,除此之外,如果monitor没有做rename- command,也可以对monitor命令进行相应的监控

  2. 从开发层面进行培训,禁止在生产环境中使用monitor命令,因为有时 候monitor命令在测试的时候还是比较有用的,完全禁止也不太现实。

  3. 限制输出缓冲区的大小。

  4. 使用专业的Redis运维工具,上述问题在 Cachecloud中会收到相应的报警,快速发现和定位问题

现象二:

客户端周期性的超时

客户端现象:客户端出现大量超时,经过分析发现超时是周期性出现的.

服务端现象:服务端并没有明显的异常,只是有一些慢查询操作

原因:

·网络原因:服务端和客户端之间的网络出现周期性问题,经过观察网 络是正常的。

·Redis本身:经过观察Redis日志统计,并没有发现异常。

客户端:由于是周期性出现问题,就和慢查询日志的历史记录对应了 一下时间,发现只要慢查询出现,客户端就会产生大量连接超时,两个时间点基本一致.

最终找到问题是慢查询操作造成的,通过执行hlen发现有200万个元 素,这种操作必然会造成Redis阻塞,通过与应用方沟通了解到他们有个定 时任务,每5分钟执行一次hgetall操作。

hlen user_fan_hset_sort

以上问题之所以能够快速定位,得益于使用客户端监控工具把一些统计 数据收集上来,这样能更加直观地发现问题,如果Redis是黑盒运行,相信 很难快速找到这个问题。处理线上问题的速度非常重要。

处理方法和后期处理:

这个问题处理方法相对简单,只需要业务方及时处理自己的慢查询即 可,但是更为重要的是在日后如何及时发现和避免这种问题的发生,基本有三点:

  1. ·从运维层面,监控慢查询,一旦超过阀值,就发出报警。

  2. ·从开发层面,加强对于Redis的理解,避免不正确的使用方式。

  3. ·使用专业的Redis运维工具

总结

  1. RESP(Redis Serialization Protocol Redis)保证客户端与服务端的正 常通信,是各种编程语言开发客户端的基础。

  2. 客户端输入缓冲区不能配置,强制限制在1G之内,但是不会受到 maxmemory限制

  3. 客户端输出缓冲区支持普通客户端、发布订阅客户端、复制客户端 配置,同样会受到maxmemory限制。

  4. Redis的timeout配置可以自动关闭闲置客户端,tcp-keepalive参数可 以周期性检查关闭无效TCP连接

  5. monitor命令虽然好用,但是在大并发下存在输出缓冲区暴涨的可能性

  6. info clients帮助开发和运维人员找到客户端可能存在的问题。

  7. 理解Redis通信原理和建立完善的监控系统对快速定位解决客户端 常见问题非常有帮助

下一大节, 持久化相关知识。

redis 简单整理——客户端案例分析[十八]的更多相关文章

  1. netty源码分析(十八)Netty底层架构系统总结与应用实践

    一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O ...

  2. Redis入门到高可用(十八)—— 主从复制

    一.单机有什么问题 1.机器故障 2.容量瓶颈 3.QPS瓶颈 二.主从复制 1.数据副本(高可用.分布式基础) 2.拓展读性能(读写分离)  简单总结: 三.主从复制配置 四.主从复制配置-实验演示 ...

  3. 软件工程第4次作业------石墨文档Android客户端案例分析

    作业要求的博客链接:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 分析产品:石墨文档Android客户端 第一部分 调研和评测 1. ...

  4. Redis偶发连接失败案例分析

    [作者] 张延俊:携程技术保障中心资深DBA,对数据库架构和疑难问题分析排查有浓厚的兴趣. 寿向晨:携程技术保障中心高级DBA,主要负责携程Redis及DB的运维工作,在自动化运维,流程化及监控排障等 ...

  5. Linux SNAT/DNAT简单理解与案例分析。

      在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP数据包通过路由器或防 ...

  6. Week2 Bing词典Android客户端案例分析

    一.软件调研 运行平台:Android 4.4.4 必应版本:5.2.2 1.bug发现 1.1 bug标题:单词挑战无法加载和刷新 bug详细描述:学习界面中的单词挑战模块,点击后没有任何反映,并且 ...

  7. jQuery 源码分析(十八) ready事件详解

    ready事件是当DOM文档树加载完成后执行一个函数(不包含图片,css等),因此它的触发要早于load事件.用法: $(document).ready(fun) ;fun是一个函数,这样当DOM树加 ...

  8. Vue.js 源码分析(十八) 指令篇 v-for 指令详解

    我们可以用 v-for 指令基于一个数组or对象来渲染一个列表,有五种使用方法,如下: <!DOCTYPE html> <html lang="en"> & ...

  9. ABP源码分析十八:UI Inputs

    以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...

  10. 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】

    阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...

随机推荐

  1. 离线部署-docker

    离线部署---docker 关键词:docker离线部署,images离线安装,docker compose,shell,minio docker离线安装 docker install offline ...

  2. Python文件操作系统

    [一]文件操作基本流程 # 1. 打开文件,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f f=open('a.txt', ...

  3. 一文学会JDBC实现java和mySQL的数据连接(尚硅谷学习课程代码+笔记+思路总结)

    JDBC是指数据库连接技术,用于java连接mySQL等数据库.本文详细介绍了尚硅谷课程中JDBC的学习内容和补充知识. 概述 java语言只提供规范接口,存在于java.sql.javax.sql包 ...

  4. vue配置scss全局样式

    安装插件 npm install sass --save-dev 在src文件夹下创建styles文件夹,并创建以下文件 index.scss: scss的入口文件 // 引入清除默认样式 @impo ...

  5. nginx proxy_set_header详解

    proxy_set_header 是 Nginx 配置中的一个重要指令,特别是在使用 Nginx 作为反向代理时.该指令允许你修改由 Nginx 传递给代理后端的请求头.这对于确保后端应用程序能够接收 ...

  6. 【转】客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...

  7. 【UE虚幻引擎】手把手教学,UE新手打包全攻略!

    UE虚幻引擎是一款强大的3D实时开发工具,可用于游戏开发.建筑及汽车可视化.影视内容创作.广播及现场活动制作.培训及仿真模拟以及其他实时应用.在UE实际开发过程中,新手工程师可能会遇到总是打包失败的情 ...

  8. 记录--uni-app实现蓝牙打印小票

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 说明 基于uni-app开发,调用官方蓝牙相关api实现连接蓝牙与向蓝牙热敏打印机发送字节流,可打印文字,二维码,图片,调整字体大小等,本 ...

  9. Redis源码学习(1)──字符串

    redis 版本:5.0 本文代码在Redis源码中的位置:redis/src/sds.c.redis/src/sds.h 源码整体结构 src:核心实现代码,用 C 语言编写 tests:单元测试代 ...

  10. java 计算两个date日期相差天数或者时间差

    相差天数计算: /** * 相差天数计算 */ public int differentDaysByMillisecond(Date date1, Date date2) { return Math. ...