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