You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
11 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 加餐(五) | Redis有哪些好用的运维工具
你好,我是蒋德钧。
今天的加餐我来给你分享一些好用的Redis运维工具。
我们在应用Redis时经常会面临的运维工作包括Redis的运行状态监控数据迁移主从集群、切片集群的部署和运维。接下来我就从这三个方面给你介绍一些工具。我们先来学习下监控Redis实时运行状态的工具这些工具都用到了Redis提供的一个监控命令INFO。
## 最基本的监控命令INFO命令
**Redis本身提供的INFO命令会返回丰富的实例运行监控信息这个命令是Redis监控工具的基础**
INFO命令在使用时可以带一个参数section这个参数的取值有好几种相应的INFO命令也会返回不同类型的监控信息。我把INFO命令的返回信息分成5大类其中有的类别当中又包含了不同的监控内容如下表所示
![](https://static001.geekbang.org/resource/image/8f/a8/8fb2ef487fd9b7073fd062d480b220a8.jpg?wh=2753*1576)
在监控Redis运行状态时INFO命令返回的结果非常有用。如果你想了解INFO命令的所有参数返回结果的详细含义可以查看Redis[官网](https://redis.io/commands/info)的介绍。这里,我给你提几个运维时需要重点关注的参数以及它们的重要返回结果。
首先,**无论你是运行单实例或是集群我建议你重点关注一下stat、commandstat、cpu和memory这四个参数的返回结果**这里面包含了命令的执行情况比如命令的执行次数和执行时间、命令使用的CPU资源内存资源的使用情况比如内存已使用量、内存碎片率CPU资源使用情况等这可以帮助我们判断实例的运行状态和资源消耗情况。
另外当你启用RDB或AOF功能时你就需要重点关注下persistence参数的返回结果你可以通过它查看到RDB或者AOF的执行情况。
如果你在使用主从集群就要重点关注下replication参数的返回结果这里面包含了主从同步的实时状态。
不过INFO命令只是提供了文本形式的监控结果并没有可视化所以在实际应用中我们还可以使用一些第三方开源工具将INFO命令的返回结果可视化。接下来我要讲的Prometheus就可以通过插件将Redis的统计结果可视化。
## 面向Prometheus的Redis-exporter监控
[Prometheus](https://prometheus.io/)是一套开源的系统监控报警框架。它的核心功能是从被监控系统中拉取监控数据,结合[Grafana](https://grafana.com/)工具进行可视化展示。而且监控数据可以保存到时序数据库中以便运维人员进行历史查询。同时Prometheus会检测系统的监控指标是否超过了预设的阈值一旦超过阈值Prometheus就会触发报警。
对于系统的日常运维管理来说这些功能是非常重要的。而Prometheus已经实现了使用这些功能的工具框架。我们只要能从被监控系统中获取到监控数据就可以用Prometheus来实现运维监控。
Prometheus正好提供了插件功能来实现对一个系统的监控我们把插件称为exporter每一个exporter实际是一个采集监控数据的组件。exporter采集的数据格式符合Prometheus的要求Prometheus获取这些数据后就可以进行展示和保存了。
[Redis-exporter](https://github.com/oliver006/redis_exporter)就是用来监控Redis的它将INFO命令监控到的运行状态和各种统计信息提供给Prometheus从而进行可视化展示和报警设置。目前Redis-exporter可以支持Redis 2.0至6.0版本,适用范围比较广。
除了获取Redis实例的运行状态Redis-exporter还可以监控键值对的大小和集合类型数据的元素个数这个可以在运行Redis-exporter时使用check-keys的命令行选项来实现。
此外我们可以开发一个Lua脚本定制化采集所需监控的数据。然后我们使用scripts命令行选项让Redis-exporter运行这个特定的脚本从而可以满足业务层的多样化监控需求。
最后,我还想再给你分享两个小工具:[redis-stat](https://github.com/junegunn/redis-stat)和[Redis Live](https://github.com/snakeliwei/RedisLive)。跟Redis-exporter相比这两个都是轻量级的监控工具。它们分别是用Ruby和Python开发的也是将INFO命令提供的实例运行状态信息可视化展示。虽然这两个工具目前已经很少更新了不过如果你想自行开发Redis监控工具它们都是不错的参考。
除了监控Redis的运行状态还有一个常见的运维任务就是数据迁移。接下来我们再来学习下数据迁移的工具。
## 数据迁移工具Redis-shake
有时候,我们需要在不同的实例间迁移数据。目前,比较常用的一个数据迁移工具是[Redis-shake](https://github.com/aliyun/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进行数据迁移的过程
![](https://static001.geekbang.org/resource/image/02/5b/027f6ae0276d483650ee4d5179f19c5b.jpg?wh=3000*795)
**Redis-shake的一大优势就是支持多种类型的迁移。**
**首先,它既支持单个实例间的数据迁移,也支持集群到集群间的数据迁移**。
**其次**有的Redis切片集群例如Codis会使用proxy接收请求操作Redis-shake也同样支持和proxy进行数据迁移。
**另外**因为Redis-shake是阿里云团队开发的所以除了支持开源的Redis版本以外Redis-shake还支持云下的Redis实例和云上的Redis实例进行迁移可以帮助我们实现Redis服务上云的目标。
**在数据迁移后,我们通常需要对比源实例和目的实例中的数据是否一致**。如果有不一致的数据,我们需要把它们找出来,从目的实例中剔除,或者是再次迁移这些不一致的数据。
这里,我就要再给你介绍一个数据一致性比对的工具了,就是阿里云团队开发的[Redis-full-check](https://github.com/aliyun/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](https://github.com/sohutv/cachecloud)是搜狐开发的一个面向Redis运维管理的云平台它**实现了主从集群、哨兵集群和Redis Cluster的自动部署和管理**,用户可以直接在平台的管理界面上进行操作。
针对常见的集群运维需求CacheCloud提供了5个运维操作。
* 下线实例:关闭实例以及实例相关的监控任务。
* 上线实例:重新启动已下线的实例,并进行监控。
* 添加从节点:在主从集群中给主节点添加一个从节点。
* 故障切换手动完成Redis Cluster主从节点的故障转移。
* 配置管理:用户提交配置修改的工单后,管理员进行审核,并完成配置修改。
当然作为运维管理平台CacheCloud除了提供运维操作以外还提供了丰富的监控信息。
CacheCloud不仅会收集INFO命令提供的实例实时运行状态信息进行可视化展示而且还会把实例运行状态信息保存下来例如内存使用情况、客户端连接数、键值对数据量。这样一来当Redis运行发生问题时运维人员可以查询保存的历史记录并结合当时的运行状态信息进行分析。
如果你希望有一个统一平台把Redis实例管理相关的任务集中托管起来CacheCloud是一个不错的工具。
## 小结
这节课我给你介绍了几种Redis的运维工具。
我们先了解了Redis的INFO命令这个命令是监控工具的基础监控工具都会基于INFO命令提供的信息进行二次加工。我们还学习了3种用来监控Redis实时运行状态的运维工具分别是Redis-exporter、redis-stat和Redis Live。
关于数据迁移我们既可以使用Redis-shake工具也可以通过RDB文件或是AOF文件进行迁移。
在运维Redis时刚刚讲到的多款开源工具已经可以满足我们的不少需求了。但是有时候不同业务线对Redis运维的需求可能并不一样直接使用现成的开源工具可能无法满足全部需求在这种情况下建议你基于开源工具进行二次开发或是自研从而更好地满足业务使用需求。
## 每课一问
按照惯例,我给你提个小问题:你在实际应用中还使用过什么好的运维工具吗?
欢迎在留言区写下你的思考和答案,我们一起交流讨论。如果你觉得今天的内容对你有所帮助,也欢迎你分享给你的朋友或同事。我们下节课见。