文章系转载,方便整理和归纳,源文地址 https://cloud.tencent.com/developer/article/1803937

1 前言

一大早有个同事过来问我,今天xxx系统需要增加6个pod。我们当前的Redis是否能够撑得住呢?

2 场景介绍

2.1 Redis和Jedis版本以及重要参数介绍

类型 版本 其他
Redis 4.0.12 三主三从(分布6台虚拟机4c32gb/台)
Jedis 2.9 关键参数详解

2.2 Jedis 关键参数详解

首先我们先介绍几个关键的Jedis参数,方便我们后续的资源评估。

参数 说明 默认值 建议值
maxTotal 资源池中的最大连接数 8 详见《2.2.1 关键参数建议》
maxIdle 资源池允许的最大空闲连接数 8 详见《2.2.1 关键参数建议》
minIdle 资源池确保的最少空闲连接数 0 详见《2.2.1 关键参数建议》
blockWhenExhausted 当资源耗尽的时候,调用者是否等待。只有当值为true时,下面的maxWaitMillis才会生效。 true 建议使用默认值。
maxWaitMillis 当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)。 -1(表示永不超时) 不建议使用默认值。
testOnBorrow 向资源池借用连接时是否做连接有效性检测(ping)。检测到的无效连接将会被移除。 false 业务量很大时候建议设置为false,减少一次ping的开销。
testOnReturn 向资源池归还连接时是否做连接有效性检测(ping)。检测到无效连接将会被移除。 false 业务量很大时候建议设置为false,减少一次ping的开销。
jmxEnabled 是否开启JMX监控 true 建议开启,请注意应用本身也需要开启。

2.2.1 关键参数建议

maxTotal(资源池中的最大连接数),该参数主要从如下四点进行考虑:

  1. 业务希望Redis能达到的并发数;
  2. 客户端执行的时间;
  3. Redis资源,例如Redis cluster(三主三从)pod数 *maxTotal < 3 * 单个Redis 分片的最大连接数(默认是10000),也就是要小于30000,正常情况我们还会为改参数乘于一个预留系数 0.8 ,所以公式为: pod数 *maxTotal < 3 * 10000 * 0.8 < 24000;
  4. 资源开销,例如虽然希望控制空闲连接,但又不希望因为连接池中频繁地释放和创建连接造成不必要的开销。

举个简单的例子来计算,比如一个命令的时间(borrow|return resource+Jedis执行命令+网络开销的时间)为1ms,那么一个连接的QPS计算公式为:1s/1ms=1000。如果业务希望我们集群的QPS能达到100w,有10个应用pod, 那计算公式为1000000/1000/10=100。那么maxTotal配置为100。

当然这个值只是一个理论值,我们在预设这个值的时候,需要预留一些资源,所以这个实际值就要比理论值设置大一点,但是这个值不是越大越好,一方面连接太多会占用客户端和服务端资源,另一方面对于Redis这种高QPS的服务器,如果出现大命令的阻塞,即使设置再大的资源池也无济于事。

maxIdle与minIdle

maxIdle实际上才是业务需要的最大连接数,maxTotal 是为了给出余量,所以 maxIdle 不要设置得过小,否则会有new Jedis(新连接)开销,而minIdle是为了控制空闲资源检测。

连接池的最佳性能是maxTotal=maxIdle,这样就避免了连接池伸缩带来的性能干扰。如果您的业务存在突峰访问,建议设置这两个参数的值相等;如果并发量不大或者maxIdle设置过高,则会导致不必要的连接资源浪费。

minIdle为资源池确保的最少空闲连接数,这个参数很重要。我们经常会在Jedis pool预热这一块用到这个参数。由于一些原因(如超时时间设置较小等),项目在启动成功后可能会出现超时。JedisPool定义最大资源数、最小空闲资源数时,不会在连接池中创建Jedis连接。初次使用时,池中没有资源使用则会先new Jedis,使用后再放入资源池,该过程会有一定的时间开销,所以建议在定义JedisPool后,以最小空闲数量为基准对JedisPool进行预热。

综上,您可以根据实际总QPS和调用Redis的客户端规模整体评估每个节点所使用的连接池大小。

使用监控获取合理值

在实际环境中,比较可靠的方法是通过监控来尝试获取参数的最佳值。可以考虑通过JMX等方式实现监控,从而找到合理值。

2.3 最佳实践评估

参数 参数值
maxTotal 500
maxIdle 500
minIdle 100
pod 20

如上列表为当前pod数量和关键参数配置,从普罗米修斯监控看,该集群内存使用率均整体资源达到30%左右,资源很空闲,所以我们只需要评估连接数是否足够,那就是500 * 26 是否小于 10000 * 3 * 80%,答案很明显,最大连接数符合要求。

3.其他

以上是一个最大连接数评估的一个过程,那资源不足的时候,程序会有哪些问题呢?下面将介绍两种资源不足的情况

A. blockWhenExhausted 为false,Jedis不会等待资源释放:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
…
Caused by: java.util.NoSuchElementException: Pool exhausted
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)

B.超时:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
…
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)

4 总结

当遇到资源评估的时候,稳住。查看下相关的理论,再结合实际一对比,其实很多问题就解决了。本文其实有一些定理总结,具体如下:

  1. 应用端最大连接数估算公式: maxTotal * pod数 < max_clients(redis cluster 单个分片的max_clients)* 分片数 * 80% (预留百分比);
  2. 应用端最大空闲连接数设置: 0 < maxIdle <= maxTotal;
  3. 比较常见的配置推荐: maxIdle == maxTotal == Tomcat 线程数,此配置均满足以上公式。

5 参考文献

  1. https://github.com/redis/jedis/blob/master/src/main/java/redis/clients/jedis/JedisPoolConfig.java

  2. https://www.alibabacloud.com/help/doc-detail/145231.htm?spm=a2c63.p38356.b99.30.70386695h1A3OP

  3. https://www.alibabacloud.com/help/doc-detail/98726.html?spm=a2c5t.11065259.1996646101.searchclickresult.3b337b7aaLFVkZ

你的Redis集群撑得住吗?相关推荐

  1. Redlock——Redis集群分布式锁

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 分布式锁是一种非常有用的技术手段.实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 ...

  2. Redis集群解决方案比较

    调研比较了三个Redis集群的解决方案: 系统 贡献者 是否官方Redis实现 编程语言 Twemproxy Twitter 是 C Redis Cluster Redis官方 是 C Codis 豌 ...

  3. 技术分享 | Redis 集群架构解析

    作者:贲绍华 爱可生研发中心工程师,负责项目的需求与维护工作.其他身份:柯基铲屎官. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.集群架构的 ...

  4. Redis集群规范(一)

    主要特性和设计原理 Redis集群目标 Redis集群是Redis集群中的一种分布式实现,它有以下目标(按照重要性进行排序): 高性能,可以线性扩展至1000个节点:没有代理,使用异步复制,在valu ...

  5. 《Redis官方教程》Redis集群规范

    原文链接(on 20 Jul)  作者:antirez  译者:carlvine Redis集群规范 欢迎来到Redis集群规范.在这里你可以找到有关Redis的算法和设计的基本原理.这篇文章是一项正 ...

  6. 支撑腾讯直播百亿请求的 Redis 集群是如何工作的

    摘要:作为noSql中的kv数据库的王者,redis以其高性能,低时延,丰富的数据结构备受开发者青睐,但是由于redis在水平伸缩性上受限,如何做到能够水平扩容,同时对业务无侵入性是很多使用redis ...

  7. 分布式一致性协议 Gossip 和 Redis 集群原理解析

    分布式一致性协议 Gossip 和 Redis 集群原理解析 Redis 是一个开源的.高性能的 Key-Value 数据库.基于 Redis 的分布式缓存已经有很多成功的商业应用,其中就包括阿里 A ...

  8. docker 实现redis集群搭建

    摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群. 首先,我们需要理论知识:Redis Cluster是Re ...

  9. Redis 集群部署及踩过的坑

    本文目标 要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群,同时记录在搭建过程中踩过的坑. 安装准备 centos版本:6.7 redis版本:3.2.3 安装方 ...

  10. windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error...

    windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error 学习了:https ...

最新文章

  1. resize函数_每日一题手写函数防抖与节流
  2. Nexys3学习手记1:写在前面的话
  3. 文献记录(part8)--A biclustering approach for classification with mislabeled data
  4. How is note created - SAP backend implementation
  5. c++调用cplex求解例子_递归算法的R语言实现 (罗汉塔、九连环、斐波那契数列等问题的求解)...
  6. 简单实用的分页存储过程,支持多字段排序
  7. Collections类操作集合详解
  8. 深度学习(三十四)对抗自编码网络-未完待续
  9. linux 不显示路径原因,linux 下shell 显示-bash-4.1不显示路径解决办法
  10. 任务管理器使用不了-灰色
  11. numpy 高阶函数 —— np.histogram
  12. 6.2 JAVA方法的三种调用格式
  13. 荔枝软件如何测试声音,荔枝如何测自己的声音 荔枝测自己的声音方法
  14. FydeOS | ChromeOS配置Flutter开发环境
  15. 支教日记软件测试,教学实习每周工作计划精选 .doc
  16. (转)Android屏幕适配全攻略
  17. 使用ESP8266通过Blinker平台接入天猫精灵控制电视/空调
  18. 掌纹与掌静脉融合matlab代码,手形、掌纹和掌静脉多特征融合识别
  19. matlab 光流法工具箱,MatlabToolBox-PIV Special Effects 图形图像处理 267万源代码下载- www.pudn.com...
  20. 电子商务计算机考试,电子商务师考试电子商务训练试题

热门文章

  1. ethtool工具设置网口配置
  2. pyhton中常用的基础模块
  3. python入门基础2 if语句 while循环 for循环
  4. GoogleAdSense高价关键字排行榜
  5. .NET 中的序列化
  6. ComponentArt Web.UI控件的bug及解决办法
  7. 计算机网络网络层之IPv6简介
  8. 十五、K8s helm包管理与应用
  9. H3C ACL 访问控制
  10. LAMP架构调优(九)——Apache Rewrite功能实战