生产环境中学习Redis
摘要
看到这篇文章,很有借鉴意义,因此写个读书笔记,不算是翻译。想要深入了解,请看原文http://tech.trivago.com/2017/01/25/learn-redis-the-hard-way-in-production/?utm_source=wanqu.co&utm_campaign=Wanqu+Daily&utm_medium=website
使用场景
旅店搜索应用,使用redis来做缓冲,以及作为将数据搬到其他存储或者传统意义的数据库之前的一个临时存储。数据主要是旅店元数据以及数据的持久化
问题
发布了一些新功能,平台上增加了一些新的语言。然后HTTP请求在短时间内翻倍了。因为硬件方面的高可用性,能够处理这些增长。但是近来的请求有40%response是HTTP 500: Internal Server Error.
查看日志发现,这和redis connection处理有关,大部分是redis error on connection 以及 redis server went away.
google 一下发现有相关的issue了。
debug read error on connection
Debugging 来解决问题
首先尝试了issue中给出的建议,但是没有用。而且这些问题只出现在高并发情况下。
在web请求结束关闭redis connection
没有使用php-fpm以及持久化连接。意味着每一个HTTP请求都会创建一个新的Redis连接,打开了一个连接,但是从来没有关闭它。
在最新的PHP版本中,PHP会自动关闭连接。
注:
不了解PHP,没使用php-fpm。但是这个错误不应该放,数据库的连接不关闭,一个请求创建一个新的连接。这样很容易导致内存泄漏,OOM。不清楚为什么系统运行了三年还没有发现这个问题。
A/B 测试 connections libraries
怀疑是phpredis(php extension)的bug。将C extension退回到predis包。发现仍然有问题。
升级redis
从redis2.6升级到redis2.8.9还是有问题
Debugging 延迟问题
Watchdog
来debug 延迟问题。为了识别出长时间跑的以及阻塞的命令
建议
Redis是单线程的,所以每一个命令都有可能阻塞其他命令。这点一定要牢记于心。虽然是显而易见的特性,但是常常被忽略,而且这是很多问题的根本
使用了Watchdog后,遇到了个bug,redis server down掉了。
redis crashes during rdb save point
看了下redis baseline 延迟,一切正常
redis-cli --latency -p 6380 -h 1.2.3.4
min: 0, max: 463, avg: 2.03 (19443 samples)
查看了redis log,发现redis每隔一分钟将数据保存到磁盘中。
[20398] 22 May 09:25:23.299 * 10000 changes in 60 seconds. Saving...
[20398] 22 May 09:25:23.644 * Background saving started by pid 42027
第一个问题是为什么一个后台保存进程的fork需要400+ms.
因为需要复制page table
因此如果你有个大的Redis实例有很多keys,就会需要很多时间去完成。详情看这篇Fork time in different systems
后面讲Redis snapshot关掉了,因为services不需要这样的持久化。这样做法将读错误降低了30%。
建议
review下你对redis持久化的需求以及redis配置。应用是否会更改很多的keys,考虑使用AOF或者定时的BGSAVE作为持久化方案,而不是标准的snapshotting。
我们错误的根源就在于此。读和写keys,不想全面的禁掉持久化。因此使用一个定时任务去调用BGSAVE命令。将这些任务放在slave实例上。对于持久化要求更高的场合,使用AOF。
这样的一个改变,里面降低了timeout/error的问题。但是仍然会看到有错误抛出。
生产环境中学习Redis的更多相关文章
- 13.生产环境中的 redis 是怎么部署的?
作者:中华石杉 面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主 ...
- 生产环境中的 redis 是怎么部署的
redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰q ...
- 面试系列20 生产环境中的redis是怎么部署的
redis cluster,10台机器,5台机器部署了redis主实例,另外5台机器部署了redis的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每 ...
- 生产环境中的redis是怎么部署的?
redis cluster,10台机器,5台机器部署了redis主实例,另外5台机器部署了redis的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每 ...
- 生产环境中使用Docker Swarm的一些建议
译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...
- Kubernetes 在生产环境中常用架构
Kubernetes 在生产环境中常用架构 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下图所示 在该架构中,我们可以将其分为四层,如下: Client层:即Kuber ...
- Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署
一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...
- 生产环境中 Ngx_lua 使用技巧和应用的范例
生产环境中 Ngx_lua 使用技巧和应用的范例 时间 -- :: 51CTO技术博客 原文 http://rfyiamcool.blog.51cto.com/1030776/1252501 主题 L ...
- Flink 实战:如何解决生产环境中的技术难题?
大数据作为未来技术的基石已成为国家基础性战略资源,挖掘数据无穷潜力,将算力推至极致是整个社会面临的挑战与难题. Apache Flink 作为业界公认为最好的流计算引擎,不仅仅局限于做流处理,而是一套 ...
随机推荐
- dom操作相关,byebye T T
o = { name: 'aa', price: 11, } function add(items) { var bodys = document.getElementsByTagName('tbod ...
- 【原】用Java编写第一个区块链(二)
这篇文章将去介绍如何使用区块链进行交易. [本文禁止任何形式的全文粘贴式转载,本文来自 zacky31 的随笔] 目标: 在上一篇文章中,我们已经创建了一个可信任的区块链.但是目前所创建的链中包含的有 ...
- BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路
BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...
- Volley手写属于自己的万能网络访问框架
用户在调用层(Activity或Service中),发起一个网络请求,该请求肯定包含url,请求参数(requestParameter),以及我们需要给调用层提供一个请求成功或失败以后回调监听的接口d ...
- SM干货篇:你应该具备的提问技巧!
在成为Scrum Master(SM)之前,我曾担任过许多团队的技术负责人.工作内容之一就是做决定,而且我认为自己做得挺好:坚定果断是我性格的一部分. 然而,当我成为Scrum Master之后,这样 ...
- 【爆料】-《西悉尼大学毕业证书》UWS一模一样原件
☞西悉尼大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...
- linux系统光盘开机自动挂载-配置本地yum源
一.光盘开机自动挂载 1.修改配置文件 执行命令 :vi /etc/fstab 添加/dev/cdrom /mnt iso9660 ...
- Postman----request的body中实现数据驱动
使用场景: 一个接口多次执行,要求body中的某个参数在每次运行时都要填写不同的值,根据不同值的传入,返回不同的结果 参考示例:通过接口测试创建5条待办名称不一样的待办事项.名称格式不作要求 解决方法 ...
- appium+python+eclipse 自动化测试框架构建!
经过几天的慢慢研究,现将所需用的自动化框架进行了构建,在后期的代码编写中,直接在框架中套用编写对应的module.case等即可,以此来简化测试方式,提高代码的编写效率与规范 基本的架构设计流程图,如 ...
- common-pool2连接池详解与使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...