现象:
1 客户端连接不上,报连接超时

2 重启zk,无法启动,报Unreasonable length = 2246947


原因:
1 zk的maxClientCnxns(单个客户端最大连接数)为600,正常是够用的。
但是业务方部署在k8s上面,k8s的pod都是共用宿主机资源,对于zk来说都是一个ip客户端(宿主机)
这就导致了ClientCnxns有可能大于600

2 Unreasonable length = 2246947错误是因为zk的datalog事物日志记录中有某一条record大小超过了jute.maxbuffer。zk重启的时候都需要加载datalog事物日志,来恢复没有序列化的数据(存在内存中),这时就报错了

造成事物日志的record大小超过了jute.maxbuffer,可能的原因:

并发场景下 客户端代码,读取了大量的不同znode的数据,然后使用了事务,将多个znode的数据打包一起发送,体积超过了1MB。

解决方案
1 修改jute.maxbuffer(单位字节), 但是存在隐患。如果buffer=2M,客户端的程序也需要设置jute.maxbuffer为2M。如果数据没有达到2M,只是为了正常启动,那也是没问题的。

2 删除有问题的datalog事物日志,但是会丢失部分内存中的数据

3 删除整个data ,这个方案就相当于重新搭建一个zk

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐