我们正在运行一个7节点的redis群集,所有节点都是主节点(没有从属复制)。我们将其用作内存缓存,因此我们在redis.conf中注释掉了所有保存,并且我们在redis.conf中得到了以下其他非默认值:
maxmemory: 30gb
maxmemory-policy allkeys-lru
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-require-full-coverage no
此群集的客户端是一个spring-boot rest api应用程序,使用spring-data-redis和jedis作为驱动程序。我们主要使用spring缓存注释。
前几天我们遇到了一个问题,其中一位大师下台了一段时间。在7节点集群中使用单个主节点时,我们注意到涉及redis的api调用的平均响应时间显着增加,这是我期望的。
当羽绒大师重新上线并重新加入群集时,我们的响应时间大幅增加。通过newrelic我可以看到应用程序开始进行大量的redis集群调用(newrelic并没有告诉我正在使用哪个集群子命令)。我们的正常平均响应时间约为5毫秒;在这段时间里,它达到了800毫秒,我们进行了一些慢速的样本交易。 70sec。在所有app jvms中,我看到活动线程的数量在此期间从正常的8-9跳到大约300。我们已经配置了tomcat http线程池以允许最多400个线程。大约3分钟后,问题就解决了,但我现在有人质疑我们选择的缓存解决方案的稳定性。 Newrelic并没有透露长期请求的额外时间花在哪里(显然是在Newrelic没有工作的区域)。
我已经尝试通过对开发环境运行一些jmeter负载测试来重现,虽然我在重新连接redis-cluster master时看到一些适度的响应时间峰值,但是我没有看到我们在生产中看到的任何东西。我也遇到了https://github.com/xetorthio/jedis/issues/1108,但我没有从中获得任何有用的见解。我尝试将spring.redis.cluster.max-redirects从默认值5减少到0,这对我的负载测试结果似乎没什么影响。我也不确定对我的用例进行适当的更改。