Redis 实用小技巧——谁动了我的 Redis ?
前几天写了一篇文章《谁动了我的 MySQL ?》,反响还不错。于是心血来潮,把之前遇到的另一个类似的问题整理出来,分享给大家,希望对用到的小伙伴有所帮助。
背景#
与溯源 MySQL 的调用端场景类似,这个问题也是出现在我们的开发环境中。Redis 服务部署在测试环境,除了测试环境的程序连接 Redis 之外,开发小伙伴为了调试方便,也会在自己的本地环境连接测试环境的 Redis,这就会造成一个问题:有时候不知道 Redis 的数据到底是被『谁』修改的,这该如何是好呢?
处理思路#
处理这种『谁是凶手』的问题,一般都是考虑从『留痕』方面入手。
MySQL 是通过 binlog
来反向推理,那么 Redis 呢?Redis 有没有可以追踪到命令执行痕迹的地方呢?
有,monitor
。
经常操作 Redis 的小伙伴对这个命令肯定不会陌生,在日常调试和问题定位的时候往往能起到立竿见影的效果。这里借用使用文档中的例子来看一下它的用法:
127.0.0.1:6379> MONITOR
OK
# 以第一个打印值为例
# 1378822099.421623 是时间戳
# [0 127.0.0.1:56604] 中的 0 是数据库号码, 127... 是 IP 地址和端口
# "PING" 是被执行的命令
1378822099.421623 [0 127.0.0.1:56604] "PING"
1378822105.089572 [0 127.0.0.1:56604] "SET" "msg" "hello world"
1378822109.036925 [0 127.0.0.1:56604] "SET" "number" "123"
1378822140.649496 [0 127.0.0.1:56604] "SADD" "fruits" "Apple" "Banana" "Cherry"
1378822154.117160 [0 127.0.0.1:56604] "EXPIRE" "msg" "10086"
1378822257.329412 [0 127.0.0.1:56604] "KEYS" "*"
1378822258.690131 [0 127.0.0.1:56604] "DBSIZE"
从输出信息中我们可以看到,输出信息中包含了调用客户端的的 IP
和 端口号
,通过这两个信息,我们就可以定位到是哪台机器执行的命令了。
根据端口号定位调用程序的命令如下:
lsof -i:{端口号}
在输出中可以看到调用程序的 PID
,然后根据 PID
定位到具体的程序:
ps -p {pid} -f
有时如果公司是同一个公网
IP
的话,这时候只能根据端口号的占用情况在本地机器上进行排查了,只是麻烦了点。
在实际应用中,如果 Redis 操作命令频繁的话, monitor
记录的日志数量会很多,不方便直接查阅。我们一般会先将 monitor
内容输出到日志中,命令如下:
redis-cli monitor > ~/redis.log
然后使用 Linux grep
命令进行排查分析就可以了。
cat ~/redis.log | grep '{关键字}'
题外话#
在开发环境中,尽量不要在本地环境直连测试环境的 Redis ,因为这会导致在本地进行开发过程中,直接修改测试 Redis 的数据。
本地开发的过程中,操作都比较随意,可能会因为自己本地随意的调试行为,让正在使用测试环境的人痛苦不堪,特别是在本地监听 Redis 队列时。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: