4

jboss-10.1.0(wildfly)에 배포 된 Java 기반 웹 응용 프로그램이 하나 있습니다. 나는 응용 프로그램을 확장하기 위해 docker swarm mode (docker version 1.12.1)를 사용하고 있습니다. 그러나 모든 것이 완벽하게 작동하지만 현재 직면하고있는 유일한 문제는 세션 관리입니다.docker swarm과 (과) 끈적 세션 (세션 지속성)을 유지하는 방법은 무엇입니까?

이제 시나리오를 살펴 보겠습니다.

나는 두 개의 인스턴스 내 응용 프로그램 (예 : App1App2) .I이 chintan.test.com:9080에서 내가 쓸 필요가 없습니다 chintan.test.com:80에 내 응용 프로그램을 리디렉션 nginx와 고정 표시기 떼 모드에서 제공하는 기본로드 밸런서를 사용하고 위해 실행 한 내 URL이있는 아래쪽 포트로이 URL chintan.test.com에 직접 액세스 할 수 있습니다.

이제 기본 부하 분산 장치는 스위치의 내 웹 내가 그것을 내가 자격 증명으로 로그인 App1 인스턴스와 디스플레이 로그인 페이지로가는 chintan.test.com 방문하여 모든 몇 분 후 완벽하게 작동 처음 request.So 봉사하는 RR ( Round-Robin algorithm)를 사용한다 App2에 로그인 페이지가 다시 나타납니다.

세션을 처리하는 방법이나 도구 (오픈 소스 여야 함)가 있습니까? 그래서 최소한 App1에 로그인하고 로그 아웃 할 때까지 App1에 붙어 있습니다.

감사합니다.

+0

스케일 작업을 원한다면 상태 기반 응용 프로그램을 사용하지 말 것을 강력히 권장합니다. 세션을 분리 된 구성 요소에 저장하는 것이 더 나은 솔루션입니다. – Robert

답변

1

Docker swarm은 현재 고정 세션을 지원하지 않으므로 노출 된 포트를 통해 서비스에 접근하는 유일한 방법은 라운드 로빈입니다.

고정 세션을 구현하려면 고정 세션을 지원하는 고정 표시기 내부의 역 프록시를 구현하고 컨테이너 ID로 컨테이너에 직접 통신해야합니다 (다시 갈 서비스 이름에 대해 DNS 조회를하는 대신 라운드 로빈로드 밸런서). 로드 밸런서를 구현하려면 사용 가능한 컨테이너를 알 수 있도록 고유 한 서비스 검색 도구를 구현해야합니다.

+0

@bmitch 답변 주셔서 감사합니다!제 부두 안의 끈적 끈적한 세션에 어떤 역방향 프록시를 사용해야 컨테이너에 직접 통신 할 수 있는지 제안 해 주시겠습니까? –

1

Nginx 및 HA-Proxy를 사용해 보았지만 SWARM 모드에서는 잘 작동하지 않는 것으로 보입니다. 그런 다음 Docker Swarm에서 Traefik을 사용했고 나에게 트릭을 보냈습니다. 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" 

할 수 있습니다 follow this link을 필요로하는 이미지처럼 보이는 방법이다.

+0

sticky 세션은 현재 swarm 모드에서 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 계층 부하 분산을 수행하지 않지만 도커는 다음 tcp 연결에서 tcp 계층 라운드 로빈을 수행합니다. 브라우저가 요청간에 tcp 연결을 열어두기 때문에 이것이 작동하는 이유는 다음과 같습니다. 컬은 이것을위한 더 나은 테스트 도구입니다. https://forums.docker.com/t/swarm-is-not-round-robin-routing-requests/18483/6 – BMitch