【问题标题】:Load balancer and http download streams on docker swarmdocker swarm 上的负载均衡器和 http 下载流
【发布时间】:2017-11-18 19:36:37
【问题描述】:

我整理了一个架构,下面最好描述它的高层次

  • 五节点 docker swarm 集群
  • 假设我的 dockerized 微服务的 5 个实例在每个 swarm 节点上运行一个副本
  • 服务通过 REST 端点提供功能
  • 其中一个功能是下载,它们运行良好,我在 Scala/Play 框架中编写了一些代码,对服务进行了 docker 化并部署了它。
  • 我也知道,由于我使用 swarm ,它在内部为我执行每个请求的 LB。

我有一些关于 WebSocket 的问题,以及负载均衡器如何在下载过程中不破坏内容。

  1. 我开始下载 5GB 文件,它可以工作。我正在使用 HTTP 流或分块,我想这没关系。现在我的问题是,一旦我的 REST 下载端点被击中,TCP 连接保持打开状态,并且由于它是打开的,直到服务器关闭连接,因此群负载平衡不会干扰?简而言之,每次客户端请求 HTTP 调用时,swarm 都会对其进行负载平衡,但是一旦建立了 TCP 套接字(如特定下载示例的情况),请求将由一个节点提供服务,因为在下载过程中连接不会重新建立?
  2. 如果客户端打开一个 web socket,它会命中运行服务的 swarm 节点之一,并且 websocket 连接是打开的,同一个服务实例会推送通知吗?
  3. 如果由于某种原因 websocket 死掉了,客户端可能会建立一个新的连接,但请求可能会在某个其他服务实例上结束,并且会一直保持这种状态,直到再次建立新的连接?

以上3点在我的理解中是否正确?是否有一些阅读材料/博客我可以找到更多详细说明这一点?

【问题讨论】:

    标签: docker load-balancing docker-swarm


    【解决方案1】:

    可能使用 nginx 之类的代理 LB,ip_hash 模式

    指定组应使用负载平衡方法,其中请求根据客户端 IP 地址在服务器之间分配。客户端 IPv4 地址或整个 IPv6 地址的前三个八位字节用作散列密钥。该方法确保来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用。在后一种情况下,客户端请求将被传递到另一台服务器。很可能,它也将始终是同一台服务器。

    http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2017-07-27
      • 2018-01-03
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多