上上周和同事参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑。
我们在运维我们的redis私有云时,也遇到了一些类似的坑:
分为5个部分:
一、周期性出现connect timeout:
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; 这种也是防不胜防的(当然也可以做限制),但是提高工程师的水平才是关键。
转自:http://itindex.net/detail/54632-redis
相关推荐
在使用Redis的过程中,他们遇到了一些问题,特别是关于Redis内存占用飙升的问题。下面我们将深入探讨这个问题以及可能的解决方案。 Redis内存占用飙升的原因多种多样,可能是由于以下几点: 1. **数据结构不当**:...
NULL 博文链接:https://carlosfu.iteye.com/blog/2254154
关于Redis集群的实践,美团遇到的几个主要问题包括master和slave节点部署在同一台机器上、单机多实例部署、以及使用redis-trib.rb工具创建集群和添加slave节点时的问题。在创建集群过程中,需要考虑网络、节点配置和...
在Windows操作系统上运行Redis,通常需要借助一些额外的工具。标题提到的"redis在win上的运行脚本redis.bat"就是一个帮助用户在Windows环境下启动Redis服务的批处理文件。下面将详细介绍Redis在Windows上的安装、...
最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或者是我不会用。没有办法,最好找到了...
在Windows上安装Redis的过程涉及到多个步骤,包括启用必要的Windows功能、安装WSL2(Windows Subsystem for Linux 2)、设置默认WSL版本以及在Linux环境中安装Redis。以下是对这些步骤的详细说明: 1. **启用...
`Palette`文件夹中的内容可能包含了工具包的VI控件和函数,方便开发者在LabVIEW的画板上直接拖放使用。 ### 使用方法 在LabVIEW中,调用Redis主要涉及以下几个步骤: 1. **连接Redis服务器**:首先,需要创建一个...
Redis在Windows上的安装和使用相对于Linux来说稍微有些麻烦,但是有一些第三方工具可以帮助我们在Windows上使用Redis。其中最常用的是redis-windows,它是一个Windows下的Redis管理工具,可以方便地安装、配置和管理...
Redis是世界上最受欢迎的开源键值存储系统之一,它在Linux操作系统上原生运行,但为了满足Windows用户的需求,也提供了Windows版本。标题“windows版Redis1”表明我们讨论的是一个适用于Windows操作系统的Redis...
在 Windows 环境下,通常需要通过安装过程来设置 Redis 服务,但这里提供的资源是“redis 免安装”,意味着我们可以跳过常规的安装步骤,直接使用。 首先,让我们详细了解 Redis 的核心概念和特性: 1. **键值存储...
这个"redis mac 7.2.3 arm 包"已经过编译,可以直接在M1 Mac上运行,无需Rosetta 2转译。 4. **安装步骤**: - 下载并解压`redis-7.2.3`压缩包。 - 使用终端进入解压后的目录。 - 执行`make`命令编译源代码,这...
在Windows上安装Redis 7.0.0,你需要下载对应的zip压缩包“redis-windows-redis7.0.0”。解压后,你会看到包含`redis-server.exe`、`redis-cli.exe`等可执行文件,这是Redis服务端和客户端工具。为了启动Redis服务器...
在Windows环境下运行Redis,通常需要安装一个兼容的二进制版本,这个压缩包可能包含了所有必要的文件,如服务配置、启动脚本、二进制可执行文件等,使得用户能在Windows操作系统上顺利搭建和使用Redis服务器。...
在Windows环境下使用Redis时,需要注意一些特定的问题: 1. **性能优化**:由于Windows与Linux的系统差异,Windows上的Redis可能无法达到同样的性能水平。确保系统资源充足,如关闭不必要的后台程序,优化磁盘I/O...
- `redis.windows-service.conf` 和 `redis.windows.conf`是Redis在Windows上的配置文件。前者用于将Redis作为服务运行,后者则是标准的配置文件。 - `redis-start.bat`是一个批处理文件,用于启动Redis服务器。...
本文将详细介绍如何在Linux上安装Redis 5.0.1版本,包括下载、解压、编译和配置等步骤。 1. **下载Redis源码包**: 首先,我们需要获取Redis的源代码。你可以通过访问Redis官方网站或者使用`wget`命令从互联网下载...
1. **内存存储**:Redis的所有数据都存储在服务器的内存中,这使得它在读写速度上远超传统的磁盘存储数据库。然而,这也意味着Redis不适合存储非常庞大的数据集,因为它会消耗大量内存资源。 2. **数据结构丰富**:...
docker上的redis离线镜像redis.tar, 用于在docker上离线安装redis