Redis4.x(二十二):健康检查与慢速日志

star2017 1年前 ⋅ 716 阅读

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

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

IFNO 健康检查

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

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

INFO

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

#统计信息
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>来指定输出间隔时间。

[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命令来完成。

    127.0.0.1:6379> config set slowlog-log-slower-than 10000
    OK
    
  4. 获取所有慢日志或获取指定条数的慢日志

    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. 获取慢日志的数量

    127.0.0.1:6379> slowlog len
    (integer) 6
    
  6. 清除所有记录

    127.0.0.1:6379> slowlog reset
    OK
    127.0.0.1:6379> slowlog len
    (integer) 0
    

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

相关参考

Getting the Redis metrics you need(收集需要的 Redis 指标)

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: