Redis
在应用 Redis 时,经常会面临的运维工作,包括 Redis 的运行状态监控数据迁移主从集群切片集群的部署和运维。
接下来,从这三个方面,介绍一些工具。先来学习下监控 Redis 实时运行状态的工具,这些工具都用到了 Redis 提供的一个监控命令:INFO

最基本的监控命令:INFO 命令

Redis 本身提供的 INFO 命令会返回丰富的实例运行监控信息,这个命令是 Redis 监控工具的基础。
INFO 命令在使用时,可以带一个参数 section,这个参数的取值有好几种,相应的,INFO 命令也会返回不同类型的监控信息。把 INFO 命令的返回信息分成 5 大类,其中,有的类别当中又包含了不同的监控内容,如下表所示:
Redis必备的几款运维工具 - 图1
在监控 Redis 运行状态时,INFO 命令返回的结果非常有用。如果想了解 INFO 命令的所有参数返回结果的详细含义,可以查看 Redis官网的介绍。
这里说几个运维时需要重点关注的参数以及它们的重要返回结果。
首先,无论是运行单实例或是集群,建议重点关注一下 statcommandstatcpumemory 这四个参数的返回结果,这里面包含了命令的执行情况(比如命令的执行次数和执行时间、命令使用的 CPU 资源),内存资源的使用情况(比如内存已使用量、内存碎片率),CPU 资源使用情况等,这可以判断实例的运行状态和资源消耗情况。
另外,当启用 RDBAOF 功能时,就需要重点关注下 persistence 参数的返回结果,可以通过它查看到 RDB 或者 AOF 的执行情况。
如果在使用主从集群,就要重点关注下 replication 参数的返回结果,这里面包含了主从同步的实时状态。
不过,INFO 命令只是提供了文本形式的监控结果,并没有可视化,所以,在实际应用中,还可以使用一些第三方开源工具,将 INFO 命令的返回结果可视化。接下来的 Prometheus,就可以通过插件将 Redis 的统计结果可视化。

面向 Prometheus 的 Redis-exporter 监控

Prometheus是一套开源的系统监控报警框架。它的核心功能是从被监控系统中拉取监控数据,结合Grafana工具,进行可视化展示。
而且,监控数据可以保存到时序数据库中,以便运维人员进行历史查询。同时,Prometheus 会检测系统的监控指标是否超过了预设的阈值,一旦超过阈值,Prometheus 就会触发报警。
对于系统的日常运维管理来说,这些功能是非常重要的。而 Prometheus 已经实现了使用这些功能的工具框架。只要能从被监控系统中获取到监控数据,就可以用 Prometheus 来实现运维监控。
Prometheus 正好提供了插件功能来实现对一个系统的监控,把插件称为 exporter,每一个 exporter 实际是一个采集监控数据的组件。exporter 采集的数据格式符合 Prometheus 的要求,Prometheus 获取这些数据后,就可以进行展示和保存了。
Redis-exporter就是用来监控 Redis 的,它将 INFO 命令监控到的运行状态和各种统计信息提供给 Prometheus,从而进行可视化展示和报警设置。目前,Redis-exporter 可以支持 Redis 2.06.0 版本,适用范围比较广。
除了获取 Redis 实例的运行状态,Redis-exporter 还可以监控键值对的大小和集合类型数据的元素个数,这个可以在运行 Redis-exporter 时,使用 check-keys 的命令行选项来实现。
此外,可以开发一个 Lua 脚本,定制化采集所需监控的数据。然后,使用 scripts 命令行选项,让 Redis-exporter 运行这个特定的脚本,从而可以满足业务层的多样化监控需求。
最后,还有两个小工具:redis-statRedis Live。跟 Redis-exporter 相比,这两个都是轻量级的监控工具。它们分别是用 RubyPython 开发的,也是将 INFO 命令提供的实例运行状态信息可视化展示。
虽然这两个工具目前已经很少更新了,不过,如果想自行开发 Redis 监控工具,它们都是不错的参考。
除了监控 Redis 的运行状态,还有一个常见的运维任务就是数据迁移。接下来,再来学习下数据迁移的工具。

数据迁移工具 Redis-shake

有时候,需要在不同的实例间迁移数据。目前,比较常用的一个数据迁移工具是Redis-shake,这是阿里云 Redis 和 MongoDB 团队开发的一个用于 Redis 数据同步的工具。
Redis-shake 的基本运行原理,是先启动 Redis-shake 进程,这个进程模拟了一个 Redis 实例。
然后,Redis-shake 进程和数据迁出的源实例进行数据的全量同步。
这个过程和 Redis 主从实例的全量同步是类似的。
源实例相当于主库,Redis-shake 相当于从库,源实例先把 RDB 文件传输给 Redis-shakeRedis-shake 会把 RDB 文件发送给目的实例。接着,源实例会再把增量命令发送给 Redis-shakeRedis-shake 负责把这些增量命令再同步给目的实例。
下面这张图展示了 Redis-shake 进行数据迁移的过程:
Redis必备的几款运维工具 - 图2
Redis-shake 的一大优势,就是支持多种类型的迁移。
首先,它既支持单个实例间的数据迁移,也支持集群到集群间的数据迁移。
其次,有的 Redis 切片集群(例如 Codis)会使用 proxy 接收请求操作,Redis-shake 也同样支持和 proxy 进行数据迁移。
另外,因为 Redis-shake 是阿里云团队开发的,所以,除了支持开源的 Redis 版本以外,Redis-shake 还支持云下的 Redis 实例和云上的 Redis 实例进行迁移,可以实现 Redis 服务上云的目标。
在数据迁移后,通常需要对比源实例和目的实例中的数据是否一致。如果有不一致的数据,需要把它们找出来,从目的实例中剔除,或者是再次迁移这些不一致的数据。
这里,再介绍一个数据一致性比对的工具了,就是阿里云团队开发的Redis-full-check
Redis-full-check 的工作原理很简单,就是对源实例和目的实例中的数据进行全量比对,从而完成数据校验。不过,为了降低数据校验的比对开销,Redis-full-check 采用了多轮比较的方法。
在第一轮校验时,Redis-full-check 会找出在源实例上的所有 key,然后从源实例和目的实例中把相应的值也都查找出来,进行比对。第一次比对后,Redis-full-check 会把目的实例中和源实例不一致的数据,记录到 sqlite 数据库中。
从第二轮校验开始,Redis-full-check 只比较上一轮结束后记录在数据库中的不一致的数据。
为了避免对实例的正常请求处理造成影响,Redis-full-check 在每一轮比对结束后,会暂停一段时间。随着 Redis-shake 增量同步的进行,源实例和目的实例中的不一致数据也会逐步减少,所以,校验比对的轮数不用很多。
可以自己设置比对的轮数。具体的方法是,在运行 Redis-full-check 命令时,把参数 comparetimes 的值设置为想要比对的轮数。
等到所有轮数都比对完成后,数据库中记录的数据就是源实例和目的实例最终的差异结果了。
这里有个地方需要注意下,Redis-full-check 提供了三种比对模式,可以通过 comparemode 参数进行设置。comparemode 参数有三种取值,含义如下:

  • KeyOutline,只对比 key 值是否相等;
  • ValueOutline,只对比 value 值的长度是否相等;
  • FullValue,对比 key 值、value 长度、value 值是否相等。

在应用 Redis-full-check 时,可以根据业务对数据一致性程度的要求,选择相应的比对模式。如果一致性要求高,就把 comparemode 参数设置为 FullValue
再介绍一个用于 Redis 集群运维管理的工具 CacheCloud

集群管理工具 CacheCloud

CacheCloud是搜狐开发的一个面向 Redis 运维管理的云平台,它实现了主从集群、哨兵集群和 Redis Cluster 的自动部署和管理,用户可以直接在平台的管理界面上进行操作。
针对常见的集群运维需求,CacheCloud 提供了 5 个运维操作。

  • 下线实例:关闭实例以及实例相关的监控任务。
  • 上线实例:重新启动已下线的实例,并进行监控。
  • 添加从节点:在主从集群中给主节点添加一个从节点。
  • 故障切换:手动完成 Redis Cluster 主从节点的故障转移。
  • 配置管理:用户提交配置修改的工单后,管理员进行审核,并完成配置修改。

当然,作为运维管理平台,CacheCloud 除了提供运维操作以外,还提供了丰富的监控信息。
CacheCloud 不仅会收集 INFO 命令提供的实例实时运行状态信息,进行可视化展示,而且还会把实例运行状态信息保存下来,例如内存使用情况、客户端连接数、键值对数据量。这样一来,当 Redis 运行发生问题时,运维人员可以查询保存的历史记录,并结合当时的运行状态信息进行分析。
如果希望有一个统一平台,把 Redis 实例管理相关的任务集中托管起来,CacheCloud 是一个不错的工具。