学习

除了上述章节中从 info、memory 和延迟框架数据点获取的指标外,在排除故障时,您可能还需要从其他来源提取数据。

可用性#

Redis 服务器在正常运行时将响应 PING 命令:

$ redis-cli -h redis.example.com -p 6379 PING
PONG

慢日志#

Redis 慢日志是一个用于记录超过特定执行时间(不包括客户端通信等 I/O 操作)的查询的系统。它默认启用,有两个配置参数。

slowlog-log-slower-than 1000000

这表示如果执行时间超过指定微秒时间(本例中为一秒),则会记录日志。可以使用值 -1 禁用慢日志。也可以将值设置为 0,以便记录每个命令。

slowlog-max-len 128

这设置了慢日志的长度。当记录新命令时,最旧的命令将从队列中删除。

这些值也可以使用 CONFIG SET 命令在运行时更改。

您可以使用 LEN 子命令查看慢日志的当前条目数。

redis.cloud:6379> slowlog len
(integer) 11

可以使用 GET 子命令从慢日志中拉取条目。

redis.cloud:6379> slowlog get 2
1) 1) (integer) 10
   2) (integer) 1616372606
   3) (integer) 600406
   4) 1) "debug"
      2) "sleep"
      3) ".6"
   5) "172.17.0.1:60546"
   6) ""
2) 1) (integer) 9
   2) (integer) 1616372602
   3) (integer) 600565
   4) 1) "debug"
      2) "sleep"
      3) ".6"
   5) "172.17.0.1:60546"
   6) ""

可以使用 RESET 子命令重置慢日志。

redis.cloud:6379> slowlog reset
OK
redis.cloud:6379> slowlog len
(integer) 0

扫描键#

有一些选项可以传递给 redis-cli,这些选项会触发键空间分析。它们使用 SCAN 命令,因此运行它们应该是安全的,不会影响操作。您可以在它们的输出中看到,如果需要,还有一个限制选项。

键统计 (--keystats): 此选项将根据内存大小和长度扫描数据集中的键。

您可以使用 --keystats--keystats-samples <n> 选项来实现此目的。

$ redis-cli --keystats

# Scanning the entire keyspace to find biggest keys and distribution information.
# Use -i 0.1 to sleep 0.1 sec per 100 SCAN commands (not usually needed).
# Use --cursor <n> to start the scan at the cursor <n> (usually after a Ctrl-C).
# Use --top <n> to display <n> top key sizes (default is 10).
# Ctrl-C to stop the scan.

100.00% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Keys sampled: 12
Keys size:    46.54K

--- Top 10 key sizes ---
  1    3.90K hash       "semantic-router:politics:64496d36ea3d10f4db5bb19578f8054c90b9a33a5ac7c7be7bc8f06f88bf990d"
  2    3.89K hash       "semantic-router:politics:672bd5232ae0cb6810db3a2c4590c393218d3b076313de7d0a96ccda010f31ef"
  3    3.88K hash       "semantic-router:pii:eb77e2b656d59aea1a3dc26fc7f7c6e577582d9e994ab2ccad1314ca4cea563f"
  4    3.88K hash       "semantic-router:aliens:8c6816d6115e047adca17426bea8a97977fe996cea14481bf9f549a44fcda74e"
  5    3.88K hash       "semantic-router:aliens:d54a060930a7de006034fb28ccc87bf9041a7c158760488e4b090fead22d1867"
  6    3.88K hash       "semantic-router:politics:c90afab0bd6f175342c30ada4d798657d4fc2cd3da6bb1404b20964d6ff9ca7d"
  7    3.88K hash       "semantic-router:politics:9cdcdcece82858b7627605ed81b68f115aa8cd7fbc2dac5b5f7e0f01b4c3573b"
  8    3.88K hash       "semantic-router:pii:9140b5958f790a6bdec0e1c4b342fe2620f28ef18dac4540080f157bc0a78e0b"
  9    3.88K hash       "semantic-router:pii:0299c9bbf9476c4f9667e2ceb6af59e7db8afce4803fb9566593b3263d317cae"
 10    3.87K hash       "semantic-router:pii:b1fdc8e3cd61a3a89055969a5c76f12d02e85a7f7be0976867f0df7135351355"

--- Top size per type ---
hash       semantic-router:politics:64496d36ea3d10f4db5bb19578f8054c90b9a33a5ac7c7be7bc8f06f88bf990d is 3.90K

--- Top length and cardinality per type ---
hash       semantic-router:politics:672bd5232ae0cb6810db3a2c4590c393218d3b076313de7d0a96ccda010f31ef has 3 fields

Key size Percentile Total keys
-------- ---------- -----------
   3.86K    0.0000%           2
   3.88K   50.0000%          10
   3.89K   87.5000%          11
   3.90K  100.0000%          12
Note: 0.01% size precision, Mean: 3.88K, StdDeviation: 11B

Key name length Percentile Total keys
--------------- ---------- -----------
            89B  100.0000%          12
Total key length is 1.02K (86B avg)

Type        Total keys  Keys % Tot size Avg size  Total length/card Avg ln/card
--------- ------------ ------- -------- -------- ------------------ -----------
hash                12 100.00%   46.54K    3.88K          36 fields        3.00

大键 (--bigkeys): 此选项将扫描数据集查找大键,并提供相关信息。

内存键 (--memkeys): 与大键类似,内存键会查找最大的键,同时报告平均大小。

--keystats 之前(Redis 7.4.0 之前),您需要结合使用 --bigkeys--memkeys 来实现相同的功能。

热键 (--hotkeys): 热键扫描仅在 maxmemory-policy 设置为 volatile-lfuallkeys-lfu 时可用。如果您需要识别热键,可以将此参数添加到 redis-cli

$ redis-cli --hotkeys

# Scanning the entire keyspace to find hot keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Hot key '"key:__rand_int__"' found so far with counter 37

-------- summary -------

Sampled 5 keys in the keyspace!
hot key found with counter: 37  keyname: "key:__rand_int__"

Monitor: MONITOR 命令允许您查看针对您的 Redis 实例运行的每个命令流。

127.0.0.1:6379 > monitor
OK
1616541192.039933 [0 127.0.0.1:57070] "PING"
1616541276.052331 [0 127.0.0.1:57098] "set" "user:2398423hu" "KutMo"
注意

由于 MONITOR 会流式传输所有命令,因此使用它会带来性能开销。已知它会降低性能高达 50%,请谨慎使用!

设置和使用 Redis 日志文件#

Redis 日志文件是您需要了解的另一个重要日志。它包含用于排查配置和部署错误的有用信息。如果您不配置 Redis 日志记录,故障排除将变得困难得多。

Redis 有四种日志记录级别,您可以在 redis.conf 文件中直接配置。

日志级别

  • WARNING
  • NOTICE
  • VERBOSE
  • DEBUG

Redis 还支持通过 syslog 将日志文件发送到远程日志记录服务器。

远程日志记录对许多安全专业人士很重要。这些远程日志记录服务器经常用于监控安全事件和管理事件。这些集中式日志服务器执行三个常见功能:确保日志文件的完整性,确保日志保留特定时间段,并将日志与其他系统日志关联起来,以发现对基础设施的潜在攻击。

让我们在 Redis 部署中设置日志记录。首先,我们将打开 redis.conf 文件

$ sudo vi /etc/redis/redis.conf

 redis.conf 文件有一个专门用于日志记录的整个部分。

首先,在 redis.conf 文件中找到 logfile 指令。这将允许您定义日志记录目录。对于本例,我们使用 /var/log/redis/redis.log

如果您想使用远程日志记录服务器,则需要取消注释 syslog-enabled、 syslog-ident 和 syslog-facility 行,并确保将 syslog-enabled 设置为 yes。

接下来,我们将重启 Redis 服务器。

您应该看到指示 Redis 正在启动的日志事件。

$ sudo tail -f /var/log/redis/redis.log

接下来,让我们检查是否已正确写入 syslog。您应该看到这些相同的日志。

$ less /var/log/syslog | grep redis

最后,您需要将日志发送到远程日志记录服务器,以确保日志将备份到该服务器。为此,您还需要修改 rsyslog 配置。此配置因您的远程日志记录服务器提供商而异。