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 中,有两个参数可配置慢速命令日志;
slowlog-log-slower-than 10000 设置命令执行时间,以微秒为单位,以便记录命令;默认是值是 10000(10 毫秒);1000000 相当于 1 秒。负数会禁用慢速命令日志,值为零则会强制记录每个命令。
slowlog-max-len 128 记录慢速命令的最大数量,慢速命令记录被压入一个先进先出的队列,该配置相当于队列的大小,默认 128。记录新命令时,将从记录的命令队列中删除最旧的命令。
或在服务器运行时可通过 CONFIG 和CONFIG SET 命令来完成。 1 2 127.0.0.1:6379> config set slowlog-log-slower-than 10000 OK
获取所有慢日志或获取指定条数的慢日志 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之前的版本是四个字段。)
获取慢日志的数量 1 2 127.0.0.1:6379> slowlog len (integer) 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 指标)