haproxy : 앱 세션을 시작하지 않고 서버 유지 관리를 준비하는 방법?


13

문제

웹 서버의로드 밸런싱을 위해 haproxy를 사용하고 있습니다. 일부 응용 프로그램은 세션 파일을 사용하고 서버간에 동기화되지 않으므로 추가 쿠키와 함께 세션 지속성을 사용합니다.

유지 관리를 위해 서버를 비활성화하고 싶지만 세션을 중단하지 않습니다. 따라서 기존 클라이언트가 응용 프로그램 세션을 계속하도록 허용하고 싶지만 새 클라이언트는 허용하지 않습니다.

haproxy 행동

  • 서버를 "유지 보수"로 설정했습니다
  • 클라이언트에 쿠키가 설정되어 있으면 "유지 보수"로 표시되어 있어도 서버를 사용하십시오
  • 쿠키가없는 새 클라이언트가 오면 다른 서버로 연결됩니다
  • 모든 클라이언트가 응용 프로그램 세션을 종료하면 더 이상 클라이언트가이 특정 서버에 쿠키를 설정하지 않게되므로 사용자 중단없이 쿠키를 종료하는 것이 좋습니다.

일부 haproxy 구성으로 이것이 가능하다고 생각하십니까? 아니면 그것을 할 수있는 영리한 방법이 있습니까?

다른 방법들

이 요구를 달성하기위한 다른 방법의 전체 목록 :

  • 서버 간 세션 파일 동기화 (여러 서버 또는 공통 단일 마운트 지점간에 파일을 동기화하는 방법 필요)
  • 데이터베이스를 사용하여 세션 정보 저장 (응용 프로그램 동작 변경 필요)

자세한 내용은

이런 종류의 구성을 사용합니다.

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

방금 SRV1을 비활성화하면 (haproxy cli 명령 사용) SRV1에서 열린 모든 응용 프로그램 세션이 현재 HTTP "세션"이 끝난 후 중단 될 것으로 생각합니다. 맞습니까?


서버가 HTTP 모드 또는 TCP 모드로 실행 중입니까?
Austinian

1
@ 오스틴; 쿠키를 기반으로 밸런싱 및 지속성에 대해 어떻게 말하는지 http 모드 일 가능성이 높습니다 (TCP 모드는 이러한 기능을 제공하지 않음).
GregL

@Christophe, 실제로 작동해야하기 때문에 '하프 프록시 동작'섹션에 설명 된 구성을 실제로 사용해 보셨습니까?
GregL

@GregL, 맞습니다. 저도 그렇게 생각하고 있습니다. HTTP 모드를 사용 중이고 서버를 유지 관리 모드로 설정 한 경우 새 세션 수락을 중지하지만 만료 될 때까지 유효한 세션을 유지합니다. TCP 모드에서 쿠키 등을 계속 사용할 수 있지만 HAProxy에 아무런 의미가 없습니다.
Austinian

@Christophe, 유지 보수 시간을 단축하기 위해 "보다 영리한 방법"을 사용하려고합니까?
Austinian

답변:


6

웹 관리 인터페이스를 사용하여 서버를 드레인 모드로 설정하십시오. 그것은 당신이 찾고있는 정확한 기능을 제공합니다.


3
당신이 MAINT로 설정하면 전송을 중지 것 어떤 명시된 바와 같이, 그것은 트래픽을 여기에 . 오히려,이를 드레인 모드로 설정하고 stick-table만료와 함께 지속성을 제공하고자합니다.
GregL

@GregL, 죄송합니다, 지금 수정
Austinian

답변 해주셔서 감사합니다. austinian과 @GredL. 나는 그것을 시도 할 것이다. 어려운 부분은 스틱 테이블에있을 것이라고 생각합니다. 쿠키가 드레인 모드 서버로 설정된 모든 클라이언트를이 스틱 테이블에 저장하는 방법을 찾아야합니다.
Christophe Drevet-Droguet

글쎄, 내 경우에는 배수 모드로 충분하고 이미 쿠키 세트가있는 세션은 여전히 ​​배수 서버를 사용하며 새 세션은 다른 서버로 연결됩니다.
Christophe Drevet-Droguet

1
웹 인터페이스에서 모드를 어떻게 변경합니까? 정보를 제공하는 것 같습니다.
kagronick

9

socat 을 사용 하여 haproxy 구성과 통신하는 경우 서버를 다음과 같은 드레인 상태로 만들 수 있습니다.

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

더 많은 명령이 있습니다 ! 우분투에서 socat을 설치하려면이 답변으로 이동하십시오

haproxy 1.6.3 버전으로 테스트했습니다. :)


1

다른 방법들

서버 간 세션 파일 동기화 (여러 서버 또는 공통 단일 마운트 지점간에 파일을 동기화하는 방법 필요)

백엔드 서버가 애플리케이션에 PHP를 사용하는 경우 Memcache를 사용하여 세션을 동기화 할 수 있습니다.

또한 Couchbase-Server즉시 memcache 복제를 수행 할 수 있습니다.
물론 세션 복제를 위해 couchbase-server를 사용하는 것은 과도합니다. :)


더 좋은 방법이지만 코드 변경이 필요하다고 생각합니다. 세션을 동기화하지 않는 현재 응용 프로그램에 대해 Austinian과 GregL을 사용하겠습니다.
Christophe Drevet-Droguet

코드에서 사용자 정의 세션 핸들러를 설정하지 않은 경우 세션에 memcache를 사용하기 위해 PHP에 대한 코드를 변경할 필요가 없습니다. 코드가 아닌 php.ini에 모두 구성되어 있습니다.
Cha0s

좋아, Cha0s, 내가 볼게
Christophe Drevet-Droguet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.