redis-dump引起的服务超时

  一个服务,逻辑很简单,从redis读取数据返回给调用方;每次调用处理正常时间在0~20左右,没有超过150的.然而最近频频报超时,查了下发现超时的请求响应时间竟然有1000多ms,百思不得其解。大腿指出,可能是dump导致的超时。果然不读取dump的主redis后立马好了,超时由400减少到9,到底是怎么回事呢?哈哈,我百度了一下

一 redis-dump

redis-dump是一个借助第三方的工具,用来实现redis的备份和还原,即实现redis的持久化。redis持久化有两种方式:RDB和AOF

其中,RDB方式按照一定的时间间隔对数据集创建基于时间点的快照。是Redis数据集的基于时间点的紧凑的副本,非常适合于备份场景。比如每个小时对RDB文件做一次小的归档,每天对RDB文件做一次大的归档,每月对RDB文件做一次更大的归档。这样可以在必要的时刻选择不同的备份版本进行数据恢复。由于是一个紧凑的文件,易于传输到远程数据中心或Amazon S3,因此RDB非常适合于灾难回复。

二 服务超时日志分析

该服务使用用rdb模式进行redis的持久化,每900ms进行一次备份,通过日志信息发现,超时通常发生在bgsave时。bgsave命令会fork一个子进程,子进程会将redis数据库信息dump到rdb文件中。服务中使用的主redis每隔一段时间进行一次离线数据备份,由于现在的redis中数据量较大,在此期间程序中通过主redis的节点进行查询的速度会受到影响。

三 超时原因,redis读取超时还可能有以下原因

1. 网络。Redis的处理与网络息息相关,如果网络出现闪断则容易发生redis超时的状况。如果出现这种状况首先应查看redis机器网络带宽信息,判断是否有闪断情况发生。

2. 内存。redis所有的数据都放在内存里,当物理内存不够时,linux os会使用swap内存,导致内存交换发生,这时如果有redis调用命令就会产生redis超时。这里可以通过调整/proc/sys/vm/swappiness参数,来设置物理内存使用超过多少就会进行swap。

3. 3. Redis单进程处理命令。Redis支持udp和tcp两种连接,redis客户端向redis服务器发送包含redis命令的信息,redis服务器收到信息后解析命令后执行相应的操作,redis处理命令是串行的,一些慢命令例如sort,hgetall,union,mget都会使得单命令处理时间较长,容易引起后续命令time out.所以我们第一需要从业务上尽量避免使用慢命令,如将hash格式改为kv自行解析,第二增加redis实例个数,每个redis服务器调用尽量少的慢命令。

具体这块内容我了解的不是很清楚,后续完善吧,mark。

posted @ 2015-09-14 13:39  KK_Yolanda  阅读(3325)  评论(0编辑  收藏  举报