Redis 4.x系列(二十二):Redis 健康检查与慢速日志

  Redis 服务上线后,难免会出现故障需要诊断修复。

  服务器日常运维需要进行健康检查,日常的健康检查可以在故障发现之前给运维管理人员提前预警,可以了解发生了什么,服务器的各项指标情况;可以使用SLOWLOG命令来识别慢速命令或慢操作等。当产生故障时就是到了最糟糕的情况。

IFNO 健康检查

通过监控指标统计信息来检查和识别 Redis 的检康状态,了解服务器发生了什么,正在发生什么或者什么可能是问题出现的根源。

Redis 自身提供了INFO命令来检查和统计服务各项信息状态,info命令的详细使用可参考INFO 命令官方文档

INFO

使用** INFO 命令来获取不同维度的指标和统计数据,包括info, info stats, info clients, info persistence**等项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#统计信息
127.0.0.1:6379> info stats
# Stats
total_connections_received:12 //接受的总连接数。若在短时间内快速增长,可能会出现 CPU 使用率过高的问题。
total_commands_processed:237893
instantaneous_ops_per_sec:0 //每秒处理的命令数
total_net_input_bytes:10995404
total_net_output_bytes:1252200
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0 //因 maxclients 的限制而拒绝的连接,该指标若增加,需注意内存使用情况。
sync_full:0 //从实例与主实例完全同步的次数
sync_partial_ok:0 //完成部分同步的次数
sync_partial_err:0 //部分同步未能完成的次数
expired_keys:2636
expired_stale_perc:0.02
expired_time_cap_reached_count:0
evicted_keys:0 //由于 maxmemory 限制而被淘汰的键的数量
keyspace_hits:76814
keyspace_misses:134328 //查找键失败,若指标态高,可考虑优化程序来降低未命中键的查询的数量
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0 //上一次fork操作耗费的时间,单位:微秒
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

#客户端
127.0.0.1:6379> info clients
# Clients
connected_clients:8
client_longest_output_list:0 //当前客户端连接中最长的输出列表。当指标的值超过 10万时,需要特别关注。
client_biggest_input_buf:0 //当前客户端连接中最大的输入缓冲区。当大小超过 10M 时,需要特别关注。
blocked_clients:0 //被一个阻塞调用(BLPOP, BRPOP, BRPOPLPUSH)挂起的客户端数量。

#持久化
127.0.0.1:6379> info persistence
# Persistence
loading:0
rdb_changes_since_last_save:157033
rdb_bgsave_in_progress:0
rdb_last_save_time:1545321601
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0 //RDB cow(copy-on-write:写时复制)重写时分配的内存
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0 //AOF cow(copy-on-write:写时复制)重写时分配的内存
aof_current_size:9618995
aof_base_size:8658372
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

#内存
127.0.0.1:6379> info memory
# Memory
used_memory:7117376
used_memory_human:6.79M
used_memory_rss:10420224
used_memory_rss_human:9.94M
used_memory_peak:7162512
used_memory_peak_human:6.83M
used_memory_peak_perc:99.37%
used_memory_overhead:2259708
used_memory_startup:786576
used_memory_dataset:4857668
used_memory_dataset_perc:76.73%
total_system_memory:8371286016
total_system_memory_human:7.80G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:2147483648
maxmemory_human:2.00G
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.46
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0

还需要关注磁盘使用情况,如果磁盘空间已满,则无法保存 RDB 文件和 AOF 追求数据。

redis-cli –stat

使用 redis-cli --stat来持续监控 Redis 的基本统计数据
实时地输出基本的服务器指标,可以对内存使用情况、连接的客户端等有一个大致的了解。默认每秒种打印一次;也可使用 -i <interval>来指定输出间隔时间。

1
2
3
4
5
6
[root@192 6379]# ./redis-cli -a 123456 --stat        
Warning: Using a password with '-a' option on the command line interface may not be safe.
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
26084 6.79M 8 0 239132 (+0) 17
26085 6.79M 8 0 239138 (+6) 17

SLOWLOG 慢速日志

Redis 提供了 SLOWLOG 功能来识别慢速命令或慢操作。

Redis Slow Log是一个记录超过指定执行时间的查询的系统。 执行时间不包括I/O操作,如与客户端交互,发送回复等等,而只是实际执行命令所需的时间(这是命令执行的唯一阶段,其中线程被阻止并且可以在此期间不提供其他请求)。
因此,可能在应用端发现延迟增加甚至超时,但在 Reids 慢日志中却找不到记录,这可能是其它诸如网络延迟增加等因素造成的。

在 Redis 配置文件 redis.conf 中,有两个参数可配置慢速命令日志;

  1. slowlog-log-slower-than 10000
    设置命令执行时间,以微秒为单位,以便记录命令;默认是值是 10000(10 毫秒);1000000 相当于 1 秒。负数会禁用慢速命令日志,值为零则会强制记录每个命令。
  2. slowlog-max-len 128
    记录慢速命令的最大数量,慢速命令记录被压入一个先进先出的队列,该配置相当于队列的大小,默认 128。记录新命令时,将从记录的命令队列中删除最旧的命令。
  3. 或在服务器运行时可通过 CONFIGCONFIG SET命令来完成。
    1
    2
    127.0.0.1:6379> config set slowlog-log-slower-than 10000
    OK
  4. 获取所有慢日志或获取指定条数的慢日志
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    127.0.0.1:6379> slowlog get 3
    1) 1) (integer) 9 //慢日志记录唯一标识
    2) (integer) 1545495881 //所记录命令被处理时的 unix 时间戳
    3) (integer) 9 //执行命令所需的时间,单位:微秒
    4) 1) "hmset" //命令和参数组成的数组
    2) "new_hash"
    3) "aa"
    4) "bb"
    5) "cc"
    6) "dd"
    7) "ee"
    8) "ff"
    5) "127.0.0.1:60552" //客户端IP和端口(4.0新增)
    6) "" //客户端名称,如果有通过 CLIENT SETNAME 设置客户端的名称(4.0新增)
    2) 1) (integer) 8
    2) (integer) 1545495863
    3) (integer) 23
    4) 1) "keys"
    2) "*"
    5) "127.0.0.1:60552"
    6) ""
    3) 1) (integer) 7
    2) (integer) 1545495850
    3) (integer) 6
    4) 1) "set"
    2) "foo"
    3) "bar"
    5) "127.0.0.1:60552"
    6) ""

    127.0.0.1:6379> slowlog get 3 //获取最近的3条
    每一条慢日志记录由六个字段组成(4.0之前的版本是四个字段。)
  5. 获取慢日志的数量
    1
    2
    127.0.0.1:6379> slowlog len
    (integer) 6
  6. 清除所有记录
    1
    2
    3
    4
    127.0.0.1:6379> slowlog reset
    OK
    127.0.0.1:6379> slowlog len
    (integer) 0

慢日志只记录在内存中,且不会持久化,因此慢日志机制的速度非常快。

相关参考:
Getting the Redis metrics you need(收集需要的 Redis 指标)

Redis 4.x系列(二十二):Redis 健康检查与慢速日志

http://blog.gxitsky.com/2018/12/22/Redis-22-trouble-health-check-slowlog/

作者

光星

发布于

2018-12-22

更新于

2022-08-14

许可协议

评论