在我们需要分析Redis实例的内存使用情况时,市场上有着许多免费的开源工具,同时也有少量的付费产品。如果您想更深层次地分析内存相关问题的话,就可能需要用到一些更具针对性的“独门”工具了。
【51CTO.com快译】在我们需要分析Redis实例的内存使用情况时,市场上有着许多免费的开源工具,同时也有少量的付费产品。如果您想更深层次地分析内存相关问题的话,就可能需要用到一些更具针对性的“独门”工具了。
我们在本文中为您推荐了六种实用工具,它们曾被我们用来分析自己的Redis实例。它们分别是:
- Redis Memory Analyzer(Redis内存分析器,RMA)
- Redis Sampler(Redis采样器)
- RDB Tools(RDB 工具集)
- Redis-Audit(Redis-审计)
- Redis Toolkit(Redis工具包)
- Harvest
1.Redis Memory Analyzer
在Redis内存分析领域,RMA(Redis内存分析器)是最全面的FOSS(译者注:Free and Open Source Software,免费且开源的软件)之一。它支持三种不同的级别模式,分别是:
- 全局 – 显示内存使用信息的概述。
- 扫描器 – 显示***级别键值空间(keyspace)和前缀(prefix)的内存使用信息 - 换言之,使用最短的通用前缀(common prefix)。
- RAM – 显示***级键值空间和前缀 - 换言之,使用最长的通用前缀。
每一种模式都有自己的用途,您可以在RMA的自述文件(https://github.com/gamenet/redis-memory-analyzer/blob/master/README.rst)中获取进一步的详细信息.
RMA - 全局模式
在全局模式下,RMA 提供了一些高级别的统计信息,如键数、系统内存、驻留集的大小、键值空间的大小等。值得一提的是其特殊功能:“键值空间开销”,这是Redis系统用来存储与键值空间相关信息的内存数量,例如列表数据结构中的指针数量。
RMA - 扫描器模式
在扫描器模式中,我们能够获取键值空间的概述。它给出了高级别的命名空间(因此,a:b:1和a:c:1合并为a:*),同时带有各种条目的类型,及其命名空间所占用内存的百分比。该模式可作为分析的起点,然后使用下面的“RAM”模式进行详细的分析。
RMA - RAM模式
在RAM模式下,我们得到键值空间级别的内存开销值,当然大多数其他开源的内存分析工具也能提供。因此,此处将a:b:1和a:c:1分别当作a:b:*和a:c:*,我们从而得到有关内存使用、实际数据大小、开销、编码、最小和***TTL等方面的详细信息。这些都有助于我们查出那些系统中内存消耗“大户”。
不过,此工具长久未被更新了(在GitHub上的***一次提交是在一年多以前)。即便如此,它仍然是我们进行详细分析的***工具之一。
RMA的安装和使用:
RMA需要在系统上事先安装好Python和PIP(译者注:Python的包管理工具),两者一般都被预安装在了主流的操作系统之上。安装完毕后,您可以执行一条“pip install rma”的命令来安装RDB工具。
您可以很容易地通过命令行来使用它,其语法为:“rma [-s HOST] [-p PORT] [-a PASSWORD] [-d DB] [-m pattern-to-match] [-l number-of-keys-to-scan] [-b BEHAVIOUR] [-t comma-separated-list-of-data-types-to-scan]”
RMA的优势:
- 能够实时运行。
- 使用扫描命令来遍历数据库,因此它对性能的影响是有限的,但分析的准确度较高。
- 有很好的支持文档,很容易找到使用示例。
- 支持自定义和筛选功能,包括只分析特定的数据类型,或只是考虑与特定模式相匹配的键值。
- 能提供不同级别的详细信息,包括:命名空间、键值或全局值。
- 相对其他工具,它具有一项特殊的功能:可以显示数据结构的开销(即,Redis系统用来存储与键值空间相关信息的内存数量,例如列表数据结构中的指针数量)。
RMA的劣势:
- 不支持概率采样。对于大型数据库来说,其线性扫描数据库的方式可能会非常缓慢。为了提高性能,我们可以在返回了一定数量的键值后,选择中止扫描。
- 输出中带有太多的细节。虽然对专家有用,但它也可能给新手带来混淆。
2.Redis Sampler
Redis Sampler是一款非常强大的工具,可以让我们深入了解Redis实例的内存使用情况。它是由Redis背后的开发人员antirez(https://github.com/antirez)所维护。我们能从该工具中看到他对Redis的深入了解。该工具不常被更新,当然也鲜有问题报告被爆出。
Redis Sampler对数据库执行的是概率扫描,并能报告以下的信息:
- 键值在各种数据类型之间的百分比分布(基于键值的数量,而不是对象的大小)。
- 字符串类型的***键,基于strlen,以及它们所消耗的内存百分比。
- 对于所有其他数据类型,它计算出***键、并显示到两个单独的列表中:一个是基于对象的大小;另一个是基于对象的项数。
- 对于每种数据类型,它还能显示“2的幂分布”。这对于我们了解数据类型的大小分布是非常有用的。其输出能够详细地说明给定类型键值的百分比区间,即:> 2^x和 <= 2^x+1。
Redis Sampler的安装和使用:
由于是一个单独的Ruby脚本,因此它要求Ruby已完成了安装。同时,您还需要安装好“rubygems”和“redis gems”。它的用法非常简单,只需执行命令“./redis-sampler.rb”便可。
Redis Sampler的优势:
- 非常简单易用,没有查找和需要理解的选项。
- 即使是新手也很容易读懂它的输出。同时,它也能提供足够多的信息,供技术专家对Redis的实例进行详细分析。其显示区域的布局比较清晰,且能够进行过滤。
- 适用于Redis的所有版本。
- 由于没有用到任何诸如DEBUG OGJECT的特权命令,因此它可以被应用到包括亚马逊 ElastiCache在内的任何系统之上。
- 它使用特定数据类型长度的命令来识别数据大小,因此其报告并不受序列化的影响。
- 适用于实时数据。虽然该工具建议是在环回接口上运行,但其实它也能支持对远程系统的采样。
Redis Sampler的劣势:
- 如果其采样频率的设置高于数据库的本身基数(cardinality),那么它将仍然使用随机键值(RANDOMKEYS)而不是扫描(SCAN)模式。
- 没有现成可用的bundle或Docker的图像。您必须手动安装其相应的依赖项(好在只有两个依赖关系项)。
- 由于数据结构有着不同的存储开销,因此报告中的数据大小并不能完全匹配RAM上所占用的空间。
- 如果您的Redis实例需要身份验证的话,它无法做到开箱即用(out-of-the-box)。您需要修改脚本以适应密码的需求。最简单形式是:redis = Redis.new(:host => ARGV[0], :port => ARGV[1].to_i, :db => ARGV[2].to_i) and change it to: redis = Redis.new(:host => ARGV[0], :port => ARGV[1].to_i, :db => ARGV[2].to_i, :password => "add-your-password-here")
3.RDB Tools
RDB Tools对于任何一位苛刻的Redis管理员来说都是非常实用的工具套件。我们能够想到的几乎所有用例,它都有着对应的工具。在此,我们仅关注它的内存分析工具。虽然不像RMA或Redis Sampler那样全面,但是RDB Tools提供了下面三个方面的重要信息:
(1) 列出了所有(序列化)数值大于B字节【B由用户来指定】的键。
(2) ***的N个键【N由用户指定】。
(3) 特定键的大小:这是从数据库中实时读取的。
该套件在GitHub上有许多活跃的贡献者,因此它能经常保持更新。在互联网上我们也能找到RDB Tools的相关文档。其维护者是Sripathi Krishnan(https://github.com/sripathikrishnan?tab=repositories)。众所周知,他多年来为Redis社区提供了许多工具。
RDB Tools的安装和使用:
RDB Tools需要在系统上事先安装好Python和PIP,两者一般都被预安装在了主流操作的系统之上。安装完毕后,您可以执行一条“pip install rdbtools python-lz”的命令来安装RDB工具。
其用法非常简单:
- 获取前200个***键:rdb -c memory /var/redis/6379/dump.rdb –largest 200 -f memory.csv
- 获取所有大于128字节的键值:rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
- 获取键值的大小:redis-memory-for-key -s localhost -p 6379 -a mypassword person:1
RDB Tools的优势:
- 输出的CSV文件,可被其他开源工具所使用,从而方便地实现数据可视化,同时也能导入RDBMS中予以分析。
- 具有良好的支持文档。
- 支持自定义和筛选选项,您可以籍此获得更加有用的报告。
RDB Tools的劣势:
- 不能分析实时数据,而且您必须获取RDB dump文件。因此,它报告的是序列化内存的使用率,并非精确地显示RAM上所占用的内存。
- 它并不支持任何内置的分组,因此无法找到***的命名空间。
4.Redis-Audit
Redis-Audit是一种概率工具,您可以用它来快速地获知内存的使用情况。它能够输出各种有用的键组信息,包括:总体内存消耗、组内***TTL、上一次平均访问时间、组中过期键的百分比等。如果您想找到应用中那些大量消耗内存的键值组,那么它就是您的***工具。
Redis-Audit安装和使用:
您必须事先安装了Ruby和Bundle(https://bundler.io/)。安装完成之后,您可以将Redis-Audit的存储库(https://github.com/snmaynard/redis-audit.git)克隆到某个文件夹,或是下载zip工具(https://github.com/snmaynard/redis-audit/archive/master.zip)并解压缩到那里。在该文件夹中,您可以运行“bundle install”来完成安装。
它的用法非常简单,你可以直接在命令行中输入“execute”
redis-audit.rb hostname [port] [password] [dbnum] [sample_size]
Redis-Audit的优势:
- 允许您为键值空间和前缀分组定义自己的正则表达式(regex)。
- 适用于Redis的所有版本。
- 如果样本的大小大于键的实际数量,它将遍历所有的键。在另一方面,此操作会使用*键,而不使用扫描来阻止其他的操作。
Redis-Audit的劣势:
- 由于使用了“DEBUG OBJECT”命令(这在ElastiCache中是不可用的),因此它所报告的序列化大小与RAM上的实际占用会有所不同。
- 由于不是表格的形式,因此其输出不容易被快速地解析到。
5.Redis Toolkit
Redis Toolkit是一种极简易的监视方案。它可以被用于分析两类关键指标:***率和内存消耗。虽然该项目会定期通过更新来修复bug,但并没有社区去对它所提供的工具予以支持。
Redis Toolkit的安装和使用:
您的系统上必须先安装好Docker。然后,克隆它的GitHub存储库(https://github.com/alexdicianu/redis_toolkit.git)或下载并解压到某个文件夹中。在该文件夹里,您可以通过执行“./redis-toolkit install.”来完成简单的安装。
以下是一些纯命令行的简单操作:
- 开始监视***率:./redis-toolkit monitor
- 报告***率:./redis-toolkit report -name NAME -type hitrate
- 停止监视***率:./redis-toolkit stop
- 在本地系统上创建dump文件:./redis-toolkit dump
- 报告内存使用情况:./redis-toolkit report -type memory -name NAME
Redis Toolkit的优势:
- 能够通过易用的界面,向您提供准确的信息。
- 能够将前缀分组为任何适合您的级别(因此,如果选取a:b:1和a:c:1,那么它既可以算作a:*、也可以单独计算)。
- 适用于Redis的所有版本,同时不需要访问诸如DEBUG OBJECT之类的特权命令。
- 具有良好的支持文档。
Redis Toolkit的劣势:
- 由于它工作在序列化的dump模式,因此无法进行实时的内容分析。同样,它报告的内存使用量也并非完全等同于RAM的实际消耗量。
- 在Redis Toolkit运行时,计算机会创建一个dump文件。如果您访问的是一个Redis的远程实例,那么就可能需要一段时间才能完成。
- 使用MONITOR命令来监视***率,以捕获在服务器上运行的所有命令。那么在生产环境中,这样可能会降低性能,并带来安全风险。
- 由于它是通过|GET| / (|GET| + |SET|)来计算***率的,因此如果某个数值经常发生变化,就算没有错过任何真实的缓存,那么它的***率也会有所降低。
6.Harvest
这是一款概率采样的工具,它可以被用于根据键的数量来识别十个***的命名空间和前缀。由于是一款较新的工具,它在GitHub上的关注度并不高。然而,如果您是一名想找到自己的实例中哪些应用数据有拥塞的Redis新手,那么Harvest对您来说就非常最容易上手。
Harvest的安装和使用:
您可以通过链接:https://hub.docker.com/r/31z4/harvest/来下载它的Docker镜像。一旦镜像准备就绪,您就可以在CLI中使用“docker run --link redis:redis -it --rm 31z4/harvest redis://redis-URL”的命令来运行该工具。
Harvest的优势:
- •适用于实时数据。
- •使用“memory usage”命令来获取内存信息。因此它既能够提供精确的数量信息(而不是序列化大小),又不需要访问DEBUG OBJECT的命令。
- •您的命名空间不需要用冒号来区分开来。Harvest能够识别常见的前缀,而不是依靠正则表达式来进行命名空间的识别。
Harvest的劣势:
- 很难适用于任何其他类型的用例。
- 该工具仅适用于Redis v4.0及以上版本。
- 其支持文档非常少。
免费工具的局限性
虽然我们在此列举的工具对于调试Redis实例的内存问题非常实用,但是您也应该知道这些免费工具的一些局限性。
付费工具一般总能提供某些数据的可视化功能,但是我们在此所列举的工具却无法实现开箱即用。它们顶多给您输出CSV文件,以供其他开源软件进一步实现可视化,当然许多工具甚至连此类输出都不具备。这就给Redis的新手用户带来了“陡峭”的学习曲线。因此,如果您需要经常进行内存分析的话,那么您***选用能够提供良好的可视化功能的付费工具。
另一个局限性是它们存储历史信息的能力。和那些*nix的设计理念一样,这些工具只专注于某个方面并能其做到***,但是它们鲜少涉猎整个监控领域。它们既不能提供一段时间的内存消耗曲线图,也无法分析实时的数据。
选择的底线
虽然单个工具的确无法满足您的所有需求,但是它们可以作为您的“武器库”中的常备“武器”,来配合诸如:ScaleGrid的Redis hosting(https://scalegrid.io/redis/products.html)之类具有监控能力的DBaaS服务,来联合使用。