Redis相关总结

Redis命令行使用

说明:redis可以根据各个节点的info命令输出的信息来进行节点各项指标的监控,info命令输出信息分为9种,分别是Server(redis服务端信息)、Clients(客户端连接信息)、Memory(内存信息)、Persistence(持久化信息)、Stats(实时监控信息)、Replication(主从复制信息)、CPU(CPU信息)、Cluster(集群信息)、Keyspace(键存储空间信息)。

Info查询方法如下:

1.命令模式 redis-cli -p 7000 -a Abc123 info

2.交互模式 redis-cli -p 7000 –> auth Abc123 -> info

语法:   redis-cli -h 192.168.20.33 -p 6379

用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]]

-h <主机ip>,默认是127.0.0.1

-p <端口>,默认是6379

-a <密码>,如果redis加锁,需要传递密码

--help,显示帮助信息

我们也可以选择输出部分info信息,例如输出clients连接信息,命令如下:

redis-cli -p 7000 -a Abc123 info clients

关于info输出详细信息,参考如下博文:

https://blog.csdn.net/wk2yangyang/article/details/118144855

Redis常见监控指标

1.Redis存活监控(重要)

命令:redis-cli -c -p 7000 -a Abc123 ping | grep -c PONG

redis本地监控agent使用ping,如果指定时间返回PONG表示存活,否则redis不能响应请求,可能阻塞或死亡。当返回值不为1时,redis挂了,告警。

2.连接数监控(重要)

命令:redis-cli -c -p 7000 -a Abc123 info | grep -w "connected_clients"

客户端连接个数:如果连接数过高,影响redis吞吐量。>5000 时告警

命令:在交互模式下 config get maxclients

最大连接数:如果没有设置则默认是1w

命令:redis-cli -c -p 7000 -a Abc123 info | grep -w rejected_connections

拒绝的连接数:redis连接个数达到maxclients限制,拒绝新连接的个数。告警

命令:redis-cli -c -p 7000 -a Abc123 info | grep -w total_connections_received

新创建连接个数:如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题

3.内存监控(重要)

命令:redis-cli -c -p 7000 -a Abc123 info Memory

used_memory_human: 当前内存实际使用量。

used_memory_rss_human:当前进程已分配的内存总量。

used_memory_peak_human: 内存消耗峰值。

maxmemory_human: 最大内存配置为0则不限制最大内存。

ps:如果当前内存使用量(或者内存消耗峰值)占总的内存量的比重很大,则需要查明原因,确定是否需要扩大内存。

4.实时监控信息采集(一般)

命令:redis-cli -c -p 7000 -a Abc123 info Stats

total_commands_processed:监控采集周期内的平均qps

instantaneous_ops_per_sec:redis内部较实时的每秒执行的命令数

通过周期性监控相关指标可以判断当前redis处理能力的变化,如果处理能力下降明显则需要进行问题排查。

5.集群健康状态(重要)

命令:redis-cli -c -p 7000 -a Abc123 cluster info

cluster_state不为OK则告警。

cluster_slots_assigned默认16384slots不等于16384则告警。

cluster_slots_fail检测下线的数据槽slots个数,应该为0. 如果大于0说明集群有slot存在故障。

cluster_known_nodes 节点数当前测试环境为6

慢查询日志

说明:Redis的慢日志查询功能用于记录执行时间超过给定时长的命令,用户可以通过这个功能产生的日志来监视和优化查询速度。

1.预设阀值怎么设置

slowlog-log-slower-than它的单位是微秒,默认值是10000记录所有命令,小于0对所有命令都不记录。不建议slowlog-log-slower-than的值设置为 = 0 或者 < 0

2.慢查询记录存放

slowlog-max-len参数用来指定列表存储的慢日志条数

3.慢查询数据结构

每个慢查询日志有4个属性组成,分别是慢查询日志的标识id、发生时间戳、命令耗时、执行命令和参数、客户端ip,如下:

4.慢查询相关命令

slowlog get [n],获取慢查询日志列表,可指定返回条数
slowlog len,获取慢查询日志列表当前的长度
slowlog reset,清空慢查询日志列表

5.实践优化

        慢査查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检直该时间点是否有对应的慢查询。

        由于慢查询日志是一个先进先出的队列,也就是说如果慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行slowlog get命令将慢查询日志持久化到其他存储中。

参数优化

        1.tcp-keepalive检测连接状态 为0时则不探测

        2.timeout:空闲连接超时关闭时间 为0则不关闭。

        3.vm.overcommit_memory:内核参数,设置为1,解决由于内存不足时 RDB 的持久化失败。(0,默认,智能超发,每次要求分配内存时,内核都会比较请求的空间和空余的空间是否足以分配 1,请求分配内存时,永远假装还有足够的内存 2,不允许超发内存,即允许分配的大小小于)。

        4.确保设置了一定量的swap,最好和内存一样大,否则内核的OOMout-of-memorykiller会干掉Redis进程。

        5. slow-max-le:记录慢查询存长命令时redis会做截断,不会占用大量内存,线上可设置1000以上。

        6. slowing-log- -slower-than:配置建议:由于Redis:采用单线程响应命令,对于高流量的场景,如果命令执行时间在1毫秒以上,那么Redisa最多可支撑QPS不到1000因此对于高QPS场景的 Redis建议设置为1毫秒参数优化。

监控工具

        建议采用类似于CacheCloud 这样的监控工具对redis集群进行监控和告警,并且支持在线扩容的功能。该工具java语言编写,采用mysql数据进行监控数据存储

常见问题

 一、生产系统刚开始运行阶段,系统稳定。但是运行一段时间后,发现部分时间段系统接口响应变慢。查看客户端日志经常会出现这样的错误:

        redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException: Read timed out。

排查思路:

        1、编写脚本,在客户端定时ping服务端(redis服务),持续运行一段后,发现未有丢包的情况,排除网络问题。

        2、查看redis服务端日志,是否有异常情况。

        3、执行slowlog查看慢查询语句查看是否有慢查询导致整体性能的下降,如果有类似于keys这样的命令,需要将命令名称进行更换。

        4、以上都正常,可以尝试关闭主库的持久化,用从库来做持久化,用来提升redis性能。

二、生产环境长时间的运行后,经常会有接口返回数据失败的情况,或者是从监控上发现数据库压力某一时间暴增。查看客户端日志发现这样的错误:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

        从错误日志看,是提示无法获取连接。有两种情况:

        1、客户端的连接池满了,无法创建新的连接

        检查客户端连接最大限制maxActive是否足够

        2、redis服务端连接溢出,无法分配新的连接

            1)检查服务端tcp连接:netstat -nat|grep -i "7001"|wc -l

     2)检查服务端连接是否达到最大值:查看服务端支持的最大连接:CONFIG GET maxclients,

            3)查看当前服务端建立的连接数:connected_clients

           4)通过上述检查后,如果发现redis服务端connected_clients连接数持续过高,经常在最大值徘徊。但是结合客户端配置的最大连接配置maxActive,计算出所有客户端连接占满的情况下最大的连接数也达不到connected_clients的连接数时,

        5)执行client list命令,如果发现大量的client的idle时间特别长(正常的client连接,在持续使用的情况下,是不可能空闲这么长时间,连接长时间空闲,客户端也会关闭连接。)

6)查看redis服务端下面两项配置:

        timeout

        tcp-keepalive

三、突然间服务不能访问,返回错误:

redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

        1、从错误提示,可以看出是向磁盘保存数据失败。引起这个问题的原因一般是内存不足,但是生产环境我们一般都会为系统分配足够的内存运行,而且查看内存情况也显示还有可用内存

       2、查看redis日志,如果发现有这个错误:Can’t save in background: fork: Cannot allocate memory,则修改linux内核参数:vm.overcommit_memory=1

        Ps:redis在保存内存的数据到磁盘时,为了防止主进程假死,会Fork一个子进程来完成这个保存操作。但是这个Fork的子进程会需要分配和主进程相同的内存,这时候就相当于需要的内存double了,如果这时候可用内存不足以分配需要的内存,将会导致Fock子进程失败而无法保存数据到磁盘。

四、优化措施总结

        1、结合实际使用场景,考虑是否需要用到redis的持久化,如果单纯用来做应用层的缓存(在缓存未命中的情况下访问数据库),可以关闭持久化。

        2、缓存模式下,尽量为每块缓存设置时效性,避免冷数据长时间占用资源。

        3、生产环境中尽量避免使用keys操作,由于redis是单线程模式,大量的keys操作会阻塞其他的命令执行。

        4、设置合理的内存回收策略,保证内存可用性的同时能适当的提供缓存的命中率。

        5、提前计算出系统可能会用的内存大小,合理的分配内存。需要注意在开启持久化模式下,需要预留更多的内存提供给Fock的子进程做数据磁盘flush操作。

额外说明

集群启动后对于主节点会默认创建两个连接 ,其中cmd = replconf的连接不会纳入到connected_clients统计中,所以实际连接数会比connected_clients显示的多一个。例子:如果最大连接数设置成5 那么当connected_clients=4 时,新连接就会被拒绝。

集群启动后对于从节点会默认创建两个连接 ,都是cmd=client的连接这两个连接都会纳入到connected_clients中,所以当最大连接数设置成5并且连接达到最大连接时候,connected_clients=5.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值