`
carlosfu
  • 浏览: 582546 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ba8b5055-9c58-3ab0-8a1c-e710f0495d2c
BigMemory实战与理...
浏览量:31248
53b2087e-c637-34d2-b61d-257846f73ade
RedisCluster开...
浏览量:151059
C9f66038-7478-3388-8086-d20c1f535495
缓存的使用与设计
浏览量:125265
社区版块
存档分类
最新评论

美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout

阅读更多

   转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154

  更多Redis的开发、运维、架构以及新动态,欢迎关注微信公众号:

 


    

    1. 背景:
      大部分互联网公司都会有Mysql或者Oracle的DBA,但是在Nosql方面一般不会设置专门的DBA。不过对于一些知名的互联网公司来说,Nosql的使用量是巨大的,所以通常让Mysql的DBA或者单独聘请工程师来维护一些Nosql数据库,比如:
      Redis, Hbase, Memcache(其实严格讲不是nosql), Mongodb, Cassandra。从讲座看美团网应该是有专职的Redis DBA。所以作为业务开发人员不需要自己安装、配置、运维Redis,只需要找Redis DBA来申请就可以了。
      这里为了简化说明:Redis DBA提供的服务叫做Redis云,业务开发人员叫做业务端(redis的使用者)
     
   2. 现象:
       业务端在使用redis云提供的redis服务后,经常出现connect timeout:
redis.clients.jedis.exceptions.JedisConnectionException
java.net.SocketException
java.net.SocketTimeoutException:connect time out
   
   3. 分析和怀疑:
   业务端一般认为redis出现问题,就是redis云有问题,人的“正常”思维:看别人错误容易,发现自己难,扯多了, 出现这个有很多原因:
   (1). 网络原因:比如是否存在跨机房、网络割接等等。
   (2). 慢查询,因为redis是单线程,如果有慢查询的话,会阻塞住之后的操作。 
   (3). value值过大?比如value几十兆,当然这种情况比较少,其实也可以看做是慢查询的一种
   (4). aof重写/rdb fork发生?瞬间会堵一下Redis服务器。
   (5). 其他..................
 
   4. 查询原因
   演讲者一开始怀疑是网络问题,但是并未发现问题,观察各种对比图表,tcp listenOverFlow和timeout经常周期出现。(赞一下这个监控,我们监控现在还没有这个层面的)
   有关listenOverFlow:
查看现有的连接数是否大于设置的backlog,如果大于就丢弃,并相应的参数值加1。其中backlog是由程序和系统参数net.core.somaxconn共同设置,当backlog的值大于系统设置的net.core.somaxconn时则取net.core.somaxconn的值,否则取程序设置的backlog值。这种出错的方式也被记录在TcpListenOverflows中(其只记录了连接个数不足而产生溢出错误的次数!)。
   觉得可能和TCP相关,于是分析了Tcp三次握手:最后一次握手客户端的请求会进入服务器端的一个队列(可以认为是下三图)中,如果这个队列满了,就会发生上面的异常。(accept)
  (1) TCP三次握手: 
  
  (2) redis客户端与redis服务器交互的过程(本质就是TCP请求)
  (3) I/O 多路复用程序通过队列向文件事件分派器传送套接字的过程
   
   (4) 和redis有什么关系呢?
        由于Redis的单线程模型(对命令的处理和连接的处理都是在一个线程中),如果存在慢查询的话,会出现上面的这种情况,造成新的accept的连接进不了队列。
   
    如果上面的图没法理解的话,看看这张图:
     
 
   5. 解决方法:
    (1) 对慢查询进行持久化,比如定时存放到mysql之类。(redis的慢查询只是一个list,超过list设置的最大值,会清除掉之前的数据,也就是看不到历史)
    (2) 对慢查询进行报警(频率、数量、时间)等等因素
    (3) 打屁股,哈哈:
    
     (4) 其实应该做的是:对业务端进行培训,告诉他们一下redis开发的坑,redis不是万金油,这个和Mysql DBA要培训Mysql使用者一样,否则防不胜防。
      比如他执行了 monitor, keys *, flushall, drop table, update table set a=1; 这种也是防不胜防的(当然也可以做限制,利用rename-command一个随机数),但是提高工程师的水平才是关键。
     
 
分享到:
评论
2 楼 yanan0628 2016-07-05  
1 楼 lxrm 2016-07-05  

相关推荐

    美团在Redis上踩过的一些坑-3.redis内存占用飙升

    3. **监控和报警**:通过工具如`redis-monitor.log`等监控Redis的运行状态,设置内存使用量的阈值报警。 4. **限流和降级策略**:在面临高并发请求时,实施限流和降级策略,保护Redis服务器。 5. **使用缓存穿透、...

    Redis-x64-3.2.100.zip

    - 使用客户端:通过`redis-cli.exe`与Redis服务器通信,执行数据操作。 4. **注意事项**: - Redis默认端口是6379,确保该端口未被其他应用占用。 - 为了安全,建议设置密码保护,并限制远程访问。 - 考虑到...

    Redis-x64-5.0.14.1.msi

    总结来说,Redis-x64-5.0.14.1.msi 是 Redis 在 Windows 平台上的安装包,提供了高效的数据存储和处理能力,适用于各种应用场景,如缓存、计数器、发布订阅等。正确安装并配置 Redis,可以极大地提升应用程序的响应...

    Redis稳定版 Redis-x64-5.0.14.1.zip

    在Redis-x64-5.0.14.1版本中,可能包括以下内容: - `redis-server`: Redis服务器进程,负责处理客户端请求。 - `redis-cli`: 官方提供的命令行客户端,用于与Redis服务器交互。 - `redis.conf`: 默认配置文件,...

    Redis-x64-5.0.14.1

    - 使用`redis-check-aof.exe`和`redis-check-rdb.exe`定期检查数据文件的完整性,确保数据安全。 5. **注意事项**: - Windows版本的Redis可能不如Linux稳定,因此生产环境中通常建议在Linux上部署Redis。 - ...

    redis 免安装 redis客户端 redis-desktop-manager-0.8.8.384

    1. 解压下载的 Redis 文件,找到 `redis-server.exe` 和配置文件 `redis.conf`。 2. 修改 `redis.conf`,根据需求配置 Redis 服务,例如端口、数据文件路径等。 3. 运行 `redis-server.exe redis.conf` 启动 Redis ...

    Redis-x64-5.0.14.msi和Redis-x64-5.0.14.zip

    2. **服务化**:为了使Redis在系统启动时自动运行,可以将`redis-server.exe`配置为Windows服务。这可以通过命令行工具`sc create`或使用`.msi`安装包实现。 3. **数据持久化**:Redis支持多种持久化方式,包括RDB...

    redis-6.2.6-x64-windows.zip

    5. **命令行客户端**:压缩包可能还包括`redis-cli.exe`,这是一个命令行接口工具,允许用户与Redis服务器交互,执行各种命令,如GET、SET、DEL等。 6. **持久化机制**:Redis支持两种持久化方式,RDB(快照)和AOF...

    Redis-x64-3.0.504.zip

    Redis 是一个高性能的键值对...综上所述,Redis-x64-3.0.504.zip 提供了一个完整的 Redis for Windows 安装包,包括一键启动和关闭脚本,方便用户快速部署和管理 Redis 服务。无论是开发还是生产环境,都能从中受益。

    redis-desktop-manager-0.9.3.817客户端

    Redis Desktop Manager 0.9.3.817 客户端是一款强大的图形化界面工具,专门用于管理和操作 Redis 数据库。...安装提供的 `redis-desktop-manager-0.9.3.817.exe` 文件,即可开始体验这个强大的桌面客户端。

    redis-3.2.2.gem redis-3.2.2.gem redis-3.2.2.gem

    安装完成后,你可以使用Redis的命令行客户端redis-cli进行连接和操作,或者通过Ruby的Redis库在代码中与Redis交互。记得在使用前配置好Redis服务器的相关参数,如端口、密码等。 总之,Redis 3.2.2是一个强大的键值...

    Redis安装包 Redis-x64-3.2.100.zip

    综上所述,Redis-x64-3.2.100.zip文件包含了一个适用于Windows的Redis安装包,提供了丰富的数据结构、高可用性和高性能的特性,适用于各种应用场景。通过安装和配置,用户可以将Redis集成到自己的系统中,以提升数据...

    Redis-x64-5.0.14.1 缓存程序

    在Windows系统中,Redis-x64-5.0.14.1是Redis的一个版本,专为64位操作系统设计。这个压缩包文件包含了在Windows环境下运行Redis所需的所有组件。 首先,我们来深入了解Redis的核心特性: 1. **键值存储**:Redis...

    redis集群离线安装包。redis-3.2.1.gem,rubygems-2.4.2.zip

    本安装包包含两个关键文件:`redis-3.2.1.gem` 和 `rubygems-2.4.2.zip`,它们都是为了在离线环境下搭建Redis集群而准备的。 首先,`redis-3.2.1.gem` 是Redis的Ruby gem包,适用于使用Ruby语言进行部署和管理Redis...

    Redis及其管理工具:Redis-x64-5.0.14.1、RESP-app

    6. `redis-cli.exe`是Redis命令行客户端,通过它我们可以直接与Redis服务器交互,执行读写操作以及执行各种管理命令。 7. `redis-benchmark.exe`是性能测试工具,用于测量Redis服务器在特定压力下的性能,例如吞吐...

    redis-7.2-x64-for-windows-bin.zip

    这个压缩包"redis-7.2-x64-for-windows-bin.zip"是Redis 7.2版本的64位Windows构建,包含了运行Redis服务所需的所有组件。 1. **Redis 7.2**: Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和...

    redis-desktop-manager-0.8.8.384 Redis 客户端安装包

    至于安装和使用方面,用户可以通过下载相应的安装文件(如“redis-desktop-manager-0.8.8.384.exe”),然后按照安装向导进行操作。在软件安装完成后,用户可以新建一个连接,输入Redis服务器的相关信息(如IP地址、...

    Redis-x64-3.0.504 MSI ZIP

    - `Redis-x64-3.0.504.msi`:这是Windows Installer (MSI) 文件,用于在Windows系统上安装Redis服务器。 - `Redis-x64-3.0.504 msi zip.txt`:可能是安装指南或者版本说明文本文件,包含了安装和配置的详细步骤。 - ...

Global site tag (gtag.js) - Google Analytics