10

我有一个基于 Java 的 Web 应用程序,它部署在jboss-10.1.0(wildfly). 我正在使用 docker swarm 模式(docker version 1.12.1)来扩展我的应用程序,一切正常,但我面临的唯一问题是会话管理。

现在让我们来看场景。

我有两个实例正在为我的应用程序运行(即App1和使用此 URL 直接访问。App2nginxchintan.test.com:9080chintan.test.com:80chintan.test.com

现在默认负载均衡器正在使用 RR( Round-Robin algorithm) 来服务我的 Web 请求。所以当我第一次访问chintan.test.com它时,它会转到App1实例并显示登录页面,我使用凭据登录,几分钟后一切正常,它切换到App2并再次出现登录页面.

有什么方法或工具(应该是开源的)可以用来处理会话吗?所以至少我登录App1并坚持App1直到我注销。

谢谢!

4

3 回答 3

3

尝试使用 Nginx 和 HA-Proxy,但它们似乎都不能在 SWARM 模式下正常工作。然后我在 Docker Swarm 中使用了 Traefik,它帮了我大忙。唯一的限制是 Traefik 应该在管理节点上运行,因为它需要知道添加或删除的新工作节点。即使您扩大服务、添加节点等,也不需要重新启动。

我已经使用最新的Docker compose 版本 3测试了配置,并使用Docker stack deploy进行了部署。分步说明在这里

首先,您需要创建一个 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"

您可以点击此链接获取详细说明。

于 2017-06-06T15:52:15.910 回答
1

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

要实现粘性会话,您需要在 docker 内部实现一个反向代理,它支持粘性会话并通过容器 id 直接与容器通信(而不是对服务名称进行 DNS 查找,这将再次进入轮询负载平衡器)。实现该负载均衡器还需要您实现自己的服务发现工具,以便它知道哪些容器可用。

于 2017-04-13T14:08:30.813 回答
1

我认为在扩展环境中实现粘性会话的最佳方式是通过数据库会话存储。这会将您的应用程序与特定节点解开。

我认为这是一种比依赖 Docker Enterprise Sticky 会话更简单、更具成本效益的设置(https://docs.docker.com/datacenter/ucp/2.2/guides/user/services/use-domain-names-to-访问服务/#sticky-sessions)。

当然,这意味着一些应用程序调整,例如:

  • 出于性能原因最小化会话请求(特别是匿名用户避免 DoS)
  • 我会将会话数据存储在单独的数据库中(不是主应用程序数据库)
  • 会话数据应在一段时间后删除,因此您应该有一些工作定期删除旧会话数据
  • 等等。

这种技术还可以提供其他好处:

  • 如果您还匹配用户 IP/用户代理,则可能会提高安全性
  • 可以提高性能(因为数据库将能够避免磁盘访问)

希望这会有所帮助。

于 2019-03-10T06:57:01.410 回答