1. 官方配置文档
2. maxClientCnxns
表示并发连接数,默认值是60,设为0则完全消除并发连接的限制。
工作中,就遇到相关问题,由于设备日志量大,需要增加 kafka 分区和 storm 的 spout 数量,当 spout 线程数设置30个,并发去 kafka 上拿数据时,supervisor 报以下 zookeeper 报错:
2022-08-02 16:26:42.913 o.a.s.s.o.a.z.ClientCnxn Thread-232-spout-device-log-topic_TxId-executor[94 94]-SendThread(zookeeper-0.zookeeper.default.svc.cluster.local:2181) [WARN] Session 0x0 for server zookeeper-0.zookeeper.default.svc.cluster.local/2.33.98.202:2181, unexpected error, closing socket connection and attempting reconnect java.io.IOException: Connection reset by peer at sun.nio.ch.FileDispatcherImpl.read0(Native Method) ~[?:1.8.0_222] at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) ~[?:1.8.0_222]
解决办法很简单,重做docker镜像,设置 maxClientCnxns=0。
3. autopurge.snapRetainCount 和 autopurge.purgeInterval
客户现场发现 zookeeper 日志特别大,后来通过设置以下两个参数得以解决:
# 设置保留多少个snapshot,之前的则删除 autopurge.snapRetainCount=3 # 设置多少小时清理一次 autopurge.purgeInterval=1
客户端在与zookeeper交互过程中会产生非常多的日志,而且zookeeper也会将内存中的数据作为snapshot保存下来,这些数据是不会被自动删除的,导致磁盘中这样的数据就会越来越多,以上两参数就是解决此问题。
4. tickTime、minSessionTimeout、maxSessionTimeout
tickTime 表示一个滴答声,默认值是2000(即2秒),minSessionTimeout 默认值是2个滴答声(即4秒),maxSessionTimeout 默认值是20个滴答声(即40秒)。客户端设置的会话超时时间必须在这个两个值之间,否则就会强制使用 minSessionTimeout 或 maxSessionTimeout 值。
在客户那流量大时 supervisor 日志出现了错误:
device-operaion-xx-executor client session timed out, have not heard from server in 13600ms for session id ,closing socket connection adn attempting reconnect
随后状态变为 suspended,这就是会话超时导致的。然后我在 supervisor 的 storm.yaml 中加入了 storm.zookeeper.session.timeout: 80000,重启 supervisor 后,开头打印出的日志显示此配置是生效的,但后面的日志却又回到了 20000,有点奇怪。
后来我是直接通过改ZK服务器,设置 minSessionTimeout 和 maxSessionTimeout 都为 80000,即忽视客户端任何设置,强制使用ZK服务器配置才搞定的。
相关错误网上也有很多:参考1,参考2。
5. forceSync
设置 forceSync=no 对写请求的性能提升很有帮助,是指每次写请求的数据都要从pagecache中固化到磁盘上,才算是写成功返回。当写请求数量到达一定程度的时候,后续写请求会等待前面写请求的 forceSync 操作,造成一定延时。为追求低延时的写请求,可以配置 forceSync=no,这样数据写到缓存就立即返回,但是机器断电的时候,缓存中数据会丢失。
数据量大时会遇到警告:fsync-ing the write ahead log in SyncThread:0 took 1172ms which will adversely effect operation latency,可能会引发与客户端的 Session 超时。设置 forceSync=no 后就不会有此警告了。相关参考
另外官方推荐将 dataLogDir 和 dataDir 分磁盘配置,以防止由于日志落地磁盘与其他进程产生竞争(生产环境未用到)。