使用 Wireshark 排查 Redis 连接问题
今天在通过Redis Insight登录公司的一个Redis cluster时,发现一个有意思的问题,于是来记录一下.
背景
Redis Insight是一个Redis.io公司下的一个GUI软件,可以用来连接Redis并进行操作。我想登录的Redis是一个集群,集群中Redis的版本是 5.0.4。我通过 redis-cli 能够登录上集群,但是通过Redis Insight就报错。
为了在家里复现这个情况,我在本地起了一个docker容器.可以看到我容器的版本是5.0.4,密码是dididi。
然后通过Redis Insight连接这个Redis,发生了报错

可以看到,我帐号或者密码错了。这个时候,其实冷静点的话,能分析出来是什么问题,要么是用户名不对,要么是密码不对。但是巧的是,我前几天才通过Docker部署了一个redis:latest的容器,但不是集群版本,是单机版。这个容器通过Redis Insight是可以正常使用的。于是这里我开始怀疑是不是Redis Insight不支持集群模式。这里就开始走了弯路,后面无路可走的时候,我甚至尝试过把username改成root,但是就是忘记试一试不写用户名是怎么样。后面的事实证明这个用户名在低版本中应该不填写才对。
这里为了重现之前高版本的Redis可以连接的场景,我又在本地起一个 redis:6-alpine 的docker容器

可以看到确实是通过Redis Insight连接成功了。

但是当时因为受到之前部署redis:6-alpine镜像成功的干扰,然后在Redis Insight 中也没看到日志,导致排查没了思路。正好这几天在学Wireshark,于是我就想既然Redis Insight没有日志。那么抓个包分析说不定能有什么有用的信息。于是我打开了Wireshark,在Redis Insight重新点击登录,然后我抓到了下面的包。
这里可以看到wireshark并没有把我们的包解析成Redis协议。我们需要做一点小小的配置。随便找一个包,然后右键,Decode as,选择RESP
然后,我们就能看到了报错了。
,
往回找几个包,这里能看到我们执行了
auth default dididi
然后Redis返回了ERR wrong number of arguments for 'auth' command。到这里,事情就比较顺利了。我把这个报错信息和Redis版本给了Grok分析,一下就找到原因了。Redis 5.0.4 版本是不支持auth username password,只支持 auth password格式的。所以我们在Redis Insight中填写用户名是没有意义的,反而导致了报错。

解决方案
到这里就很简单了,把username去掉就可以连接了。

总结
这个事情事后看起来其实很简单:其实报错信息已经说很清楚了,就是用户名和密码错了。但是因为自己前几天部署了一个高版本的Redis,有了思维惯性,导致没有仔细分析报错。
不过整个分析排查过程还是很有意思。通过Wireshark找到了问题所在,对于通过网络交互的程序,如果有问题,抓包分析是个好办法。
如果后面遇到其他的问题,也会更多的把Wireshark拿出来使用。