Redis可观测最佳实践,5大关键指标最全解析!

本文涉及的产品
性能测试 PTS,5000VUM额度
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 一文带您了解Redis

什么是Redis

Redis是一种流行的内存键/值数据存储。 Redis以其出色的性能和简单的入门而闻名,已在各个行业中找到了用途,包括:


  • 数据库:尽管可以使用异步磁盘持久性,但Redis可以用持久性来换取速度,而不是传统的基于磁盘的数据库。 Redis提供了丰富的数据原语集和异常丰富的命令列表。
  • 邮件队列:Redis的阻止列表命令和低延迟使其成为邮件代理服务的良好后端。
  • 内存缓存:可配置的密钥收回策略,包括流行的“最近最少使用”策略以及从Redis 4.0开始的“最少经常使用”策略,使Redis成为缓存服务器的绝佳选择。 与传统的缓存不同,Redis还允许持久化磁盘以提高可靠性。

Redis是免费的开放源代码产品。 提供商业支持,以及完全托管的Redis即服务。


Redis被许多高流量的网站和应用程序所采用,例如Twitter,GitHub,Docker,Pinterest,Datadog和Stack Overflow。


关键Redis指标

监视Redis可以帮助您在两个方面发现问题:Redis本身的资源问题以及支持基础架构中其他地方出现的问题。

在本文中,我们详细介绍了以下每个类别中最重要的Redis指标:

  • 性能指标
  • 内存指标
  • 基本活动指标
  • 持续性指标
  • 错误指标


性能指标

除低错误率外,良好的性能是系统运行状况的最佳顶级指标之一。 如内存部分中所述,性能不佳通常是由内存问题引起的。

image.png

告警指标:latency


延迟是对客户端请求和实际服务器响应之间的时间的度量。 跟踪延迟是检测Redis性能变化的最直接方法。 由于Redis具有单线程特性,因此延迟分布中的异常值可能会导致严重的瓶颈。 一个请求的响应时间过长会增加所有后续请求的等待时间。一旦确定延迟是一个问题,就可以采取多种措施来诊断和解决性能问题。

image.png

观测指标:Instantaneous_ops_per_sec

跟踪已处理命令的吞吐量对于诊断Redis实例中高延迟的原因至关重要。 高延迟可能是由许多问题引起的,从积压的命令队列到速度慢的命令,再到网络链路过度使用。 您可以通过测量每秒处理的命令数来进行调查-如果该命令几乎保持不变,则原因不是计算密集型命令。 如果一个或多个慢速命令引起延迟问题,您将看到每秒的命令数量下降或完全停止。与历史规范相比,每秒处理的命令数量下降可能是低命令量或阻塞系统的慢命令的迹象。 低命令量可能是正常现象,或者可能表明上游出现问题。


指标:hit rate

将Redis用作缓存时,监视缓存命中率可以告诉您缓存是否得到有效使用。命中率低意味着客户端正在寻找不再存在的密钥。Redis不直接提供命中率指标。我们仍然可以这样计算:

hit rate = keyspace_hits / (keyspace_hits + keyspace_misses)

高速缓存命中率低可能是由多种因素引起的,包括数据到期和分配给Redis的内存不足(这可能会导致键退出)。 低命中率可能会导致应用程序延迟增加,因为它们必须从较慢的备用资源中获取数据。


内存指标

image.png

观测指标:used_memory

内存使用率是Redis性能的关键组成部分。 如果used_memory超出了可用的系统总内存,则操作系统将开始交换内存的旧/未使用部分。 每个交换的部分都写入磁盘,从而严重影响性能。 从磁盘写入或读取比从内存写入或读取要慢5个数量级(100,000x!)(内存为0.1 µs,磁盘为10 ms)。


您可以将Redis配置为限制在指定的内存量内。 在redis.conf文件中设置maxmemory指令可以直接控制Redis的内存使用情况。 启用maxmemory要求您为Redis配置驱逐策略,以确定释放内存的方式。 在evicted_keys部分中了解有关配置maxmemory-policy指令的更多信息。

image.png

警报指标:mem_fragmentation_ratio

mem_fragmentation_ratio度量标准提供了操作系统(used_memory_rss)所使用的内存与Redis分配的内存(used_memory)的比率。

mem_fragmentation_ratio = used_memory_rss / used_memory

操作系统负责为每个进程分配物理内存。操作系统的虚拟内存管理器处理由内存分配器介导的实际映射。


这是什么意思?如果您的Redis实例的内存占用为1GB,则内存分配器将首先尝试查找连续的内存段来存储数据。如果找不到连续的段,则分配器必须将进程的数据划分为多个段,从而增加内存开销。


跟踪碎片率对于了解Redis实例的性能非常重要。碎片率大于1表示正在发生碎片。比率超过1.5表示碎片过多,您的Redis实例消耗了其请求的物理内存的150%。小于1的碎片率告诉您Redis需要的内存多于系统上可用的内存,这导致交换。交换到磁盘将导致延迟显着增加(请参阅已用内存)。理想情况下,操作系统将在物理内存中分配一个连续的段,其碎片率等于1或更大。


如果服务器的碎片率超过1.5,重新启动Redis实例将允许操作系统恢复以前由于碎片而无法使用的内存。在这种情况下,将警报作为通知可能就足够了。


但是,如果您的Redis服务器的碎片率低于1,则可能需要作为页面发出警报,以便您可以快速增加可用内存或减少内存使用量。


从Redis 4开始,将Redis配置为使用随附的jemalloc副本时,可以使用新的主动碎片整理功能。可以将该工具配置为在碎片达到一定级别时启动,并开始将值复制到连续的内存区域中并释放旧副本,从而减少服务器运行时的碎片。


警报指标:evicted_keys(仅高速缓存)

如果您将Redis用作缓存,则可能需要将其配置为在达到最大内存限制时自动清除密钥。 如果您将Redis用作数据库或队列,则最好将其替换为逐出,在这种情况下,您可以跳过此指标。


跟踪密钥移出很重要,因为Redis会顺序处理每个操作,这意味着逐出大量密钥会导致较低的命中率,从而导致更长的延迟时间。 如果您使用的是TTL,则可能不会希望退出按键。 在这种情况下,如果该指标始终大于零,则您的实例中的延迟可能会增加。 其他大多数不使用TTL的配置最终都会耗尽内存,并开始逐出密钥。 只要您的响应时间是可以接受的,稳定的驱逐率是可以接受的。


您可以使用以下命令配置密钥到期策略:

redis-cli CONFIG SET maxmemory-policy <policy>


其中policy是下列之一:

  • noeviction:当达到内存限制并且用户尝试添加其他键时,返回一个错误
  • volatile-lru:删除具有到期集的密钥中最近最少使用的密钥
  • volatile-ttl:从具有到期集的密钥中删除剩余生存时间最短的密钥
  • volatile-random:从具有到期集的密钥中删除一个随机密钥
  • allkeys-lru:从所有密钥集中删除最近最少使用的密钥
  • allkeys-random:从所有密钥集中删除一个随机密钥
  • volatile-lfu:在Redis 4中添加、删除具有到期集的密钥中最不常用的密钥
  • allkeys-lfu:在Redis 4中添加、从所有密钥集中删除最不常用的密钥

注意:由于性能原因,在使用LRU,TTL或Redis 4(从LUF开始)策略时,Redis实际上不会从整个键空间中进行采样。 Redis首先对密钥空间的一个随机子集进行采样,然后将逐出策略应用于该样本。 通常,较新的(> = 3)版本的Redis采用LRU采样策略,该策略更接近于真实LRU。 LFU策略可以通过设置例如以下内容来调整:设置项目必须经过多少时间才能访问级别降低的项目。 有关更多详细信息,请参见Redis的文档。


观测指标:blocked_clients

Redis提供了许多对列表进行操作的阻止命令。 BLPOP,BRPOP和BRPOPLPUSH分别是命令LPOP,RPOP和RPOPLPUSH的阻塞变体。 当源列表为非空时,命令将按预期执行。 但是,当源列表为空时,阻止命令将等待,直到源被填充或达到超时为止。


等待数据的被阻止客户端的数量增加可能是问题的征兆。 延迟或其他问题可能会阻止源列表的填写。 尽管阻止的客户端本身并不会引起警报,但是,如果您看到此指标始终为非零值,则应进行调查。


基本活动指标

注意:本节包括使用术语“主”和“从”的度量。 除了引用特定的度量标准名称外,本文将其替换为 “primary” 和 “replica"。

image.png

告警指标:connected_clients

由于对Redis的访问通常是由应用程序介导的(用户通常不直接访问数据库),因此在大多数情况下,所连接客户端的数量会有合理的上限和下限。 如果数字超出正常范围,则可能表明存在问题。 如果它太低,则上游连接可能已丢失;如果它太高,则大量并发客户端连接可能会使服务器处理请求的能力不堪重负。


无论如何,客户端连接的最大数量始终是有限的资源-无论是受操作系统,Redis的配置还是网络限制。 监视客户端连接可帮助您确保有足够的可用资源可用于新客户端或管理会话。


告警指标:connected_slaves

如果您的数据库是读取型数据库,则可能是在使用Redis中可用的主副本数据库复制功能。 在这种情况下,监视连接副本的数量是关键。 如果连接的副本数量意外更改,则可能表明主机已关闭或副本实例出现问题。

image.png

注意:在上图中,Redis主数据库将显示其具有两个连接的副本,并且第一个子节点将各自报告它们也具有两个连接的副本。 由于辅助副本未直接连接到Redis主副本,因此它们不包括在连接到主副本的副本计数中。


告警指标:master_last_io_seconds_ago

使用Redis的复制功能时,副本实例会定期使用其主实例进行检入。长时间没有通信可能表明您的主Redis服务器,副本服务器或两者之间存在问题。您还冒着副本提供自上次同步以来可能已更改的旧数据的风险。由于Redis执行同步的方式,因此最小化主副本通信的中断至关重要。当副本在中断后重新连接到主数据库时,它将发送PSYNC命令以尝试仅对中断期间丢失的命令进行部分同步。如果无法做到这一点,则副本将请求完整的SYNC,这将导致主副本立即开始将数据库后台保存到磁盘,同时缓冲收到的所有将修改数据集的新命令。后台保存完成后,数据将与缓冲的命令一起发送到客户端。副本每次执行一次SYNC时,都会导致主实例的延迟显着增加。


值得关注的指标:keyspace

跟踪数据库中键的数量通常是一个好主意。作为内存数据存储,键空间越大,Redis需要更多的物理内存来确保最佳性能。 Redis将继续添加密钥,直到达到最大内存限制为止,此时,Redis开始以新密钥以相同的速率逐出密钥。


如果您将Redis用作缓存,并且看到键空间饱和(如上图所示)以及较低的命中率,则您的客户端可能会请求旧数据或收回的数据。随着时间的推移跟踪您的keyspace_misses数量将有助于您查明原因。


另外,如果您将Redis用作数据库或队列,则可能不建议使用易失性键。随着键空间的增长,如果可能的话,您可能需要考虑在框内添加内存或在主机之间拆分数据集。添加更多的内存是一种简单有效的解决方案。当需要的资源超过一个框所能提供的资源时,可以通过对数据进行分区或分片来组合多台计算机的资源。有了分区计划,Redis可以存储更多密钥而无需逐出或交换。但是,应用分区计划比在几个记忆棒中交换更具挑战性。  


持续性指标

截屏2021-11-26 上午11.13.20.png

启用持久性可能是必要的,尤其是在使用Redis的复制功能的情况下。 由于副本会盲目复制对主实例所做的任何更改,因此,如果要重新启动主实例(无持久性),则与其连接的所有副本都将复制其现在为空的数据集。


如果您将Redis用作缓存或在用例中数据丢失将不那么重要,则可能不需要持久性。


重要监视的指标:rdb_last_save_time和rdb_changes_since_last_save

通常,最好注意数据集的波动性。 如果服务器发生故障,两次写入磁盘之间的时间间隔过长可能会导致数据丢失。 在上次保存时间和故障时间之间对数据集所做的任何更改都将丢失。


监视rdb_changes_since_last_save可让您更深入地了解数据的波动性。 如果您的数据集在该间隔内没有太大变化,则两次写入之间的长时间间隔不成问题。 跟踪两个指标可以使您很好地了解如果在给定的时间点发生故障,您将丢失多少数据。


错误指标

注意:本节包括使用术语“主”和“从”的指标。 除了引用特定的度量标准名称外,本文将其替换为“primary” 和 “replica"。


Redis错误指标可以提醒您异常情况。 以下指标跟踪常见错误:

image.png

主服务器和副本服务器之间的链接断开的时间(以秒为单位)


Resource: Errors


告警指标:rejected_connections

Redis能够处理许多活动连接,默认情况下有10,000个客户端连接可用。 通过更改redis.conf中的maxclient指令,可以将最大连接数设置为其他值。 如果您的Redis实例当前处于最大连接数,则任何新的连接尝试都将断开。

image.png

请注意,您的系统可能不支持您使用maxclient指令请求的连接数。 Redis与内核核对以确定可用文件描述符的数量。 如果可用文件描述符的数量小于maxclient + 32(Redis保留32个文件描述符供自己使用),则将忽略maxclient指令,并使用可用文件描述符的数量。


告警指标:keyspace_misses

每次Redis查找密钥时,只有两种可能的结果:密钥存在,或者密钥不存在。 查找不存在的键会导致keyspace_misses计数器增加。 此度量标准始终为非零值表示客户端正在尝试在数据库中查找不存在的键。 如果未将Redis用作缓存,则keyspace_misses应该为零或接近零。 请注意,对空键调用的任何阻止操作(BLPOP,BRPOP和BRPOPLPUSH)都将导致keyspace_misses递增。


告警指标:master_link_down_since_seconds

仅当主节点及其副本之间的连接丢失时,此指标才可用。 理想情况下,该值应永远不超过零-主数据库和副本数据库应保持持续通信,以确保副本数据库不提供过时的数据。 连接之间的较大时间间隔应得到解决。 请记住,重新连接后,您的主要Redis实例将需要投入资源来更新副本上的数据,这可能会导致延迟增加。


结论

在本文中,我们提到了一些最有用的指标,您可以对其进行监控以在Redis服务器上保留标签。 如果您刚开始使用Redis,那么监视下面的列表中的指标将使您可以很好地了解数据库基础架构的运行状况和性能:


  • Number of commands processed per second
  • Latency
  • Memory fragmentation ratio
  • Evictions
  • Rejected clients

最终,您将认识到与您自己的基础结构和用例特别相关的其他指标。 当然,您要监视的内容将取决于您拥有的工具和可用的指标。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
23天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
49 0
|
7天前
|
机器学习/深度学习 Java API
阿里云文档智能解析——大模型版能力最佳实践与体验评测
阿里云文档智能解析(大模型版)在处理非结构化数据方面表现优异,尤其是在性能和可扩展性上具有明显优势。虽然存在一些待完善之处,但其强大的基础能力和广泛的适用场景使其成为企业数字转型过程中的有力助手。随着技术的不断进步和完善,相信它会在更多领域展现出更大的价值。
28 5
阿里云文档智能解析——大模型版能力最佳实践与体验评测
|
7天前
|
人工智能 自然语言处理 监控
文档解析(大模型版)能力最佳实践测评
文档解析(大模型版)能力最佳实践测评
28 7
|
20天前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
39 1
|
20天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
42 0
|
20天前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
43 0
|
20天前
|
C# 开发者 数据处理
WPF开发者必备秘籍:深度解析数据网格最佳实践,轻松玩转数据展示与编辑大揭秘!
【8月更文挑战第31天】数据网格控件是WPF应用程序中展示和编辑数据的关键组件,提供排序、筛选等功能,显著提升用户体验。本文探讨WPF中数据网格的最佳实践,通过DevExpress DataGrid示例介绍其集成方法,包括添加引用、定义数据模型及XAML配置。通过遵循数据绑定、性能优化、自定义列等最佳实践,可大幅提升数据处理效率和用户体验。
40 0
|
20天前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
44 0
|
20天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
30 0
|
20天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
25 0

推荐镜像

更多