zookeeper Unable to read additional data from server sessionid 0x0

在SpringBoot项目中,使用Dubbo调用时遇到Zookeeper客户端报错:'Unable to read additional data from server sessionid 0x0'。问题原因是单个IP对Zookeeper服务器的连接数达到默认限制(10个)。解决方法包括检查服务器2181端口连接状态,确认配置文件`zoo.cfg`中`maxClientCnxns`参数是否设置,如果未设置或设置过低,可调整至60,并重启服务。

问题描述

项目是springboot 项目,通过dubbo 对各个模块进行调用,在项目启动的时候,zookeeper 客户端报如下错误。

Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect


原因分析:

先进入机器 telnet zookeeper 服务器机器

telnet 10.20.3.31 2181
Trying 10.20.3.31...
Connected to 10.20.3.31.
Escape character is '^]'.
Connection closed by foreign host.

可以看到其实2181 这个端口是通的,但刚连通就被服务器拒绝。
这个是时候换了另外一台机器,telnet zookeeper 主机 端口 发现zookeeper 主机没有被拒绝。

单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是60,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。

  1. 查看服务器2181端口已有连接数
[root@hdfs-10-18-0-31 ~]# netstat -tanp | grep 2181 | awk '{print $5}' | grep -E '([0-9]+\.){3}[0-9]+' -o | sort | uniq -c
11 10.20.3.31

netstat -tanp | grep 2181

查看具体具体应用和状态,发现10个连接是 ESTABLISHED 还有一个是TIME-WAIT 发现只有10个连接
进入 zookeeper conf/zoo.cfg 查看配置,发现 -maxClientCnxns 并未配置,
但配置initLimit=10。那按道理是最大连接应该60才对,还没到达上限
通过下面命令,确实只有10个连接。

cat /proc/net/nf_conntrack | grep 2181 | awk '{print $7}'|sort|uniq -c
10 src=10.20.3.31

netstat -tanp | grep 2181 查看启动进程有哪些,杀掉其中两个进程。
telnet zookeeper 主机 端口 不再被拒绝,重新启动启动失败的服务启动成功。现在可以判定是zookeeper 针对单个ip限制到10个,添加zoo.cfg 配置maxClientCnxns=60

解决 “unable to read additional data from server sessionid” 问题可以从以下几个方面入手: ### 检查服务器状态 确保 ZooKeeper 服务器正常运行,没有出现崩溃、资源耗尽等问题。可以查看服务器的日志文件,检查是否有异常信息。例如,在 Linux 系统中,可以通过以下命令查看 ZooKeeper 日志: ```bash tail -f /var/log/zookeeper/zookeeper.log ``` ### 检查网络连接 此错误可能是由于客户端与服务器之间的网络连接不稳定或中断导致的。需要检查网络配置,确保客户端能够正常访问服务器的端口。可以使用 `ping` 和 `telnet` 命令来测试网络连接: ```bash ping <server_ip> telnet <server_ip> <server_port> ``` ### 检查会话超时设置 会话超时可能会导致服务器关闭与客户端的连接。可以检查客户端和服务器的会话超时配置,确保它们设置合理。在 ZooKeeper 的客户端配置文件中,可以找到类似如下的配置: ```properties sessionTimeout=30000 ``` 这里的 `sessionTimeout` 表示会话超时时间,单位为毫秒。 ### 检查服务器负载 如果服务器负载过高,可能会导致无法及时处理客户端的请求,从而关闭连接。可以使用系统监控工具(如 `top`、`htop` 等)检查服务器的 CPU、内存和磁盘使用情况,必要时进行优化或扩展服务器资源。 ### 重启服务 在某些情况下,简单地重启 ZooKeeper 服务器和客户端服务可以解决问题。可以按照以下步骤重启服务: ```bash # 停止 ZooKeeper 服务器 zkServer.sh stop # 启动 ZooKeeper 服务器 zkServer.sh start ``` ### 检查防火墙设置 防火墙可能会阻止客户端与服务器之间的通信。需要确保防火墙允许客户端访问 ZooKeeper 服务器的端口。例如,在 Linux 系统中,可以使用以下命令开放端口: ```bash # 开放 ZooKeeper 默认端口 2181 sudo iptables -A INPUT -p tcp --dport 2181 -j ACCEPT ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值