下午的时候同事反映Druid连接池无法登录,随后查看现象为:
- 服务无异常。
- 使用账号密码登录Druid后,http状态为302,跳转回登录页面。
- 后台无日志输出。
初步判断是账号密码不正确,或者白名单没有设置。
检查了账号密码,与白名单发现没有问题。
于是查看以前的项目,发现配置和之前的几个项目相同,而其他项目并无异常。
回忆项目之间的差别:
- 项目使用了Docker搭建。
- 项目为分布式服务。
- Docker容器部署在同一台VM中,为了避免端口冲突所以直接使用一个Nginx容器从内部使用Docker交换机做负载均衡。
逐步分析后猜测:
- Nginx给Druid监控做了负载均衡
- 负载均衡导致单个实例的Cookie失效
- 产生重复登录现象
验证:
干掉了一台服务后重新尝试登录,发现登录成功。
分析:Druid是针对单个实例的监控,理应直接访问单个服务的监控页面,无需负载均衡。
解决方案:由于无法将端口映射至宿主VM,所以拟采用url参数的访问方式,使用http://{ip}/{instance_id}/druid/*
的方式,根据实例id将请求分发至不同的容器,达到访问指定容器的目的。
网友评论