Redis 关闭与客户端的连接,同时在后台保存更改的 key

标签 redis

我在 EC2 上有一个 Redis 服务器,并连接了 2 个应用程序服务器。所有小/中。流量不高; 300 秒内仅更改了 10 个 key 。我开始注意到应用服务器与 Redis 机器的连接错误:

 Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

起初我认为这是我的池配置或我用来与 Redis 交互的 Java 客户端的问题,但是当我注意到两个应用程序服务器总是同时生成这些异常时,我很快就覆盖了这个理论他们总是成群结队地来。然后我查看了 redis.log 并在出现错误时注意到以下输出:

[13939] 08 May 22:31:05.051 * 300 秒内发生 10 次更改。保存... [13939] 08 May 22:31:05.342 * 后台保存由 pid 13945 开始 [13939] 08 May 22:31:09.357 - DB 0:1048576 个 HT 插槽中的 606477 个 key (0 volatile )。 [13939] 08 May 22:31:09.357 - 连接了 3 个客户端(0 个从属),使用了 764180208 个字节 [13939] 08 May 22:31:14.542 - DB 0:1048576 个 HT 插槽中的 606477 个 key (0 volatile )。 [13939] 08 May 22:31:25.947 - 连接了 3 个客户端(0 个从属),使用了 764180208 个字节 [13939] 5 月 8 日 22:31:25.947 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.947 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.947 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.947 - 已接受 10.123.29.90:56301 [13939] 5 月 8 日 22:31:25.947 - 已接受 10.42.105.60:35315 [13939] 5 月 8 日 22:31:25.947 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.947 - 已接受 10.123.29.90:56302 [13939] 5 月 8 日 22:31:25.947 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.947 - 已接受 10.42.105.60:35317 [13939] 5 月 8 日 22:31:25.947 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.947 - 已接受 10.123.29.90:56306 [13939] 5 月 8 日 22:31:25.948 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.948 - 已接受 10.42.105.60:35318 [13939] 5 月 8 日 22:31:25.948 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.948 - 已接受 10.123.29.90:56308 [13939] 5 月 8 日 22:31:25.948 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.948 - 已接受 10.42.105.60:35319 [13939] 5 月 8 日 22:31:25.948 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.948 - 已接受 10.42.105.60:35320 [13939] 5 月 8 日 22:31:25.948 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.948 - 已接受 10.123.29.90:56310 [13939] 5 月 8 日 22:31:25.948 - 写入客户端时出错:连接由对等方重置 [13939] 5 月 8 日 22:31:25.948 - 已接受 10.42.105.60:35322 [13939] 5 月 8 日 22:31:27.652 - 已接受 10.42.105.60:35327 [13939] 5 月 8 日 22:31:27.872 - 已接受 10.42.105.60:35329 [13945] 5 月 8 日 22:31:27.926 * 数据库保存在磁盘上

错误仅在 Redis 在后台保存新数据时发生。我正在使用 Redis 2.6。感谢您的帮助。

编辑:下面使用 spring-data 配置 Redis 连接池

<bean id="redisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" lazy-init="false"
      p:maxTotal="500"
      p:maxIdle="20"
      p:testOnBorrow="true"
      p:testOnCreate="true"
      p:testOnReturn="true"
      p:maxWaitMillis="30000"
    />
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
      p:hostName="${REDIS_HOST}"
      p:port="${REDIS_PORT}"
      p:usePool="true"
      p:poolConfig-ref="redisPoolConfig"
    />

最佳答案

我想我找到了答案。升级到 2.8.9 并重新启动后,日志提醒我我的操作系统将打开文件描述符的数量限制为 1024,运行的 Redis 实例很容易超过这个数量。所以可能发生的事情是后台保存进程正在打开新的文件描述符,这阻止了新连接被接受,因为每个新的客户端连接都会打开一个文件。通过 ulimit -n 将限制增加到 10000 后,一切似乎都正常运行。

关于Redis 关闭与客户端的连接,同时在后台保存更改的 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553971/

相关文章:

events - EXPIRE 键 0 未通知 Redis 订阅者

Redis 键随机消失

python - 连接断开时重试 Redis 操作

java - 绝地武士得到陈旧的数据

Redis 写入主机从从机读取

Node.js HTTP如何做一个HTTP请求限速?

node.js - Nohm 找不到 Redis 客户端

node.js - 服务器重新启动时如何在 Node js 中保持持久 session ?

node.js - 如何为发布订阅实例化多个Redis连接(node.js + node_redis)

laravel - 从多个服务器处理 Laravel/Redis 作业