redis

Redis(十二):Redis数据倾斜及监控

2023-02-20  本文已影响0人  雪飘千里

1 数据倾斜

1.1 定义

对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。

1.2 危害

如果发生了数据倾斜,那么保存了大量数据,或者是保存了热点数据的实例的处理压力就会增大,速度变慢,甚至还可能会引起这个实例的内存资源耗尽,从而崩溃。这是我们在应用切片集群时要避免的。

1.3 分类

Redis(五):常见面试题目详解 中写过关于bigkey和hotkey的生产问题,但是只治标不治本,数据倾斜还是需要监控起来,这样在生成环境遇到问题时,才不至于措手不及。

2 BigKey

2.1 定义

通常以Key的大小和Key中成员的数量来综合判定,例如:

2.2 产生原因

bigkey的产生主要是由于程序的设计不当所造成的,如以下几种常见的业务场景

由此可见,在程序设计中,我们要对数据量的增长和边界有一个基本性的评估,做好技术选型和技术架构。

2.3 危害

2.4 优化方案

2.4.1 拆分Bigkey

优化Bigkey的原则就是string减少字符串长度,list、hash、set、zset等减少元素数量。当我们知道哪些key是Bigkey时,可以把单个key拆分成多个key,比如以下拆分方式可以参考。

如果bigkey不可避免,也要思考一下要不要每次把所有元素都取出来(例如有时候仅仅需要hmget,而不是hgetall),删除也是一样,尽量使用优雅的方式来处理。

2.4.2 选择适合的数据类型。

例如:实体类型(要合理控制和使用数据结构,但也要注意节省内存和性能之间的平衡)

反例:

set user:1:name tom 
set user:1:age 19
set user:1:favor football </pre>

正例:

hmset user:1 name tom age 19 favor football

2.4.3 控制key的生命周期,redis不是垃圾桶

建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期)。

2.5 监控并预警

Bigkey首先需要重源头治理,防止Bigkey的产生;其次是需要能够及时的发现,发现后及时处理。分析Bigkey的方法不少,这里介绍两种比较常用的方法,也是Daas平台分析Bigkey使用的两种方式,分别是Bigkeys命令分析法、RDB文件分析法。

2.5.1 scan命令分析

Redis4.0及以上版本提供了--Bigkeys命令,可以分析出实例中每种数据结构的top 1的Bigkey,同时给出了每种数据类型的键值个数以及平均大小。执行--Bigkeys命令时候需要注意以下几点:

redis-cli -h 127.0.0.1 -p 6379 -a "password" --bigkeys

2.5.2 RDB文件分析

借助开源的工具,比如rdb-tools,分析Redis实例的RDB文件,找出其中的Bigkey,这种方式需要生成RDB文件,需要注意以下几点:

Rdbtools 是 python写的 一个第三方开源工具,用来解析 Redis 快照文件。除了解析 rdb 文件,还提供了统计单个 key 大小的工具。

1、安装

git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools sudo && python setup.py install

2、使用

从 dump.rdb 快照文件统计, 将所有 > 10kb 的 key 输出到一个 csv 文件

rdb dump.rdb -c memory --bytes 10240 -f live_redis.csv

2.5.3 使用 memory 命令查看 key 的大小(仅支持 Redis 4.0 以后的版本)

redis-cli -h 127.0.0.1 -p 6379 -a password

MEMORY USAGE keyname1
(integer) 157481

MEMORY USAGE keyname2
(integer) 312583

3 HotKey

3.1 定义

通常以其接收到的Key被请求频率来判定,例如:

也就是说虽然每个集群实例上的数据量相差不大,但是某个实例上的数据是热点数据,被访问得非常频繁

image.png

3.2 产生原因

预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会之间的战斗涉及大量玩家等。

3.3 危害

3.4 优化方案

3.4.1 备份热key

可以把热点数据复制多份,在每一个数据副本的 key 中增加一个随机后缀,让它和其它副本数据不会被映射到同一个 Slot 中。

这里相当于把一份数据复制到其他实例上,这样在访问的时候也增加随机前缀,将对一个实例的访问压力,均摊到其他实例上

3.4.2 本地缓存

如果我们可以预测到hotkey发生,比如秒杀这类,那我们就可以在活动上线前提前把缓存数据 写入到本地内存。

3.4.3 本地缓存+动态计算自动发现热点缓存

处理突发的hotkey就只能通过 动态计算然后缓存进行热点缓存

3.5 监控并预警

3.5.1 基于流式计算技术的缓存热点⾃动发现

框架如下图,具体介绍见 Redis(五):常见面试题目详解

img

3.5.2 京东开源框架JD-hotkey

JD-hotkey框架如下图,git地址 https://gitee.com/jd-platform-opensource/hotkey

img

流程介绍:

1)etcd集群 etcd作为一个高性能的配置中心,可以以极小的资源占用,提供高效的监听订阅服务。主要用于存放规则配置,各worker的ip地址,以及探测出的热key、手工添加的热key等。

2)client端jar包 就是在服务中添加的引用jar,引入后,就可以以便捷的方式去判断某key是否热key。同时,该jar完成了key上报、监听etcd里的rule变化、worker信息变化、热key变化,对热key进行本地caffeine缓存等。

3) worker端集群 worker端是一个独立部署的Java程序,启动后会连接etcd,并定期上报自己的ip信息,供client端获取地址并进行长连接。之后,主要就是对各个client发来的待测key进行累加计算,当达到etcd里设定的rule阈值后,将热key推送到各个client。

4) dashboard控制台 控制台是一个带可视化界面的Java程序,也是连接到etcd,之后在控制台设置各个APP的key规则,譬如2秒20次算热。然后当worker探测出来热key后,会将key发往etcd,dashboard也会监听热key信息,进行入库保存记录。同时,dashboard也可以手工添加、删除热key,供各个client端监听。

下面几篇文章是作者写的,对于框架理解很有意义。

京东开源热key探测(JD-hotkey)中间件单机qps 2万提升至35万实录

京东毫秒级热key探测框架设计与实践,已实战于618大促

从性能上来说,明显的可以看出开源框架JD-hotkey很优秀,只是第一个方案可以自定义开发,开源框架JD-hotkey就只能使用了。

补充

etcd简介

etcd 这个名字由两部分组成: etc 和 d ,即 UNIX/Linux操作系统的“/etc” 目录和分布式( distributed )首字母的“d ” 。我们都知道,/etc目录一般用于存 储 UNIX/Linux 操作系统的配置信息 因此etc和d合起来就是一个分布式的/etc 目录。etcd 的寓意是为大规模分布式系统存储配置信息。

etcd 的官方定义是一个 Go 语言编写的分布式、高可用 的用于分布式系统重要数据存储的 一致性键值存储 系统,常用于提供可靠的分布式键值( key-value )存储、配置共享和服务发现等 功能。 etcd 具有容错能力,对于n个节点的集群,可以在n-1/2 个节点宕机(其他节点正常) 的情况下仍继续工作。

etcd应用场景

etcd 的定位是通用的一致性 key/value 存储,但也有 服务发现和共享配置 的功能 。 因此,典型的 etcd 应用场景包括但不限于分布式 数据库、服务注册与发现 、 分布式锁 、 分布式消息、队列 、 分布式系统选主等 。 etcd 的定位是通用的一致性 key/value 存储,同时也面向服务注册与发现的应用 场景 。

etcd vs Zookeeper

Zoo Keeper 的主要优势是其具有成熟、健壮以及丰 富 的特性,然而,它也 有自己的缺点,具体如下:

与 ZooKeeper 相比,ETCD更简单,安 装、部署和使用更加容易,并且 etcd 的某些功能是 ZooKeeper 所没有的,比如:

最后,etcd作为一个年轻的项目,正在高速迭代和开发中,这既是一个优点,也是一个缺点。优点在于它的未来具有无限的可能性,缺点是版本的迭代导致其使用的可靠性无法保证,无法得到大项目长时间使用的检验。然而,目前CoreOS、Kubernetes和Cloudfoundry等知名项目均在生产环境中使用了etcd,所以总的来说,etcd值得你去尝试。

JD-hotkey 为什么用etcd,而不是zookeeper

etcd里面具备一个过期删除的功能,你可以设置一个key几秒过期,etcd会自动删除它,删除时还会给所有监听的client回调,这个功能在框架里是在用的,别的配置中心没有这个功能。

etcd的性能和稳定性、低负载等各项指标非常优异,完全满足我们的需求。而zk在很多暴涨流量前和高负载下,并不是那么稳定,性能也差的远。

上一篇 下一篇

猜你喜欢

热点阅读