摘要

看到这篇文章,很有借鉴意义,因此写个读书笔记,不算是翻译。想要深入了解,请看原文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

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。

google-group之定时任务跑BGSAVE

这样的一个改变,里面降低了timeout/error的问题。但是仍然会看到有错误抛出。

生产环境中学习Redis的更多相关文章

  1. 13.生产环境中的 redis 是怎么部署的?

    作者:中华石杉 面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主 ...

  2. 生产环境中的 redis 是怎么部署的

    redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰q ...

  3. 面试系列20 生产环境中的redis是怎么部署的

    redis cluster,10台机器,5台机器部署了redis主实例,另外5台机器部署了redis的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每 ...

  4. 生产环境中的redis是怎么部署的?

    redis cluster,10台机器,5台机器部署了redis主实例,另外5台机器部署了redis的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每 ...

  5. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  6. Kubernetes 在生产环境中常用架构

    Kubernetes 在生产环境中常用架构 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下图所示 在该架构中,我们可以将其分为四层,如下: Client层:即Kuber ...

  7. Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署

    一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...

  8. 生产环境中 Ngx_lua 使用技巧和应用的范例

    生产环境中 Ngx_lua 使用技巧和应用的范例 时间 -- :: 51CTO技术博客 原文 http://rfyiamcool.blog.51cto.com/1030776/1252501 主题 L ...

  9. Flink 实战:如何解决生产环境中的技术难题?

    大数据作为未来技术的基石已成为国家基础性战略资源,挖掘数据无穷潜力,将算力推至极致是整个社会面临的挑战与难题. Apache Flink 作为业界公认为最好的流计算引擎,不仅仅局限于做流处理,而是一套 ...

随机推荐

  1. Java 读书笔记 (十四) Java 方法

    finalize() 方法 finalize() 用来清除回收对象.  //为什么要回收内存?怎样写可以避免内存过多占用?什么时候需要手动回收内存? protected void finalize() ...

  2. django(权限、认证)系统—— Permissions和Group

    接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证.接下来,我们要看另外一个议题,那就是Authorization授 ...

  3. 【prufer编码】BZOJ1211 [HNOI2004]树的计数

    Description 给定一棵树每个节点度的限制为di,求有多少符合限制不同的树. Solution 发现prufer码和度数必然的联系 prufer码一个点出现次数为它的度数-1 我们依然可以把树 ...

  4. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  5. 我和Python的Py交易》》》》》》数据类型

    Python里的变量 ---门牌 Python在使用变量之前无须定义它的类型,但是必须声明以及初始化该变量. Python中给变量赋值就是声明,初始化变量(也就是创建一个相应数据类型的对象,而那些数据 ...

  6. 说说 input 输入框的事件

    从input框获取焦点到,输入值,失去焦点这个过程所有事件,以及一些特点: 1.过程 onfocus -> 键盘输入 -> onkeydown -> onkeypress -> ...

  7. 旅行app(游记、攻略、私人定制) | 顺便游旅行H5移动端实例

    <顺便游旅行>是一款H5移动端旅行app,提供目的地(国内.国外.周边)搜索.旅游攻略查询.游记分享.私人定制4大模块,类似携程.同程.去哪儿.马蜂窝移动端,只不过顺便游app界面更为简洁 ...

  8. selenium+python,解决selenium弹出新页面,无法定位元素的问题(报错:Unable to locate element:元素)

    1.问题发生描述: 从一个页面进行点击等操作,页面跳转到第二个页面,对第二个页面中的元素,采取任何措施定位都报错,问题报错点如下: 2.出现问题的原因: 窗口句柄还停留在上一个页面,对于当前新弹出的页 ...

  9. Docker 镜像之进阶篇

    笔者在<Docker 基础 : 镜像>一文中介绍了 docker 镜像的基本用法,本文我们来介绍 docker 镜像背后的技术原理. 什么是 docker 镜像 docker 镜像是一个只 ...

  10. ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)

    前言 时间一晃 ASP.NET Core已经迭代到2.1版本了. 迫不及待的的下载了最新的版本,然后生成了一个模版项目来试试水. ...然后就碰到问题了... 我发现..cookie竟然存不进去了.. ...