4

我有一个基于Java的web应用程序,部署在jboss-10.1.0(wildfly)。我正在使用docker swarm模式(docker版本号1.12.1)来扩展我的应用程序,一切正常,但我唯一面临的问题是会话管理。如何使用Docker群维护粘性会话(会话持久性)?

现在让我们来看看场景。

我有两个实例运行我的应用程序(即App1App2)。我现在用的码头工人群模式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,直到我注销。

谢谢!

+0

我强烈建议你不要有状态的应用程序,如果你想按照你的规模进行扩展。将会话存储在单独的组件中是更好的解决方案。 – Robert

回答

1

Docker swarm目前不支持粘性会话,循环是通过其暴露的端口来访问服务的唯一方式。

要实施粘性会话,您需要在docker内实现一个支持粘性会话的反向代理,并通过其容器标识直接与容器通信(而不是在服务名称上进行DNS查找,循环负载均衡器)。实现该负载平衡器还需要您实施自己的服务发现工具,以便知道哪些容器可用。

+0

感谢您回答@bmitch!您能否建议我应该使用哪个反向代理进行Docker群中的粘性会话以直接与我的容器进行通信? –

1

尝试使用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" 

您可以​​进行了详细的说明图像。

+0

粘滞会话目前没有在群集模式下使用traefik:https://github.com/containous/traefik/issues/1024 – BMitch

+0

我已经测试过它,它为我工作..查看他们的官方文档 https:/ /docs.traefik.io/user-guide/swarm-mode/ 我甚至完成了屏幕截图并上传了一段视频。 https://www.youtube.com/watch?v=LBG0gnxe7Xc – Abhi

+0

Traefik不再执行http层负载均衡,但是docker会在下一个tcp连接上循环执行tcp层。这看起来像这样的原因是因为浏览器保持请求之间打开tcp连接。 Curl是一个更好的测试工具。 https://forums.docker.com/t/swarm-is-not-round-robin-routing-requests/18483/6 – BMitch