前提
截止2021-07-29,各帖子文章解决zookeeper not connected的方法仍不全面,特别是面对通过Docker-Compose部署的Zookeeper、高版本的Zookeeper、高版本的Dubbo等情况,完全没有资源,因此我来撰写一篇
栈
CentOS 8
Docker-Compose
Zookeeper 3.7.0
Dubbo 3.0.1
SpringBoot 2.5.2
application.yml
1、Dubbo Timeout
(1) dubbo.config-center.timeout
这个timeout默认是6000(ms),将其改大些,是最常见的解决方法
但仅此1个方法对于我的这台老爷爷机器完全不够
(2) dubbo.registry.timeout
也需要修改这个timeout
添加的内容如下(如果已经有dubbo:
,则在dubbo的范围内直接添加最后4行即可):
dubbo:
registry:
timeout: 30000
config-center:
timeout: 30000
2、tickTime
(1)
tickTime: Zookeeper的基本时间单位,tickTime的默认值是3秒,即3000ms
minSessionTimeout: 自从Zookeeper3.3.0后,启动Zookeeper,服务器允许与客户端协商的最小会话超时(ms)
maxSessionTimeout: 自从Zookeeper3.3.0后,启动Zookeeper,服务器允许与客户端协商的最大会话超时(ms)
(2)
而minSessionTimeout、maxSessionTimeout的时间长度都以tickTime为单位,minSessionTimeout默认为2个tickTime,maxSessionTimeout默认为20个tickTime
(3)
那为了防止超时导致的zookeeper not connected,就要对默认的tickTime进行修改(毕竟minSessionTimeout、maxSessionTimeout依赖于tickTime,单单需改tickTime即可)
(4)
tickTime在Zookeeper的配置文件zoo.cfg中,既然是通过Docker部署的Zookeeper,又需要使用配置文件,那配置文件的目录挂载少不了
(5)
先找出zoo.cfg在容器中的路径,通过一下方法查找:
find / -name zoo.cfg
查找到的路径为(中间那段乱乱的数字为容器ID,太长了影响观看,我给删短了再贴上来):
/var/lib/docker/overlay2/5c4fbc/diff/conf/zoo.cfg
可见Zookeeper容器中的zoo.cfg路径为:/conf/zoo.cfg(从diff开始都与容器目录无关,其他容器也是如此)
(6)
据此在宿主机中自定义的目录下创建zoo.cfg,在docker-compose.yml中与容器的zoo.cfg路径挂载起来(这里就不贴出来了)
创建的zoo.cfg:
dataDir=/data
dataLogDir=/datalog
tickTime=30000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
server.1=localhost:2888:3888;2181
audit.enable=true
3、Zookeeper disable改为enable
Zookeeper 3.7.0默认是disable的(我的说法不准确,随便康康就行),因此要让它跑起来,同在zoo.cfg中添加修改即可,修改的内容就在上方的zoo.cfg中有写,即:audit.enable=true