除了上述章节中从 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-lfu
或 allkeys-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.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 配置。此配置因您的远程日志记录服务器提供商而异。