Redis 突然间不能访问,返回如下错误:

1 redis.client.jedis.exception.JedisDataException:MISCONF Redis is   configured to save RDB snapshots,
2 but is currently not able to persist on disk.Commands that may   modify the data set are disabled.
3 Please check Redis logs for details about the error

解决方法:查看 redis 日志,发现如下错误:Cant save in background:fork:Cannot allocate memory Redis在保存内存的数据到磁盘时,为了防止主线程假死,会Fork 一个子进程来完成这个保存操作,这个Fork 的子进程需要分配与主进程相同的内存,这时候就相当于需要的内存翻倍了。如果这时候可用内存不足以分配需要的内存,将会导致Fork 子进程失败而无法将数据持久化到磁盘。修改Linux内核参数 vm.overcommit_memeory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何) 问题便可解决。



Too Many Cluster Redirections

这个错误信息一般在 cluster 环境中出现,主要原因还是单机出现了命令堆积。
Redis 是单线程处理请求的,如果一条命令执行的特别慢(可能是网络阻塞,可能是获取数据量大),那么新到来的请求就会放在 TCP 队列中等待执行。但是等待执行的命令数如果超过了设置的队列大小,后面的请求就会被丢弃。

出现上面这个错误的原因是:

  • 集群环境中 client 先通过key 计算 slot,然后查询 slot 对应到哪个服务器,假设这个 slot 对应到 server1,那么就去请求 server1。
  • 此时如果 server1 整由于执行慢命令而被阻塞且 TCP 队列也已满,那么新来的请求就会直接被拒绝。
  • client 以为是 server1不可用,随即请求另一个服务器 server2。server2 检查到该 slot 由 server1 负责且 server1 心跳检查正常,所以告诉 client 你还是去找 server1 吧。
  • client 又来请求 server1,但是 server1 此时还是阻塞中,又回到 3。当请求的次数超过拒绝服务次数之后,就会抛出异常。

大命令要不得。对于这种错误,最首要的就是要优化存储结构或者获取数据方式。其次,增加 TCP 队列长度。再次,扩容也是可以解决的。


Natcret
1 声望0 粉丝