Redis几个重要的健康指标

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis几个重要的健康指标相关的知识,希望对你有一定的参考价值。

参考技术A 所有指标中最重要的当然是检查redis是否还活着,可以通过命令PING的响应是否是PONG来判断。

连接的客户端数量,可通过命令src/redis-cli info Clients | grep connected_clients得到,这个值跟使用redis的服务的连接池配置关系比较大,所以在监控这个字段的值时需要注意。另外这个值也不能太大,建议不要超过5000,如果太大可能是redis处理太慢,那么需要排除问题找出原因。

另外还有一个拒绝连接数(rejected_connections)也需要关注,这个值理想状态是0。如果大于0,说明创建的连接数超过了maxclients,需要排查原因。是redis连接池配置不合理还是连接这个redis实例的服务过多等。

blocked_clients,一般是执行了list数据类型的BLPOP或者BRPOP命令引起的,可通过命令src/redis-cli info Clients | grep blocked_clients得到,很明显,这个值最好应该为0。

监控redis使用内存的峰值,我们都知道Redis可以通过命令 config set maxmemory 10737418240 设置允许使用的最大内存(强烈建议不要超过20G),为了防止发生swap导致Redis性能骤降,甚至由于使用内存超标导致被系统kill,建议used_memory_peak的值与maxmemory的值有个安全区间,例如1G,那么used_memory_peak的值不能超过9663676416(9G)。另外,我们还可以监控maxmemory不能少于多少G,比如5G。因为我们以前生产环境出过这样的问题,运维不小心把10G配置成了1G,从而导致服务器有足够内存却不能使用的悲剧。

mem_fragmentation_ratio=used_memory_rss/used_memory,这也是一个非常需要关心的指标。如果是redis4.0之前的版本,这个问题除了重启也没什么很好的优化办法。而redis4.0有一个主要特性就是优化内存碎片率问题(Memory de-fragmentation)。在redis.conf配置文件中有介绍即ACTIVE DEFRAGMENTATION:碎片整理允许Redis压缩内存空间,从而回收内存。这个特性默认是关闭的,可以通过命令 CONFIG SET activedefrag yes 热启动这个特性。

另外需要注意的是,当内存使用量(used_memory)很小的时候,这个值参考价值不大。所以,建议used_memory至少1G以上才考虑对内存碎片率进行监控。

keyspace_misses/keyspace_hits这两个指标用来统计缓存的命令率,keyspace_misses指未命中次数,keyspace_hits表示命中次数。keyspace_hits/(keyspace_hits+keyspace_misses)就是缓存命中率。视情况而定,建议0.9以上,即缓存命中率要超过90%。如果缓存命中率过低,那么要排查对缓存的用法是否有问题!

instantaneous_ops_per_sec这个指标表示缓存的OPS,如果业务比较平稳,那么这个值也不会波动很大,不过国内的业务比较特性,如果不是全球化的产品,夜间是基本上没有什么访问量的,所以这个字段的监控要结合自己的具体业务,不同时间段波动范围可能有所不同。

rdb_last_bgsave_status/aof_last_bgrewrite_status,即最近一次或者说最后一次RDB/AOF持久化是否有问题,这两个值都应该是"ok"。

另外,由于redis持久化时会fork子进程,且fork是一个完全阻塞的过程,所以可以监控fork耗时即latest_fork_usec,单位是微妙,如果这个值比较大会影响业务,甚至出现timeout。

如果把Redis当缓存使用,那么建议所有的key都设置了expire属性,通过命令src/redis-cli info Keyspace得到每个db中key的数量和设置了expire属性的key的属性,且expires需要等于keys:

通过命令 slowlog get 得到Redis执行的slowlog集合,理想情况下,slowlog集合应该为空,即没有任何慢日志,不过,有时候由于网络波动等原因造成 set key value 这种命令执行也需要几毫秒,在监控的时候我们需要注意,而不能看到slowlog就想着去优化,简单的set/get可能也会出现在slowlog中。

通过spring actuator监控微服务健康指标

使用Spring Boot搭建微服务框架已经是Java微服务开发的主流场景。微服务监控是微服务运维管理的重要一环。Spring Actuator拥有操作简单,监控指标完善,扩展性好的优点。

参考Spring官方指导文档,梳理了一下在项目中如何使用Spring Actuator。

一、配置依赖

  1. 在pom文件中引入依赖的jar包:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

配套使的spring boot版本是2.1.6.RELEASE。

  1. 在yml中添加actuator管理配置:
management:
  security:
    enabled: false
  endpoints:
    web:
      exposure:
         include: health,metrics
  endpoint:
    health:
      show-details: always

管理接口基本上都是在内部环境调用,简化处理不配置安全认证。

二、微服务健康指标

Actuator默认提供了微服务状态,数据库连接,MQ状态、磁盘占用等指标数据的查看功能。访问方式是服务URL+actuator/health。样例代码的访问地址是:http://localhost:10000/elon/elon-actuator/actuator/health

除了默认支持的健康指标外,还可以根据自己的需要自定义:从HealthIndicator派生自定义指标类,注入到Spring框架。

package com.elon.actuator.service;

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;

/**
 * 自定义健康检查指标
 *
 * @author elon
 * @since 2020-12-13
 */
@Component
public class CustomHealthIndicator implements HealthIndicator 
    @Override
    public Health health() 
        Health.Builder builder = new Health.Builder();
        builder.status(Status.UP);

        /**
         * 搜集所有自定义指标数据,封装到Health中返回
         */
        builder.withDetail("自定义健康指标1", "正常").withDetail("自定义健康指标2", "异常");

        return builder.build();
    


从Web端调用http://localhost:10000/elon/elon-actuator/actuator/health接口时,CustomHealthIndicator的health方法会被调用,可以将搜集的指标数据封装到Health中返回。

调用接口返回的数据如下。可以看到自定义的健康指标数据一同返回了。


    "status": "UP",
    "details": 
        "custom": 
            "status": "UP",
            "details": 
                "自定义健康指标1": "正常",
                "自定义健康指标2": "异常"
            
        ,
        "db": 
            "status": "UP",
            "details": 
                "database": "MySQL",
                "hello": 1
            
        ,
        "diskSpace": 
            "status": "UP",
            "details": 
                "total": 214747312128,
                "free": 129423261696,
                "threshold": 10485760
            
        
    

三、查看微服务度量指标

Actuator除了监控微服务整体的健康状态外,还能看很多细的指标数据。如:内存占用情况、CPU利用率、线程、WEB会话等。

调用http://localhost:10000/elon/elon-actuator/actuator/metrics可以看到能监控哪些度量指标:

"names":["jvm.memory.max","tomcat.threads.busy","jvm.threads.states","jvm.gc.memory.promoted","jvm.memory.used","jvm.gc.max.data.size","jdbc.connections.max","jdbc.connections.min","jvm.memory.committed","system.cpu.count","jvm.buffer.memory.used","tomcat.sessions.created","jvm.threads.daemon","system.cpu.usage","jvm.gc.memory.allocated","tomcat.global.sent","tomcat.sessions.expired","tomcat.global.request.max","jvm.threads.live","jvm.threads.peak","tomcat.global.request","process.uptime","tomcat.sessions.rejected","tomcat.global.received","process.cpu.usage","jvm.classes.loaded","jvm.gc.pause","jvm.classes.unloaded","tomcat.sessions.active.current","tomcat.threads.config.max","tomcat.sessions.alive.max","jvm.gc.live.data.size","log4j2.events","tomcat.global.error","custom.metrics1","custom.metrics2","jvm.buffer.count","tomcat.threads.current","jvm.buffer.total.capacity","tomcat.sessions.active.max","process.start.time"]

查看单个度量指标的值,使用http://localhost:10000/elon/elon-actuator/actuator/metrics/指标项拼接 。例如查看jvm.memory.max的值,调用接口http://localhost:10000/elon/elon-actuator/actuator/metrics/jvm.memory.max

四、自定义微服务度量指标

package com.elon.actuator.service;

import com.google.common.util.concurrent.AtomicDouble;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;

/**
 * 自定义度量指标
 *
 * @author elon
 * @since 2020-12-13
 */
@Component
public class CustomMetrics 
    // 保存自定义度量指标值
    private AtomicDouble value1 = new AtomicDouble(0);
    private AtomicDouble value2 = new AtomicDouble(0);

    public CustomMetrics(MeterRegistry registry) 
        // 注册指标
        registry.gauge("custom.metrics1", value1);
        registry.gauge("custom.metrics2", value2);
    

    public void setValue1(double value1) 
        this.value1.set(value1);
    

    public void setValue2(double value2) 
        this.value2.set(value2);
    


注册完后调用接口http://localhost:10000/elon/elon-actuator/actuator/metrics,可以看到自定义指标已列出:

查看自定义指标值的方式与默认指标一致,都是用URL+指标项名称拼接。

自定义健康指标是在查询时实时收集数据,自定义度量指标是在注册指标时绑定了一个指标值变量(框架提供了多种注册方式,这是其中一种)。

通过测试接口改变了指标值后,再调用查询接口http://localhost:10000/elon/elon-actuator/actuator/metrics/custom.metrics1。可以看到指标值发生了变化。

DEMO代码路径:https://github.com/ylforever/elon-actuator

以上是关于Redis几个重要的健康指标的主要内容,如果未能解决你的问题,请参考以下文章

linux之几个重要性能指标

CPU使用率的几个重要指标

通过spring actuator监控微服务健康指标

redis的几个重要知识点

Redis 复制功能的几个重要方面

「Nosql」Redis小记-内存解析&内存消耗篇