先说些题外话~自上次确诊为鼻窦炎+过敏性鼻炎到现在已经一个月了,最初那会,从下午到晚上头疼难忍。大概是积劳成疾,以前流鼻涕、打喷嚏的时候从来没有注意过,结果病根一下爆发。

关键在于锁定问题,开始治疗一两天之后就不会头疼了。当然,习惯也很重要,再也不敢用力擤鼻子了。

挺过那一阵就好受很多,之后就是鼻塞稍微烦人一些。鼻子的问题很容易串到其他面部器官中去,一旦发展严重必然大幅度影响生活质量。

治疗方法推荐洗鼻(前两周先消炎,吃地红霉素),但注意不要让医院赚的太狠,药包到药店或者网上买都可以;如果是过敏引发流涕也要吃抗过敏药。

以上,为同样深受困扰的小伙伴提供一些经验。。

【问题】使用jediscluster连接redis集群,使用jedis执行redis命令,一些时候报Could not get a resource from the pool ,底层是连接超时异常,另一些时候则正常。

【复现】时好时坏,有时失败后马上第二次请求相同命令即成功,进一步测试发现竟然与请求的key有关,极难定位问题原因。

【方案】1、考虑为服务端与客户端版本不匹配问题,而

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

jedis版本已为最新,另有3.X-m1版本,换用之后也无效。此处麻烦大家告知一下“m1”的意思。

换用spring的包装客户端,spring-data-redis,亦无效。

从时好时坏这一点来看,版本不是主因。事实上,redis对于版本匹配并不如kafka那般严格。

2、考虑为客户端连接参数问题,结合网上各种经验调整JedisPoolConfig与JedisCluster构造方法参数,均无效。这里时间浪费最多,网上信息庞杂而大部分无用。

3、考虑为服务端单个redis节点配置问题,bind不到外网ip,这点很疑惑。

4、考虑为服务端密码问题,从slot槽的设计入手,假设在目前的客户端中,如果请求的key需要转发到其他节点,则因为没有验证密码而被其他节点拒绝。(实际上这是对部署脚本或者jedis集群客户端不信任)

服务端取消密码构建集群后问题依旧,但已经接近问题答案。

【解决】定位问题在于集群节点。

原因排查依据:

(1)命令执行时好时坏,同一命令请求不同key,一些一直成功,其他一直不成功。

(2)查询所有节点的keys命令从未成功。

(3)debug之下发现不成功的命令请求的节点是内网ip,成功的命令是另一节点的外网ip。

原来,为了测试方便,我使用了外网ip构建集群。但是,官方提供的redis-trib.rb脚本带有极大的迷惑性,在构建时返回屏幕的信息正确,而自动生成的每个节点的nodes.conf中,表述自身的一行与预期均有出入,如下所示:

图中139为外网ip,而172则是内网ip。导致客户端经对key哈希后得到的槽,所对应的请求节点有可能拿到内网ip,导致无法连接。超时后报错。

为解决问题,我假设只要该配置存在,节点之间即可相互感知,节点重启后也不会影响集群状态。故而手工将内网ip修改为外网ip,重启每个redis节点,问题解决。

【目前最佳实践】

目前认为官方提供用于构建和管理集群的redis-trib.rb脚本,对外网ip的支持并不完善。因此,

1、在开发测试阶段,通过外网ip构建集群,通过密码保证安全性。

2、单个redis配置:bind注释掉,打开保护模式,设置密码和集群master密码,ruby client.rb中对应修改密码。

我的路径/usr/local/rvm/gems/ruby-2.4.1/gems/redis-4.0.2/lib/redis/client.rb 密码用就替换,不用就填nil,不是空字串!

3、清除每一个节点的持久化记录和之前的nodes.conf之后,用外网ip正常构建集群。

4、手工修改生成的每一个nodes.conf,然后重启对应的redis节点。

如有理解偏差或更好方案,希望可以告知,大家一起讨论。

【Redis】Could not get a resource from the pool 实乃集群配置问题的更多相关文章

  1. Redis安装、主从配置及两种高可用集群搭建

    Redis安装.主从配置及两种高可用集群搭建 一.            准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...

  2. 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法

    "为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...

  3. Redis高可用(持久化、主从复制、哨兵、集群)

    Redis高可用(持久化.主从复制.哨兵.集群) 目录 Redis高可用(持久化.主从复制.哨兵.集群) 一.Redis高可用 1. Redis高可用概述 2. Redis高可用策略 二.Redis持 ...

  4. Redis随笔(四)Centos7 搭redis3.2.9集群-3主3从的6个节点服务

    1.虚拟机环境 使用的Linux环境已经版本: Centos 7   64位系统 主机ip: 192.168.56.180 192.168.56.181 192.168.56.182 每台服务器是1主 ...

  5. Redis(二)CentOS7安装Redis4.0.10与集群搭建

    一 Redis单机安装 1 Redis下载安装 1.1 检查依赖环境(Redis是C语言开发,编译依赖gcc环境) [root@node21 redis-]$ gcc -v -bash: gcc: c ...

  6. Redis 搭建一主二从三哨兵高可用集群

    1.单个redis服务搭建请参考:redis服务搭建 2.在/usr/local下创建目录redis-cluster,并在redis-cluster下创建 6379.6380.6381目录以及data ...

  7. Redis(1.11)Redis4.0.11 cluster 分布式集群搭建

    概念与了解:Redis(1.7)Redis高可用架构(理论篇) [0]试验环境 结构图如下: (这里试验没有那么多机器,就用3台机器搭建试验) redis1是redis集群的一个节点A,上面运行了两个 ...

  8. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  9. Redis集群(八):Redis Sharding集群

    一.Redis目前的集群方案主要有两种:Redis Sharding和Redis Cluster 1.Redis Sharding:3.0以前基本上使用分片实现集群,目前主流方案,客户端实现 2.Re ...

随机推荐

  1. Linux 中 Xampp 的 https 安全证书配置

    博客地址:http://www.moonxy.com 一.前言 HTTP 协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的 HTTP 的 ...

  2. 一个vue练手的小项目

    编程路上的菜鸟一枚 : 最近接触了vue 然后写了一个练手的项目 使用vue-cli脚手架来搭建了的项目 技术: vue2  + vue-router  + ES6 + axios 框架有 mint- ...

  3. 跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境

    1. 容器化 Docker 的横空出世,给了容器技术带来了质的飞跃,Docker 标准化了服务的基础设施,统一了应用的打包分发,部署以及操作系统相关类库等,解决了测试生产部署时环境差异的问题.对于运维 ...

  4. 暑期——第三周总结(Ubuntu系统安装eclipse问题【已解决】)

    所花时间:7天 代码行:200(python)+150(java) 博客量:1篇 了解到知识点 : 一: Python: 问题 unresolved reference xrange 解决方案 pyt ...

  5. liunx帮助whatis使用方法

           liunx帮助             获取帮助的能力决定了技术的能力! 1.whatis ♢只显示命令的简短描述,相对功能比较单一. [09:42:22 root@centos ~]# ...

  6. 【转+】python为什么推荐使用多进程

    最近在看Python的多线程,经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢?                要知其然,更要知其所以然.所以有了下面的深入研 ...

  7. Java 内存模型与内存结构

    Java内存模型 一.简介 Java内存模型(JMM)主要是为了规定线程和内存之间的一些关系:根据JMM的设计,系统存在一个主内存(Main Memory)和工作内存(Work Memory),Jav ...

  8. HTML5 原生拖放

    前言: HTML5提供专门的拖拽与拖放的API,可以方便的指定某个元素可拖动,可以创建自定义的可拖动元素和放置目标 相关知识点: 1.拖放事件 拖放元素时,将依次触发下列事件 dragstart  按 ...

  9. abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理三 (二十一)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  10. Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)

    Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...