Board logo

标题: 从Redis连接池获取连接失败的原因说起(2) [打印本页]

作者: look_w    时间: 2019-2-20 19:02     标题: 从Redis连接池获取连接失败的原因说起(2)

通过wireshark查看TCP包并确定问题原因

熟悉redis的同学都知道,redis客户端发送“PING”后服务端会返回一个“PONG“作为回应,一般会作为连接的检验方法。
既然校验报错,那抓包看看请求和响应吧!

首先查看网卡编号ip a
再使用tcpdump对eth1网卡的6379端口数据抓包。

tcpdump -i eth1 port 6379 -w target.cap

最后使用wireshark对target.cap进行分析,可借助wireshark的redis插件进行分析。
根据应用错误日志打印的时间,查询到此时客户端(应用服务器)向服务端(redis服务器)发送了一个RST包。
931112-bead9d9881bf7bad.png


感觉是有问题的。就往上查了下。
931112-d87a1c7f60d4b362.png


可以看到,箭头位置上方客户端发送了PING命令,箭头位置应该返回客户端一个PONG作为响应。而是返回了以下信息:

    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

意思是,redis服务端配置了RDB快照持久化,但当前不能进行持久化。有可能修改数据集的命令都被禁用了。(但是通过看源码发现,除了涉及修改的命令,PING也在禁用之列,redis-3.2.9 server.c,而读取涉及的命令应该不会受到影响)
以下代码是redis-3.2.9 server.c中in processCommand(client *c)发生持久化异常后的处理代码

    /* Don't accept write commands if there are problems persisting on disk
         * and if this is a master instance. */
        if (((server.stop_writes_on_bgsave_err &&
              server.saveparamslen > 0 &&
              server.lastbgsave_status == C_ERR) ||
              server.aof_last_write_status == C_ERR) &&
            server.masterhost == NULL &&
            (c->cmd->flags & CMD_WRITE ||
             c->cmd->proc == pingCommand))
        {
            flagTransaction(c);
            if (server.aof_last_write_status == C_OK)
                addReply(c, shared.bgsaveerr);
            else
                addReplySds(c,
                    sdscatprintf(sdsempty(),
                    "-MISCONF Errors writing to the AOF file: %s\r\n",
                    strerror(server.aof_last_write_errno)));
            return C_OK;
        }

之后客户端发送QUIT命令退出,服务器返回OK响应退出成功。
那个返回的配置错误信息是说在持久化RDB时出现了问题。于是到redis服务器上看了下磁盘信息和redis的日志,果然,磁盘空间不足了。
931112-ca709eafb2678a56.png
linux_df.png

到此,问题基本查明,是由于redis所在服务器磁盘不足导致,由于是测试服务器,也没有配置磁盘的监控。腾出空间后即可恢复。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0