如何使用Docker群维护粘性会话(会话持久性)?
我有一个基于Java的web应用程序,部署在jboss-10.1.0(wildfly)
。我正在使用docker swarm模式(docker版本号1.12.1
)来扩展我的应用程序,一切正常,但我唯一面临的问题是会话管理。如何使用Docker群维护粘性会话(会话持久性)?
现在让我们来看看场景。
我有两个实例运行我的应用程序(即App1
和App2
)。我现在用的码头工人群模式nginx
提供的缺省负载均衡到我的应用程序从重定向到chintan.test.com:9080
这样chintan.test.com:80
我不需要写下载端口与我的网址,我可以直接访问此网址chintan.test.com
。
现在默认的负载平衡器使用RR(Round-Robin algorithm
)为我的网站request.So我第一次参观去App1
实例,并显示登录页面我的凭证登入chintan.test.com
一切几分钟后完美的作品它的开关到App2
,并再次登录页面。
有什么办法或工具(应该是开源的)通过我处理会话?因此,至少我登录到App1
并坚持到App1
,直到我注销。
谢谢!
Docker swarm目前不支持粘性会话,循环是通过其暴露的端口来访问服务的唯一方式。
要实施粘性会话,您需要在docker内实现一个支持粘性会话的反向代理,并通过其容器标识直接与容器通信(而不是在服务名称上进行DNS查找,循环负载均衡器)。实现该负载平衡器还需要您实施自己的服务发现工具,以便知道哪些容器可用。
感谢您回答@bmitch!您能否建议我应该使用哪个反向代理进行Docker群中的粘性会话以直接与我的容器进行通信? –
尝试使用Nginx和HA-Proxy,但没有一个似乎在SWARM模式下工作得很好。然后我在Docker Swarm中使用了Traefik,它为我做了一个窍门。唯一的限制是Traefik应该在管理器节点上运行,因为它需要知道添加或删除的新工作器节点。它不需要重新启动也即使您扩展业务,增加节点等
我已经测试与泊坞窗的配置组合版本3这是最新的,并使用泊坞栈部署部署。 Step by step instructions are over here
首先,您需要创建一个docker-compose.yml(版本3)并添加负载均衡器Traefik Image。这是怎么看起来像
loadbalancer:
image: traefik
command: --docker \
--docker.swarmmode \
--docker.watch \
--web \
--loglevel=DEBUG
ports:
- 80:80
- 9090:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
restart_policy:
condition: any
mode: replicated
replicas: 1
update_config:
delay: 2s
placement:
constraints: [node.role == manager]
,然后在您需要的会话粘性
whoami:
image: tutum/hello-world
networks:
- net
ports:
- "80"
deploy:
restart_policy:
condition: any
mode: replicated
replicas: 5
placement:
constraints: [node.role == worker]
update_config:
delay: 2s
labels:
- "traefik.docker.network=test_net"
- "traefik.port=80"
- "traefik.frontend.rule=PathPrefix:/hello;"
- "traefik.backend.loadbalancer.sticky=true"
您可以进行了详细的说明图像。
粘滞会话目前没有在群集模式下使用traefik:https://github.com/containous/traefik/issues/1024 – BMitch
我已经测试过它,它为我工作..查看他们的官方文档 https:/ /docs.traefik.io/user-guide/swarm-mode/ 我甚至完成了屏幕截图并上传了一段视频。 https://www.youtube.com/watch?v=LBG0gnxe7Xc – Abhi
Traefik不再执行http层负载均衡,但是docker会在下一个tcp连接上循环执行tcp层。这看起来像这样的原因是因为浏览器保持请求之间打开tcp连接。 Curl是一个更好的测试工具。 https://forums.docker.com/t/swarm-is-not-round-robin-routing-requests/18483/6 – BMitch
我强烈建议你不要有状态的应用程序,如果你想按照你的规模进行扩展。将会话存储在单独的组件中是更好的解决方案。 – Robert