今天是 1024 程序员节,祝各位节日快乐。
这篇文章我们聊聊 Redis 运维实战系列第 8 期--Redis 监控。
Redis 在很多互联网公司都充当着非常核心的角色,因此,监控 Redis 以保证其稳定显得格外重要。这节内容就来聊聊 Redis 的一些常见监控项。
1 连接检测
连接失败检测:当监控组件无法连接到 Redis 实例时,则触发告警。
客户端连接数:执行 info clients 命令获取 connected_clients 就是客户端连接数。
2 变量检测
maxmemory:执行 config get maxmemory 获取配置的最大内存,判断是否有设置或者是否合理。
maxmemory-policy:执行 config get maxmemory-policy 获取配置的最大内存策略。
3 主从复制检测
角色检测:执行 info replication 获取 role,如果 role 有变化则告警。
复制状态检测:在 slave 上执行 info replication 获取 master_link_status,判断主从是否断开,如果为 down,则触发告警。
延迟检测:主节点 info replication 的 master_repl_offset 和 slave0 字段的 offset 指标的差值,就是主从节点延迟的字节量,如下图:
实例 master_repl_offset 和 slave0 字段的 offset 指标一样,因此主从没延迟。
从库是否设置只读:在 slave 上执行 info replication 获取 slave_read_only,该值默认为 1,表示从库默认只读,如果关闭只读,则告警。
4 吞吐量监控
执行完 info stats 命令后,可以找出以下关于吞吐量的监控项:
total_commands_processed:从 Redis 启动以来总计处理的命令数,可以通过前后两次监控组件获取的差值除以时间差,以得到 QPS。
instantaneous_ops_per_sec:当前 Redis 实例的 OPS。
total_net_input_bytes:网络总入量。
total_net_output_bytes:网络总出量。
instantaneous_input_kbps:每秒输入量,单位是kb/s
instantaneous_output_kbps:每秒输出量,单位是kb/s
5 内存监控
内存使用率,其计算方法为:used_memory/maxmemory,可设置内存使用率超过 80% 则告警。
used_memory 通过 info memory 获取,表示 Redis 真实使用的内存 ; maxmemory 通过 config get maxmemory 获取。
内存碎片率,其计算方法为:used_memory_rss/used_memory。大于 1 表示有内存碎片,越大表示越多;小于 1 表示正在使用虚拟内存,虚拟内存其实就是硬盘,性能会下降很多。一般内存碎片率在 1 - 1.5 之间比较健康。
两个参数均通过 info memory 获取; used_memory_rss 表示进程实际使用的物理内存大小。
缓存命中率,其计算方法为:HitRate = keyspace_hits / (keyspace_hits keyspace_misses) ,缓存命中率低于 90% 则告警。
两个参数均通过 info stats 获取; keyspace_hits 表示 Redis 请求键被命中的次数 keyspace_misses 表示 Redis 请求键未被命中的次数
6 持久化监控
持久化可以防止数据丢失,因此对于持久化的监控,也是比较重要的。这里聊聊几个和持久化相关的监控项(相关参数均为执行完 info Persistence 的结果):
上一次 RDB 持久化状态:可以看 rdb_last_bgsave_status 的结果,如果持久化未成功,则告警。
上一次 RDB 持久化的持续时间:可以看 rdb_last_bgsave_time_sec 的结果,如果超过某个时间,则告警。
查看 AOF 文件大小:可以看 aof_current_size 的结果,如果过大,可以考虑手动触发一次 bgrewriteaof。
7 key 监控
key 数量:执行 keyspace 可以看到每个 DB 的 key 数量,对其进行监控,如果超过某个数量,则告警提示。
大 key:参考:Redis 运维实战 第06期:Bigkey
热 key:参考:Redis 运维实战 第07期:Hotkey
8 慢查询监控
因为 Redis 单线程特性,慢查询会导致其他命令阻塞,从而导致客户端出现请求超时,因此对于慢查询监控也不能少。
慢查询涉及两个参数
- slowlog-log-slower-than:执行时间(微秒)超过了多少后,会记录在慢查询中,默认 10000 微秒
- slowlog-max-len:慢日志的长度,当慢查询日志达到最大条数时,如果有新的慢查询,会移除最大的慢查询。
读取慢查询,可以执行 slowlog get 命令,表示显示所有的慢查询,如果执行 slowlog get 1,则表示只显示最新的一条慢查询,其输出内容如下:
每个字段解释如下: 1)唯一日志标识符 2)命令执行的时间戳 3)执行时间,单位:微妙 4)执行的命令 5)客户端 IP 和端口(4.0 及以上版本) 6)客户端名称(4.0 及以上版本)
因此对于慢查询的监控,可以每次获取最新慢查询的唯一日志标识符,如果跟上一次获取的值对比,变大了,则触发告警,提示我们有慢查询。
9 集群监控
从 cluster info 命令中可以获取集群的状态,可以对下面几项进行监控:
cluster_state 如果等于 fail,则触发告警,表示集群不能正常相应请求。
cluster_slots_fail 表示哈希槽状态为 fail 的数量,如果大于 0,则触发告警,此时可能集群节点无法提供查询服务。
cluster_known_nodes 表示集群中节点数量,如果突然减少,则触发告警。
专栏《Redis 运维实战》系列文章推荐
Redis 运维实战 第01期:Redis 复制
Redis 运维实战 第02期:Redis Cluster
Redis 运维实战 第03期:Codis
Redis 运维实战 第04期:AOF 持久化
Redis 运维实战 第05期:RDB 持久化
Redis 运维实战 第06期:Bigkey
Redis 运维实战 第07期:Hotkey