摘要

遇到一个老大难的问题.
让帮忙分析一下一个Redis的dump文件.
虽然之前写过了rdb和rdr的文档
但是感觉大家都喜欢拿来主义.
没办法. 今天继续进行深入一点的分析.
原理其实还是基于rdb的. 不过多思考了一点别的内容.

分析原始文件

rdb -c memory redisdump.rdb -f redis_20221216_ZJ.txt
# 这个命令很费内存和CPU, 会导致较长的时间占用
rdr show -p 8888 redisdump.rdb
# 这个命令是打开一个浏览器窗口进行展示.

分析info日志

上面两个命令的时间都极为漫长, 所以可以先看一下现场发回来的info信息
# 第一部分持久化相关的分析
# 参数含义
rdb_changes_since_last_save:表示最近一次成功生成rdb文件时写入的命令个数。
rdb_bgsave_in_progress:表示服务器是否正在创建rdb文件。
rdb_last_save_time:表示最近一次成功生成rdb文件的时间戳。
rdb_last_bgsave_status:标识最近一次rdb持久化是否成功。
rdb_last_bgsave_time_sec:表示最近一次成功生成rdb文件消耗的时间。
rdb_current_bgsave_time_sec:表示当前服务器正在创建rdb文件的操作已经消耗的时间
rdb_last_cow_size:表示RDB过程中父进程与子进程比较执行了多少修改操作。

From https://weibo.com/ttarticle/p/show?id=2309404650615585505652

分析info日志

# 内存设置相关
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction

未设置最高内存限制,容易搞出问题感觉.
used_memory_human:7.33G
used_memory_rss_human:9.49G

分析rdb转储的key信息文件

# 第一步: 
分析前导key的信息以及进行排序
注意 此为一条命令. 承接rdb 分析的 dump文件的结果.
cat redis_20221216_ZJ.txt |awk -F "," '{print $3}'
|awk -F ":" '{print $1}'|sort |uniq -c |
sort -k1hr >redis_keys_01.txt

将key前缀从大到小进行排列并且转储到 redis_keys_01.txt 目录中.

# 第二步:
分析dump里面key值的过期时间信息, 并且逆序排序
cat redis_20221216_ZJ.txt |awk -F "," '{print $NF,$3}' |sort -k1hr
> redis_expire.txt
注意 最前面的一部分 是没有过期时间的key
expiry key 进行分割. 后面的key 都是根据时间时间由早到晚排列

其实 info里面没有配置 maxmemory 也没有设置 memory_policy 这么查没意义.
过期和不过期的key 都存在于redis-server的进程里面.

在线监控Redis执行的命令 60秒钟

# 注意timeout命令会监控60秒的时间. 然后写入到对应的文件中
# 可以作为简单进行性能判断的依旧.
# grafana的抽象频率太低了可能会导致误判. 但是monitor会出现严重的性能损耗.
# 酌情使用
# 不给钱 用坏了是我是不会赔的.
time timeout 60 redis-cli -p 6377 monitor >20221216_6377.txt
time timeout 60 redis-cli -p 6378 monitor >20221216_6378.txt
time timeout 60 redis-cli -p 6379 monitor >20221216_6379.txt