Redis 中文文档 Redis 中文文档
指南
redis.io (opens new window)
指南
redis.io (opens new window)
  • 关于
    • Redis 开源治理
    • Redis 发布周期
    • Redis 赞助商
  • 入门
  • 数据类型
  • Redis Stack
  • 命令
  • 手册

redis-tool


Redis Cluster Daily Maintenance Tool/Redis集群日常运维工具

工具简介


redis-tool基于原生的redis-cli客户端工具来进行Redis集群的监控、配置、问题分析等运维管理,能够极大降低Redis cluster集群的运维成本。同时作为脚本化工具,下载即可用,即使对于Redis初学者,也能够快速掌握集群的运行状况,完成集群配置管理、性能问题排查,具备Redis集群的基本运维能力。

工具主要面向日常运维管理中的常见工作,提升运维效率,简化操作复杂度:

集群监控:能够获取集群节点的键值数、内存使用量、CPU使用率、客户端连接数、请求响应时延等信息,以表格形式输出,并给出异常告警提示
配置管理:可以按节点属性来统一查询或修改运行参数,并且支持对节点运行参数进行差异对比分析
问题分析:具备慢命令日志查询、热点key分析、TOP命令跟踪、KEY前缀统计等问题分析能力

安装部署


redis-tool工具使用shell脚本实现,下载到具有redis-cli工具的主机上即可使用(通常可部署到redis服务主机上)。

  1. ``` shell
  2. # 1. 从github下载redis-tool工具
  3. # 方法一:使用git下载
  4. $ git clone https://github.com/iwhalecloud-platform/redis-tool.git
  5. # 进入下载目录
  6. $ cd redis-tool
  7. # 方法二:使用wget下载
  8. $ wget https://github.com/iwhalecloud-platform/redis-tool/archive/refs/heads/main.zip
  9. # 解压工具包&修改目录名
  10. $ unzip main.zip && mv redis-tool-main redis-tool
  11. # 进入下载目录
  12. $ cd redis-tool

  13. # 2. 设置REDIS_HOME环境变量为redis-cli工具所在目录(如果PATH环境变量中包含该目录,则该步可省略)
  14. $ echo "export REDIS_HOME=/path/to/redis-cli/" >> ~/.bashrc
  15. $ source ~/.bashrc
  16. ```

使用帮助


直接运行redis-tool可查看到使用帮助:

  1. ``` shell
  2. $ ./redis-tool
  3. Usage: redis-tool [OPTIONS] [command]
  4. OPTIONS:
  5.    -h <IP>:       Redis集群中某个节点IP (默认值: 127.0.0.1).
  6.    -p <port>:     Redis集群中某个节点端口 (默认值: 6379).
  7.    -i <nodefile>: Redis集群节点信息文件(适配codis等基于PROXY构建的集群模式).
  8.                   文件格式(每行一个分片):<slots1> <MasterAddr> [SlaveAddr] [SlaveAddr]
  9.    -a <password>: Redis访问密码,也可使用'REDISCLI_AUTH'环境变量来传入.
  10.    -c <count>:    1. TOP10命令统计滚动展示次数(默认无限次, 'moni'使用).
  11.                   2. 从Redis节点中获取的慢命令记录数(默认值: 100, 'slowlog'使用).
  12.                   3. 从Redis节点中随机获取的KEY名称数量(默认值: 100000, 'keys'使用).
  13.    -d <delay>:    TOP10命令统计滚动展示等待间隔(单位: 秒, 默认值: 3, 'moni'使用).
  14.    -t <time>:     实时命令监控跟踪运行时长(单位: 秒, 默认值: 10, 'trace'使用).
  15.    -s:            只处理指定Redis节点('moni' & 'slowlog'使用).
  16.    -l:            TOP10命令统计滚动展示包含命令执行平均处理耗时('moni'使用).
  17.    -f <file>:     1. 基于监控的命令详情文件进行命令监控跟踪处理('trace'使用).
  18.                   2. 基于指定的KEY名称列表文件进行前缀统计('keys'使用).
  19.    -L <level>:    按KEY前缀统计层级(默认值: 3, 'keys'使用).
  20.    -H:            基于监控的命令详情文件进行热点KEY访问分析('trace'使用).
  21.    -C:            基于监控的命令详情文件按客户端IP进行命令统计('trace'使用).
  22.    -r:            按裸输据形式输出集群节点监控指标,便于存储或上报至第三方监控系统 ('nodes'使用).
  23.    -k <key>:      要查询或修改的Redis运行参数名('config'使用).
  24.    -v <value>:    要修改的Redis运行参数值('config'使用).
  25.    -M:            只访问集群中主节点的运行参数 ('config'使用).
  26.    -S:            只访问集群中从节点的运行参数 ('config'使用).
  27.    -w:            Redis节点运行参数修改后需要重写配置文件('config'使用).
  28. command:
  29.    nodes:   集群节点状态监控 (默认执行)
  30.    keys:    按KEY前缀层级进行统计分析
  31.    moni:    TOP10命令周期性滚动统计
  32.    trace:   实时命令监控跟踪 & 热点KEY访问分析
  33.    slowlog: 集群慢命令日志查询
  34.    config:  查询/修改集群运行参数 & 集群运行参数差异检查
  35. ```

使用示例


注意事项:

请提前设置REDIS_HOME环境变量为redis-cli工具所在目录(如果PATH 环境变量中包含该目录,可省略)
强烈建议使用REDISCLI_AUTH环境变量来传入Redis访问密码,提升安全性

Redis集群监控


使用nodes 子命令可以汇总集群各节点的主要指标信息,并按照主从关系进行级联展示(当未指定子命令时,默认执行Redis集群监控子命令),可以针对Redis Cluster、主从Redis、自定义集群(codis、ctgcache)等形式集群的监控。

Redis Cluster集群


使用-h 和-p 参数传入集群中任一节点的IP和PORT,即可获取整个集群节点的监控指标信息:

  1. ``` shell
  2. $ ./redis-tool -h 172.16.18.80 -p 6380 nodes
  3. ================================================== 2022-04-28 18:44:02 ==================================================
  4. SERVER                   STATUS ROLE    VERSION  UPTIME(s) KEYS      USEMEM   %CPU   CLIENTS OPS    RTT(us)   SLOTS
  5. -------------------------------------------------------------------------------------------------------------------------
  6. 172.16.18.80:6379        OK     master  6.2.6    120542    55        21.56M   0.2    1       2      87        0-5460
  7. |-172.16.18.81:6380     OK     slave   6.2.6    120538    55        21.56M   0.2    2       0      7702    
  8. 172.16.18.81:6379        OK     master  6.2.6    120542    56        21.66M   12.7   2       1317   179       5461-10922
  9. |-172.16.18.82:6380     OK     slave   6.2.6    120538    56        21.56M   0.2    2       2      424      
  10. 172.16.18.82:6379        OK     master  6.2.6    120542    45        21.56M   0.3    1       0      151       10923-16383
  11. |-172.16.18.80:6380     OK     slave   6.2.6    120539    45        21.57M   0.2    2       0      84      
  12. _________________________________________________________________________________________________________________________
  13. SUM(master/all): NODE=3/6 KEY=156/312 MEM=64.8M/129.5M CLI=4/10 OPS=1319/1321 CPU=13.2/13.8
  14. =========================================================================================================================
  15. ```

主从Redis


同样使用-h 和-p 参数传入主从Redis中任一节点的IP和PORT,即可获取主从节点的监控指标信息:

  1. ``` shell
  2. $ redis-tool -h 172.16.18.80 -p 7770
  3. ================================================== 2022-10-12 12:26:54 ==================================================
  4. SERVER                   STATUS ROLE    VERSION  UPTIME(s) KEYS      USEMEM   %CPU   CLIENTS OPS    RTT(us)   SLOTS
  5. -------------------------------------------------------------------------------------------------------------------------
  6. 172.16.18.80:7770        OK     master  6.2.6    251       3         1.87M    0.3    1       1      193       single-M
  7. |-172.16.18.80:7772     OK     slave   6.2.6    237       3         1.85M    0.3    2       0      140       single-S
  8. |-172.16.18.80:7771     OK     slave   6.2.6    243       3         1.85M    0.2    2       2      119       single-S
  9. _________________________________________________________________________________________________________________________
  10. SUM(master/all): NODE=1/3 KEY=3/9 MEM=1.9M/5.6M CLI=1/5 OPS=1/3 CPU=0.3/0.8
  11. =========================================================================================================================
  12. ```

自定义集群


使用-i 参数传入自定义Redis集群的节点信息文件(适配codis等基于PROXY构建的集群模式)

文件格式(每行一个分片):<slots1> <MasterAddr> [SlaveAddr] [SlaveAddr]

  1. ``` shell
  2. # 例如:自定义Redis集群中共有4个分片,每个分片包含1主1从节点
  3. $ cat cluster93.conf
  4. 1 172.16.84.94:19100 172.16.84.93:19100
  5. 2 172.16.84.94:19101 172.16.84.93:19101
  6. 3 172.16.84.93:19102 172.16.84.94:19102
  7. 4 172.16.84.93:19103 172.16.84.94:19103
  8. $ redis-tool -i cluster93.conf
  9. ================================================== 2022-10-12 09:16:10 ==================================================
  10. SERVER                   STATUS ROLE    VERSION  UPTIME(s) KEYS      USEMEM   %CPU   CLIENTS OPS    RTT(us)   SLOTS
  11. -------------------------------------------------------------------------------------------------------------------------
  12. 172.16.84.93:19102       OK     master  2.7.0    5270208   773329    578.64M  0.4    314     48     637       3
  13. |-172.16.84.94:19102    OK     slave   2.7.0    5270684   773337    572.38M  0.2    2       6      1312    
  14. 172.16.84.93:19103       OK     master  2.7.0    5270208   775536    577.49M  0.3    202     20     190       4
  15. |-172.16.84.94:19103    OK     slave   2.7.0    5270684   775544    573.72M  0.2    2       1      224      
  16. 172.16.84.94:19100       OK     master  2.7.0    5270699   774345    581.09M  1.3    396     28     301       1
  17. |-172.16.84.93:19100    OK     slave   2.7.0    5270223   774345    573.14M  0.2    2       1      1013    
  18. 172.16.84.94:19101       OK     master  2.7.0    5270699   777694    579.13M  0.3    175     11     409       2
  19. |-172.16.84.93:19101    OK     slave   2.7.0    5270223   777694    575.97M  0.2    2       0      243      
  20. _________________________________________________________________________________________________________________________
  21. SUM(master/all): NODE=4/8 KEY=3100904/6201824 MEM=2.3G/4.5G CLI=1087/1095 OPS=107/115 CPU=2.3/3.1
  22. =========================================================================================================================
  23. ```

输出结果说明


SERVER :Redis服务地址

STATUS :可用于判断节点基本状态

OK :节点正常运行中

FAIL :节点连接失败

LOAD :节点正在进行数据加载

NOAUTH :节点密码认证失败(需指定正确的访问密码)

ROLE :如果节点角色变更,可能是发生过故障切换,需要通过服务日志进一步核查

master :主节点
slave :从节点

VERSION :对于Redis集群,版本号应该 >=3.0.0

UPTIME(s) :节点已经运行的时长(单位:s),可用于判断节点是否发生重启

KEYS :节点中存在的键值数

USEMEM :节点使用的内存量,建议不要超过10G,如果过高应该扩大集群规模

CLIENTS :节点当前接入的客户端连接数

%CPU :节点当前的CPU使用率百分比,通常不应该超过70%

OPS :节点当前每秒处理的命令请求量

RTT :节点当前请求响应时延(单位:us),通常不应该超过1000

SUM(master/all) :按主节点和集群维度,汇总节点数、键值数、内存使用量、客户端连接数、OPS、%CPU等指标信息

备注:

主节点分布均匀,能够更好的发挥Redis性能,而且也有利于故障切换时的主从选举,所以对于主节点分布不均匀时,会给出告警信息
工具支持-r 参数,用于将集群节点指标以裸输据输出,方便进行指标文件存储,或上报至第三方监控平台

慢命令分析


使用slowlog 子命令可以汇总集群各节点的慢命令日志,按日志生成时间进行排序展示格式化后的命令详情:

  1. ``` shell
  2. $ redis-tool -p 6380 slowlog
  3. 2022-04-28 18:13:46 <INFO> [CLUSTER] get slowlog of cluster by the node 127.0.0.1:6380 (COUNT=100)
  4. =========================================== 2022-04-28 18:13:47 ============================================
  5. Redis                 ID     Time[Asc]       Duration(us) Client                Command
  6. ------------------------------------------------------------------------------------------------------------
  7. 172.16.18.80:6379     0      20220428181334  728          172.16.18.80:47026    [ "COMMAND" ]
  8. 172.16.18.81:6379     0      20220428181334  897          172.16.18.80:58702    [ "COMMAND" ]
  9. 172.16.18.82:6379     0      20220428181334  996          172.16.18.80:57426    [ "COMMAND" ]
  10. 172.16.18.80:6379     1      20220428181337  697          172.16.18.80:47044    [ "COMMAND" ]
  11. 172.16.18.81:6379     1      20220428181337  1033         172.16.18.80:58714    [ "COMMAND" ]
  12. 172.16.18.82:6379     1      20220428181337  1024         172.16.18.80:57444    [ "COMMAND" ]
  13. 172.16.18.80:6379     2      20220428181341  716          172.16.18.80:47068    [ "COMMAND" ]
  14. 172.16.18.81:6379     2      20220428181341  1320         172.16.18.80:58742    [ "COMMAND" ]
  15. 172.16.18.82:6379     2      20220428181341  767          172.16.18.80:57470    [ "COMMAND" ]
  16. 172.16.18.80:6379     3      20220428181344  705          172.16.18.80:47104    [ "COMMAND" ]
  17. 172.16.18.81:6379     3      20220428181344  886          172.16.18.80:58780    [ "COMMAND" ]
  18. 172.16.18.82:6379     3      20220428181344  834          172.16.18.80:57504    [ "COMMAND" ]
  19. 172.16.18.82:6379     4      20220428181344  111          172.16.18.80:57504    [ "info" "commandstats" ]
  20. ---------------------------[ 20220428:       count = 13 ]-------------------------------------------------
  21. ```

结果说明:

日志按时间顺序展示,当前页面展示最新的日志信息
对于存在慢命令日志的日期会进行日志数量汇总
工具支持-c <count> 参数,来指定查询节点最新的慢命令记录数(默认值:100 )

慢命令日志主要原因:

大key访问:key值包含的元素数太大时对Redis服务性能影响较大,建议优化业务逻辑,进行大key拆分或使用替代命令(例如使用HSCAN 代替HGETALL )
复杂命令:KEYS 、FLUSHDB 、HGETALL 等,生产环境通常禁止使用
主机内存不足:当主机因为内存不足,而使用了磁盘交换区时,对于Redis服务性能影响很大,需要进行内存使用限制或主机资源扩容
主机CPU繁忙:主机CPU配置较低,或者部署了其他高CPU占用软件,生产环境建议Redis主机独占部署
CPU使用限制:通过cgroup限制了Redis进程的CPU使用率,导致访问性能下降,生产环境不建议进行限制

热点key分析


当发现某个Redis节点的%CPU 或OPS 指标相对于其他节点高很多时,通常是因为存在热点key访问,此时可以使用trace 子命令实时监控该节点的命令请求,并分析KEY的请求百分比,从而发现热点key:

备注:实时命令监控统计实际使用的时Redis的monitor 命令,因此建议在节点所在主机上执行,并且不要使用-t 参数调整监控时间过长。

  1. ``` shell
  2. # 1. 实时监控统计节点每秒处理的命令,并记录命令详情至文件中[172.16.18.81-6379.mon]
  3. #    默认实时跟踪10秒,可通过-t <time>参数进行修改
  4. $ ./redis-tool -h 172.16.18.81 -p 6379 trace
  5. 2022-04-28 19:07:42 <INFO> Analyze the command on seconds for the node 172.16.18.81:6379 ...
  6. --------------------------------------------------------------------------------
  7. 19:07:42> "GET":1584
  8. 19:07:43> "GET":4927
  9. 19:07:44> "GET":3255
  10. 19:07:45> "AUTH":1 "COMMAND":1 "GET":5052 "INFO":3
  11. 19:07:46> "GET":2842
  12. 19:07:47> "GET":5699
  13. 19:07:48> "AUTH":1 "COMMAND":1 "GET":3598 "INFO":3
  14. 19:07:49> "GET":4543
  15. 19:07:50> "GET":3699
  16. 19:07:51> "AUTH":1 "COMMAND":1 "GET":5074 "INFO":3
  17. 19:07:52> "GET":4025
  18. 2022-04-28 19:07:52 <INFO> You can check the monitor file: [172.16.18.81-6379.mon], or analyze the file by -f again!
  19. # 2. 基于监控的命令详情文件进行热点KEY访问分析
  20. $ ./redis-tool -f 172.16.18.81-6379.mon -H trace
  21. 2022-04-28 19:08:06 <INFO> Analyze the monitor file 172.16.18.81-6379.mon for hot keys ...
  22. ==================================================  =======  =======
  23. KEY                                                 COUNT    PERCENT
  24. --------------------------------------------------  -------  -------
  25. "commandstats"                                      3        0.01%
  26. "cpu"                                               3        0.01%
  27. NO-KEY                                              3        0.01%
  28. "(redacted)"                                        3        0.01%
  29. "stats"                                             3        0.01%
  30. "key1"                                              44298    99.97%
  31. ```

热点key的存在通常需要从业务使用侧进行优化,主要的处理策略:

将每次业务访问的key进行拆分,避免总是访问同一个key
对需要频繁访问的key进行本地缓存,本地缓存数据可以通过定时策略进行更新
优化业务流程处理逻辑,减少无效的交互访问次数

TOP命令跟踪


使用moni 子命令能够滚动展示周期内TOP10命令执行的执行情况;当存在大量非应用直接调用的命令时(例如PING 、CLUSTER ),或者某个命令执行次数或平均处理耗时不符合预期,都可以作为下一步排查的方向。

备注:

默认汇总集群所有主节点的命令执行情况;当使用-s 参数时,将只展示指定Redis节点的命令执行情况
每滚动输出20次命令统计后,会重新计算当前的TOP10命令进行展示

  1. ``` shell
  2. # 1. 每秒滚动展示集群TOP10命令
  3. $ ./redis-tool -h 172.16.18.80 -p 6380 -d 1 moni
  4. 2022-04-28 18:46:11 <INFO> [CLUSTER] monitor with 3 masters from 172.16.18.80:6380 every 1 seconds
  5. -----------------------TOP10 commands 2022-04-28 18:46:12----------------------- -----all------ -----------netio-----
  6. get     info    replconf command auth    time    slowlog set     select  scan    TOTAL   %CPU   CONNS IN(KB)  OUT(KB)
  7. 4445    9       3        3       3       0       0       0       0       0       4463    17.5   7     100     118    
  8. 6115    9       4        3       3       0       0       0       0       0       6134    19.7   4     139     139    
  9. 4038    9       4        3       3       0       0       0       0       0       4057    16.0   7     91      113    
  10. 5647    9       4        3       3       0       0       0       0       0       5666    23.0   6     127     133    
  11. 6051    9       3        3       3       0       0       0       0       0       6069    22.0   6     137     137  
  12. ... ...
  13. # 2. 每3秒滚动展示集群TOP10命令及平均处理耗时(*数值,对应的即为平均处理耗时,单位:us)
  14. $ ./redis-tool -h 172.16.18.80 -p 6380 -c 5 -l moni
  15. 2022-04-28 18:47:17 <INFO> [CLUSTER] monitor with 3 masters from 172.16.18.80:6380 every 3 seconds
  16. -----------------------TOP10 commands 2022-04-28 18:47:20----------------------- -----all------ -----------netio-----
  17. get     replconf info    command auth    time    slowlog set     select  scan    TOTAL   %CPU   CONNS IN(KB)  OUT(KB)
  18. 14513   10       9       3       3       0       0       0       0       0       14538   21.2   10    327     237    
  19. *1      *1       *32     *891    *7      *0      *0      *0      *0      *0      
  20. 16470   10       9       3       3       0       0       0       0       0       16495   22.8   11    371     259    
  21. *1      *1       *33     *904    *30     *0      *0      *0      *0      *0      
  22. 11883   9        9       3       3       0       0       0       0       0       11907   16.9   16    268     206    
  23. *1      *1       *25     *882    *8      *0      *0      *0      *0      *0      
  24. 15255   10       9       3       3       0       0       0       0       0       15280   19.2   11    343     245    
  25. *1      *1       *28     *979    *9      *0      *0      *0      *0      *0      
  26. 7974    9        9       3       3       0       0       0       0
Last Updated: 2023-09-03 19:17:54