设为首页 收藏本站
查看: 585|回复: 0

[经验分享] Redis使用中的一些问题

[复制链接]

尚未签到

发表于 2016-12-19 09:43:13 | 显示全部楼层 |阅读模式
  最近使用Redis作为内存缓存使用,系统是java的web应用,采用的是Redis官方推荐的Jedis。Jedis使用很简单,网上的例子很多,不赘述。但是在使用者,遇到了很多问题,网上的答案也不多,特意记录下来。
  1)Jedis Pool崩溃
  我们做了一些压力测试,在大并发量的情况下(或者长时间运行后),Jedis时不时会崩溃掉。异常为:JedisConnectionException。 崩溃后,整个Redis无法使用。只要报这个异常,整个Redis无法使用,让人很无语。
  JedisConnectionException进一步跟踪,引起该异常的原因很多,常见的:

  •   redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:22)
  • .JedisConnectionException: java.net.SocketTimeoutException: Read timed out
  • 其他一些:比超出max clients等等
  总之,只要client 从pool中拿不到一个Jedis client instance, Jedis就会抛出JedisConnectionException, 然后整个redis 就无法连接上了。网上都是说怎么样配置,但是即使你正确的配置了参数,也不能保证Jedis Pool不崩溃,还是偶尔崩溃,没有特别好的解决方法。我们后来就workaround这个问题:catch这个异常(拿不到Jedis客户端),destroy现在的pool,然后重启一个。 
  网上有个其他网友的方案,可以参考一下:http://lyongq04.iyunv.com/blog/2043329
  2)Jedis Server的一些配置项:
  redis.conf的比较重要的配置项:
  timeout (客户端idle time,超过这个时间后,Jedis关闭这个链接),默认是300s(5分钟),我使用了默认配置。
  maxclients 50000 (我设置为50000)
  详细配置参考:http://dumbee.net/archives/114
  3)Tomcat 报 too many files open
  这个比较简单,就是linux服务器可打开的最大文件数低了,设置大一点:ulimit -n 100000  (修改系统设置)
  4)Tomcat 报NoRouteToHostException can not assigen address...
  原因:Tomcat服务器上的端口不够用了。Jedis客户端每开一个connection,就占用一个端口,在大并发量的情况下,connect虽然断开,但占用的端口来不及回收重用。
  使用命令查看使用的端口数:netstat -an|wc –l , 一段时间后,数字不断上升,不下降或稳定,说明来不及释放,或不释放。
  设置linux的内核参数:
 1. 调低端口释放后的等待时间, 默认为60s, 修改为15~30s
        echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
    2. 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0, 修改为1, 释放TIME_WAIT端口给新连接使用。
        echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
    3. 修改tcp/ip协议配置,快速回收socket资源,  默认为0, 修改为1.
        echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
同时设置:
     echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
     echo 2 > /proc/sys/net/ipv4/tcp_keepalive_intvl
     echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes
请注意:上面的设置是针对IPV4, 如果你的tomcat监听的端口(8080)是IPV6, 请把tomcat 的监听方式改到IPV4:
tomcat的启动参数:
添加java参数 :
JAVA_OPTS= $JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true
 
怎么查看tomcat监听是IPV4还是IPV6:  #netstat -nl
后看到监听的8080端口是:TCP 还是TCP6
tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN         
tcp6       0      0 :::22                   :::*                    LISTEN     
 
tcp6       0      0 ::1:631                 :::*                    LISTEN
 
个人经验是:Jedis Pool Config文件中active client配置5000就OK了,不要过大。一台Redis服务器max client配置2w基本上OK。 
 
另外,感觉Jedis客户端不够稳定,正在测试其他的Java客户端,有好的效果,也会报告给大家。

 
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316258-1-1.html 上篇帖子: SSDB Redis替代品 下篇帖子: Redis使用系列:配置文件篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表