浅析Redis的BigKey(阿里巴巴技术协会ATA同步发送)

浅析Redis的BigKey(阿里巴巴技术协会ATA同步发送),第1张

在完成事件接入的需求时,我们需要记录上一个批次拉取的事件,并与当前拉取到的事件做出比对,从而进行差分。我们目前的做法是使用redis来进行缓存:将上一个批次拉取到的事件缓存到一个list中。但是当事件数量过多时,value的大小会超过1M的限制,直接抛出异常。这其实是Tair出于性能的考虑而做出的限制,本文将谈谈我个人对于bigKey的理解。

顾名思义,bigKey指一个key对应的value占据的内存空间相对比较大,bigKey通常会有两种表现形式:

bigKey一旦产生,将会对tair的性能以及稳定性造成较大的影响,下面我将详细介绍一下bigKey的危害。

bigKey给tair带来的危害是多方面的,性能下降只是其中的一方面,极端情况下,bigKey甚至会导致缓存服务崩溃。下面我将从几个角度进行分析。

我们可以看到:

另外,在Redis执行异步重写操作时(bgrewriteaof),主线程会fork出一个子进程来执行重写命令,这个子进程会与主线程共享内存。当主线程收到了新增或者修改一个key的命令,主线程会申请一块额外的内存空间来保存数据。但如果这个key是一个bigKey时,主线程会去申请一块更大空间,同样会阻塞主线程(与JVM分配内存一样,涉及锁和同步)。如果申请不到足够的空间,会导致Swap甚至会有OOM的风险,这同样会降低Redis的性能和稳定性。

Tair中一个key最大为1M,我们就以1M举例,当访问这个key的QPS为1000时,每秒将会有1GB左右的流量,对于带宽来说将是一个较大压力。如果这个bigKey是一个热点key时,后果将不堪设想。

如果主从同步的 client-output-buffer-limit 设置过小,并且 master 存在大量bigKey(数据量很大),主从全量同步时可能会导致 buffer 溢出,溢出后主从全量同步就会失败。如果主从集群配置了哨兵,那么哨兵会让 slave 继续向 master 发起全量同步请求,然后 buffer 又溢出同步失败,如此反复,会形成复制风暴,这会浪费 master 大量的 CPU、内存、带宽资源,也会让 master 产生阻塞的风险。 另外,当我们使用Redis Cluster时,由于Redis Cluster采用了同步迁移的方式,bigKey同样会阻塞主线程。这里提一下Codis,Codis在迁移bigKey时,使用了异步迁移 + 指令拆分的方式,对于bigKey (集合类型) 中每个元素,用一条指令进行迁移,而不是把整个 bigKey 进行序列化后再整体传输。这种化整为零的方式,就避免了 bigKey 迁移时,因为要序列化大量数据而阻塞的问题。

当我们写入或者读取大量bigKey的时候,很有可能导致输入/输出缓冲区溢出。如果客户端占用的内存总量超过了服务器设置的maxmemory时(默认4GB),将会直接触发服务器的内存淘汰策略,如果有数据被淘汰,再要获取这些数据就需要到后端回源,间接降低了缓存系统的性能。同时,淘汰的如果是bigKey也同样会阻塞主线程。另外,在极端情况下,多个客户端占用了过多的内存将导致OOM,进而使得整个redis进程崩溃。

使用切片集群的时候,我们通常会将不同的key存放在不同的实例上,如果存在bigKey的话,会导致相应实例的数据量增大,内存压力也相应增大。

常用的做法是通过./redis-cli --bigkeys命令对整个redis中的键值对进行统计,输出每种数据类型中最大的 bigkey 的信息。一般会配合-i参数一起使用,控制扫描间隔,避免长时间扫描降低 Redis 实例的性能。另外该命令不要在业务高峰期使用。

或者我们可以通过debug object key 命令去查看serializedlength属性,serializedlength表示key对应的value序列化后的字节数,通过观察serializedlength的大小可以辅助排查bigKey。使用scan + debug object key命令,我们可以计算其中每个key的serializedlength,进而发现其中的bigKey,并做好相应的监控和处理。不过对于集合类型的bigKey,debug object key 命令的执行效率不高,存在阻塞redis的风险。

另外,在读取bigKey的时候,我们尽量不要一次性将全部数据读取出来,而是采用分批的方式进行读取:利用scan命令进行渐进式遍历,将大量数据分批多次读取出来,减小redis的压力,避免阻塞的风险。

同样的,在删除bigKey的时候我们也可以使用scan命令来进行批量删除。如果你是用的redis是4.0之后的版本,则可以利用unlink命令配合lazy free配置(需要手动开启)来进行异步删除,避免主线程阻塞。

阿里云的产品致力于提升运维效率,降低IT成本,令使用者更专注于核心业务发展。

云服务器ECS

一种简单高效,处理能力可弹性伸缩的计算服务。助您快速构建更稳定、安全的应用。提升运维效率,降低IT成本,使您更专注于核心业务创新。

云引擎ACE

一种弹性、分布式的应用托管环境,支持Java、PHP、Python、Node.js等多种语言环境。帮助开发者快速开发和部署服务端应用程序,并简化系统维护工作。搭载了丰富的分布式扩展服务,为应用程序提供强大助力。

弹性伸缩

根据用户的业务需求和策略,自动调整其弹性计算资源的管理服务。其能够在业务增长时自动增加ECS实例,并在业务下降时自动减少ECS实例。 

一种即开即用、稳定可靠、可弹性伸缩的在线数据库服务。基于飞天分布式系统和高性能存储,RDS支持MySQL、SQL Server、PostgreSQL和PPAS(高度兼容Oracle)引擎,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案。

开放结构化数据服务OTS

构建在阿里云飞天分布式系统之上的 NoSQL数据库服务,提供海量结构化数据的存储和实时访问。OTS 以实例和表的形式组织数据,通过数据分片和负载均衡技术,实现规模上的无缝扩展。应用通过调用 OTS API / SDK 或者操作管理控制台来使用 OTS 服务。

开放缓存服务OCS

在线缓存服务,为热点数据的访问提供高速响应。

键值存储KVStore for Redis

兼容开源Redis协议的Key-Value类型在线存储服务。KVStore支持字符串、链表、集合、有序集合、哈希表等多种数据类型,及事务(Transactions)、消息订阅与发布(Pub/Sub)等高级功能。通过内存+硬盘的存储方式,KVStore在提供高速数据读写能力的同时满足数据持久化需求。

数据传输

支持以数据库为核心的结构化存储产品之间的数据传输。 它是一种集数据迁移、数据订阅及数据实时同步于一体的数据传输服务。 数据传输的底层数据流基础设施为阿里双11异地双活基础架构, 为数千下游应用提供实时数据流,已在线上稳定运行3年之久。

对象存储OSS

阿里云对外提供的海量、安全和高可靠的云存储服务。RESTFul API的平台无关性,容量和处理能力的弹性扩展,按实际容量付费真正使您专注于核心业务。

归档存储

作为阿里云数据存储产品体系的重要组成部分,致力于提供低成本、高可靠的数据归档服务,适合于海量数据的长期归档、备份。

消息服务

一种高效、可靠、安全、便捷、可弹性扩展的分布式消息与通知服务。消息服务能够帮助应用开发者在他们应用的分布式组件上自由的传递数据,构建松耦合系统。

CDN

内容分发网络将源站内容分发至全国所有的节点,缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性,解决网络带宽小、用户访问量大、网点分布不均等问题。 负载均衡

对多台云服务器进行流量分发的负载均衡服务。负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。

专有网络VPC

帮助基于阿里云构建出一个隔离的网络环境。可以完全掌控自己的虚拟网络,包括选择自有 IP 地址范围、划分网段、配置路由表和网关等。也可以通过专线/VPN等连接方式将VPC与传统数据中心组成一个按需定制的网络环境,实现应用的平滑迁移上云。

开放数据处理服务ODPS

由阿里云自主研发,提供针对TB/PB级数据、实时性要求不高的分布式处理能力,应用于数据分析、挖掘、商业智能等领域。阿里巴巴的离线数据业务都运行在ODPS上。

采云间DPC

基于开放数据处理服务(ODPS)的DW/BI的工具解决方案。DPC提供全链路的易于上手的数据处理工具,包括ODPS IDE、任务调度、数据分析、报表制作和元数据管理等,可以大大降低用户在数据仓库和商业智能上的实施成本,加快实施进度。天弘基金、高德地图的数据团队基于DPC完成他们的大数据处理需求。

批量计算

一种适用于大规模并行批处理作业的分布式云服务。批量计算可支持海量作业并发规模,系统自动完成资源管理,作业调度和数据加载,并按实际使用量计费。批量计算广泛应用于电影动画渲染,生物数据分析,多媒体转码,金融保险分析等领域。

数据集成

阿里集团对外提供的稳定高效、弹性伸缩的数据同步平台,为阿里云大数据计算引擎(包括ODPS、分析型数据库、OSPS)提供离线(批量)、实时(流式)的数据进出通道。

DDoS防护服务

针对阿里云服务器在遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务,用户可以通过配置高防IP,将攻击流量引流到高防IP,确保源站的稳定可靠。免费为阿里云上客户提供最高5G的DDoS防护能力。

安骑士

阿里云推出的一款免费云服务器安全管理软件,主要提供木马文件查杀、防密码暴力破解、高危漏洞修复等安全防护功能。

阿里绿网

基于深度学习技术及阿里巴巴多年的海量数据支撑, 提供多样化的内容识别服务,能有效帮助用户降低违规风险。

安全网络

一款集安全、加速和个性化负载均衡为一体的网络接入产品。用户通过接入安全网络,可以缓解业务被各种网络攻击造成的影响,提供就近访问的动态加速功能。

DDoS高防IP

针对互联网服务器(包括非阿里云主机)在遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务,用户可以通过配置高防IP,将攻击流量引流到高防IP,确保源站的稳定可靠。

网络安全专家服务

在云盾DDoS高防IP服务的基础上,推出的安全代维托管服务。该服务由阿里云云盾的DDoS专家团队,为企业客户提供私家定制的DDoS防护策略优化、重大活动保障、人工值守等服务,让企业客户在日益严重的DDoS攻击下高枕无忧。

服务器安全托管

为云服务器提供定制化的安全防护策略、木马文件检测和高危漏洞检测与修复工作。当发生安全事件时,阿里云安全团队提供安全事件分析、响应,并进行系统防护策略的优化。

渗透测试服务

针对用户的网站或业务系统,通过模拟黑客攻击的方式,进行专业性的入侵尝试,评估出重大安全漏洞或隐患的增值服务。

态势感知

专为企业安全运维团队打造,结合云主机和全网的威胁情报,利用机器学习,进行安全大数据分析的威胁检测平台。可让客户全面、快速、准确地感知过去、现在、未来的安全威胁。

云监控

一个开放性的监控平台,可实时监控您的站点和服务器,并提供多种告警方式(短信,旺旺,邮件)以保证及时预警,为您的站点和服务器的正常运行保驾护航。

访问控制

一个稳定可靠的集中式访问控制服务。您可以通过访问控制将阿里云资源的访问及管理权限分配给您的企业成员或合作伙伴。 日志服务

针对日志收集、存储、查询和分析的服务。日志服务可收集云服务和应用程序生成的日志数据并编制索引,提供实时查询海量日志的能力。

开放搜索

解决用户结构化数据搜索需求的托管服务,支持数据结构、搜索排序、数据处理自由定制。 开放搜索为您的网站或应用程序提供简单、低成本、稳定、高效的搜索解决方案。

媒体转码

为多媒体数据提供的转码计算服务。它以经济、弹性和高可扩展的音视频转换方法,将多媒体数据转码成适合在PC、TV以及移动终端上播放的格式。

性能测试

全球领先的SaaS性能测试平台,具有强大的分布式压测能力,可模拟海量用户真实的业务场景,让应用性能问题无所遁形。性能测试包含两个版本,Lite版适合于业务场景简单的系统,免费使用;企业版适合于承受大规模压力的系统,同时每月提供免费额度,可以满足大部分企业客户。

移动数据分析

一款移动App数据统计分析产品,提供通用的多维度用户行为分析,支持日志自主分析,助力移动开发者实现基于大数据技术的精细化运营、提升产品质量和体验、增强用户黏性。 阿里云旗下万网域名,连续19年蝉联域名市场NO.1,近1000万个域名在万网注册!除域名外,提供云服务器、云虚拟主机、企业邮箱、建站市场、云解析等服务。2015年7月,阿里云官网与万网网站合二为一,万网旗下的域名、云虚拟主机、企业邮箱和建站市场等业务深度整合到阿里云官网,用户可以网站上完成网络创业的第一步。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/563616.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-01
下一篇2023-07-01

发表评论

登录后才能评论

评论列表(0条)

    保存