SSL을 밸런싱하는 수평 확장 가능 소프트웨어로드 밸런서의 예가없는 이유는 무엇입니까?


9

ssl, 로컬 세션 및로드 밸런싱에 관한 많은 질문이 상호 연결되어있는 것으로 보이 므로이 질문의 길이에 대해 미리 사과드립니다.

파일 기반 세션을 사용하는 웹 사이트가 있습니다. 사이트의 특성상 대부분은 http이지만 일부 섹션은 SSL입니다. 현재 파일 기반 세션으로 인해 모든 SSL 요청이 이전 http 요청과 동일한 서버에 충돌해야합니다.

시간 제약으로 인해 증가 된 http 및 ssl 트래픽을로드 밸런싱하는 가장 쉬운 방법을 원합니다.

고정로드 밸런싱 알고리즘에는 두 가지 옵션이 있습니다.

  • IP 기반
  • 쿠키 기반

ip 기반 솔루션은 작동하지만 해시 알고리즘은 서버가 다운되거나 추가 될 때 사용자가 이동하는 서버를 잠재적으로 변경하여 현재 파일 기반 세션 설정에서 바람직하지 않습니다. 또한 웹 사이트를 탐색하는 동안 사용자가 합법적으로 IP를 변경할 수 있다고 가정합니다.

쿠키 기반 알고리즘은 더 좋아 보이지만 ssl에 의해 암호화 될 때 쿠키를 검사 할 수 없으면 자체 문제가있는 것 같습니다.

나는 SSL을로드 밸런싱하는 방법에 대한 예를 찾고 있으며 쿠키 기반로드 밸런싱을 수행하고 다른 ssl 디코더를 추가하여 증가 된 ssl로드를 처리 할 수있는 설정의 명시 적 예를 찾을 수없는 것 같습니다.

내가 본 명시 적 예제의 대부분에는 브라우저 클라이언트와로드 밸런서 사이에 ssl 디코더 (일반적으로 하드웨어, apache_mod_ssl 또는 nginx)가 있습니다. 예제는 일반적으로 다음과 같은 것 같습니다 ( http://haproxy.1wt.eu/download/1.3/doc/architecture.txt 에서 수정 됨 ).

      192.168.1.1 192.168.1.11-192.168.1.14
 ------- + ----------- + ----- + ----- + ----- +
        | | | | |       
     +-+-+ +-+-+ +-+-+ +-+-+ +-+-+    
     | LB1 | | A | | B | | C | | D |    
     + ----- + + --- + + --- + + --- + + --- +    
     아파치 4 저렴한 웹 서버
     mod_ssl
     하프시 

위 예제에서 ssl 디코딩 부분은 수평으로 확장 할 수없는 잠재적 병목 현상 인 것 같습니다.

haproxy를 살펴본 결과 다음과 같은 것을 허용하는 'mode tcp'옵션이있는 것 같습니다. 여러 개의 SSL 디코더를 가질 수 있습니다.

              하프시
                 |
            -------------
            | |
ssl-decoder-1 ssl-decoder2
            | |
        -------------------
        | | |  
      web1 web2 web3

haproxy가 SSL을 디코딩되지 않기 때문에, 이러한 설정에서, 당신이 클라이언트 IP를 잃게 나타납니다 https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -에 대한

또한 nginx를 살펴 보았으며 수평 확장 가능한 ssl-decoders의 명시 적 예도 보지 못했습니다. 잠재적 인 병목 현상으로 nginx를 가진 사람들의 많은 사례가있는 것 같습니다. 그리고 적어도이 링크는 nginx가 "백엔드에 TCP 연결을 투명하게 전달하는 것을 지원하지 않는다"고 말함으로써 ip를 잃는 haproxy와 같은 설정 옵션을 가지고 있지 않다고 제안하는 것 같습니다. Apache를 전달하는 방법 SSL 트래픽 트로프 nginx 프록시? .

질문 :

  • 트래픽 증가를 처리하기 위해 더 많은 SSL 디코더를 추가하는 설정의 예가 더없는 것 같습니다.
  • ssl 디코딩 단계는 단지 이론적 인 병목 현상이며 실제로 말 그대로 트래픽이 많은 사이트를 제외하고 하나의 디코더로 충분할까요?
  • 염두에 두어야 할 또 다른 해결책은 아마도 증가 된 SSL 요구 사항을 가진 사람은 중앙 집중식 세션 저장소를 가지고 있기 때문에 클라이언트가 순차적 요청에서 어떤 웹 서버에 충돌하는지는 중요하지 않습니다. 그런 다음 모든 웹 서버에서 mod_ssl 또는 이와 동등한 기능을 사용할 수 있습니다.
  • 위에서 언급 한 haproxy 솔루션은 작동하는 것처럼 보이지만 (클라이언트 IP 문제 외에) 클라이언트 IP를 유지하면서 디코더 수를 늘려 작동하는 고정 쿠키 기반 소프트웨어로드 밸런서 솔루션을 가진 사람이 있거나 기술적으로 그렇지 않은 사람도 있습니다. 클라이언트 IP를 얻기 위해 요청을 디코딩해야하기 때문에 디코더 병목 현상이 발생할 수 있습니다.

내가 말한 모든 것이 사실이라고 가정하면, 이것들은 나의 선택으로 보입니다.

  • IP 해싱 사용 (합법적으로 IP를 변경하는 사용자 및 서버 추가 및 삭제 시나리오에 적합하지 않음)
  • ssl 요청을 건 드리는 첫 번째 프로그램으로 nginx 또는 mod_ssl을 사용하면 잠재적 인 ssl 디코딩 병목 현상이 발생합니다.
  • ssl 요청을 만지는 첫 번째 프로그램으로 haproxy를 사용하여 수평 ssl 확장 성을 얻지 만 웹 서버 수준에서 ssl 요청에 대해 ip가 기록되지 않은 채로 살 수 있습니다 (아마도 일시적으로 ok)
  • 장기적으로는 모바일 또는 중앙 집중식 세션 저장소로 이동하여 고정 세션을 불필요하게 만듭니다

나는 가장 단순한 것이 중앙 집중식 세션 저장소로 옮기는 것이 럼블이라고 생각합니다. 아마도 나는 다른 임의의 생각에 여전히 관심이 있지만 그의 대답을 올바른 것으로 표시 할 것입니다.
wherestheph

답변:


8

진지하게 "가장 간단한 것"은 중앙 집중식 세션 저장소로 이동하는 것입니다. 로드 밸런서, haproxy, SSL 및 나머지를 사용 하여이 모든 배관을 설정해야합니다. 내가 본 모든 세션 처리 코드가 다른 스토리지 엔진을 연결하는 것이 거의 사소한 경우 약간의 코드와 매우 작은 추가 복잡성은 모든 문제를 해결합니다.


8

womble은 공유 세션 저장소에 관한 것입니다. 그의 답변 외에도 질문의로드 밸런싱 부분을 약간 확장 할 수 있습니다.

트래픽 증가를 처리하기 위해 더 많은 SSL 디코더를 추가하는 설정의 예가 더없는 것 같습니다.

최신 멀티 코어 PC는 초당 수천 건의 SSL 트랜잭션을 수행 할 수 있습니다 . 병목 현상이 발생하면 F5 , Citrix, Cisco 등 의 전용 어플라이언스 가 훨씬 빨라질 수 있습니다. 따라서 대부분의 사이트는 우수한 단일 장치 SSL 및로드 밸런싱 솔루션을 능가하지 않습니다.

내가 말한 모든 것이 사실이라고 가정하면, 이것들은 나의 선택으로 보입니다.

SSL 암호 해독을 수평으로 확장 할 수있는 옵션이 있습니다 (필요한 경우).

일반적인 접근 방식은 DNS 라운드 로빈을 사용하여 고 가용성 SSL 가속기 쌍, 즉 도메인에 대해 여러 IP 주소를 게시하는 것입니다. 각 IP 주소는 SSL 가속기 쌍을 가리 킵니다.

이 경우 사용자 세션 도중에 DNS TTL 시간이 초과되어 다른 응용 프로그램 서버로 사용자가 충돌 할 우려가 있습니다. 일반적으로 발생해서는 안되지만 발생할 수 있습니다. 공유 세션 저장소는 일반적인 솔루션이지만 다른 방식으로 처리 할 수 ​​있습니다.

예를 들어 SSL 암호 해독을 응용 프로그램 서버 균형 조정에서 분리 할 수 ​​있습니다. SSL 처리는 기본로드 밸런싱보다 CPU를 많이 사용하므로 단일로드 밸런서는 두 개의 SSL 가속기를 포화시킬 수 있어야합니다. 이처럼 :

Internet --> DNS round robin to multiple SSL accelerators --> plain HTTP to a single HTTP load balancer --> plain HTTP to multiple application servers

처음에 언급했듯이 공유 세션 저장소는 많은 것을 단순화하며 SSL /로드 밸런싱 계층에 많은 복잡성을 부여하는 것보다 확실히 장기적으로 더 나은 솔루션입니다.


DNS 라운드 로빈의 경우 +1 예를 들어 이것이 AWS Elastic Load Balancing이 사용하는 것입니다.
Alex

3

제품이 진화했을 때 이와 같은 2 년 전의 질문에 응답하는 것은 재미 있습니다. 현재 haproxy는 순수 TCP 모드에서도 클라이언트의 IP를 다음 홉으로 전달할 수있는 PROXY 프로토콜을 지원합니다. 또한 SSL 팜 앞의 첫 번째 계층으로 사용하려는 경우 SSL 고 정성뿐만 아니라 기본 SSL도 지원합니다 (아마 프록시 서버에서 생성). 따라서 귀하의 요청이 약간 앞서 있었고 구현이 따라 잡은 것 같습니다 :-)


1

나는 여기 wo 블과 Jesper에 동의합니다. 가장 쉬운 방법은 코드를 수정하는 것입니다. 물론 시스템 관리자는 종종 그러한 옵션을 가지고 있지 않지만,이 경우에도 실제로 수평 적이지는 않지만 비교적 저렴한 현대식 하드웨어를 사용하여 충분히 확장 할 수있는 방법이 있습니다.

방금 client-ip를 잃어 버릴 염려가있는 부분에 대해 의견을 게시하고 싶습니다. 주요 L7 / 프록시 솔루션에서 요청에 X-Forwarded-For (또는 원하는대로) 헤더를 삽입 할 수 있습니다. 그런 다음 요청을 수신하는 백엔드 웹 서버에서 layer3 client ip를 로그하는 데 사용한 파일과 동일한 공간에 해당 값을 로그하도록 로그 파일 형식을 변경할 수 있습니다. 그렇게하면 모든 로그 파싱 소프트웨어는 차이를 볼 수 없습니다 (꼬리를 할 때도 마찬가지입니다).

모든 것에 대한 트레이드 오프가 있으며 우리는 당신의 설정에 대해 충분히 알지 못했지만, 할 수없는 ha-proxy, nginx 및 varnish를 통해로드 밸런싱을 이동하는 것이 좋습니다. 프록시 계층 도구에. 이를 통해 SSL 문제를 해결할 수있을뿐만 아니라 캐싱, 콘텐츠 전환 및 헤더 조작과 같은 다양한 새로운 옵션이 제공됩니다.


1

임의의 생각;)

먼저 파일 기반 세션 데이터를 사용하기로 결정한 사람을 촬영하십시오. 파일 시스템에서 데이터를 읽고 쓰는 것이 필요한 데이터를 가져 오기 위해 소스로 돌아가는 것보다 더 빠를 방법은 없습니다. 이것은 가장 나쁜 방법입니다.

필자는 개인적으로 세션에 데이터를 저장하는 것이 필요할 때 데이터베이스에서 직접 가져 오는 것보다 나은 상황을 본 적이 없습니다. 즉, memcache 또는 유사한 캐싱 전략을 사용하면 사이트를 수백만 명의 사용자로 확장하는 데 도움이 될 수 있지만 세션을 사용하는 것과 같은 볼 파크에 있지는 않습니다.

둘째, 세션을 전혀 사용하지 않는 가장 큰 이유는 바로로드 밸런싱입니다. 참고-끈적 끈적한 말은 멈춤을 의미하지 않습니다. 고정 세션이 켜져 있어도 앱을 사용하는 동안 사용자가 다른 서버로 셔플 될 가능성이 매우 높습니다. 이것은 가장 부적절한 시간에 일어날 것입니다. Sticky는로드 밸런서가 사용자를 처음 시작한 서버로 다시 푸시 하려고 시도 한다는 것을 의미 하지만 결코 보장 할 수는 없습니다.

이 시점은 일반적으로 사람들이 데이터베이스에 세션을 다시 저장 하게 합니다. 세션이 작동하려면 각 페이지 요청마다 세션을로드하고 작성해야합니다. 데이터베이스에 저장된 경우 (로드 밸런싱 된 서버에 필요) 두 가지 서버 쿼리가 필요합니다. 첫 번째는 데이터를 가져오고 두 번째는 업데이트를 작성합니다.

실패한 부분은 사람들이 일반적으로 세션을 사용하므로 사용자 이름과 같은 것을 가져 오기 위해 데이터베이스로 돌아갈 필요가 없습니다 ...하지만 페이지가 데이터베이스를 쿼리하여 세션을로드 해야하는 경우 ... 음, 여기서 논리 문제를 볼 수 있어야합니다.

페이지 프로세서는 페이지 수명주기가 끝날 때 세션 데이터를 데이터베이스에 다시 써야하기 때문에 세션이 더 나쁩니다. 이는 하나의 쿼리 대신 해당 사용자의 이름을 가져 오는 것을 의미합니다. 모든 단일 페이지로드에 대해 또한 자체 성능에 영향을 미치는 데이터를 직렬화 및 역 직렬화하는 것을 의미합니다.

내 요점은 : 세션은 악하고 당신은 일반적으로 그것 없이는 더 나은 것입니다. 하나의 웹 서버에서만 실행되는 트래픽이 적은 사이트는 발생할 수있는 성능 향상이 필요하지 않습니다. 웹 팜에서 실행되는 트래픽이 많은 사이트는 확장이 제한적입니다.


0

전면에서 Haproxy를 사용하는 대신 라운드 로빈 DNS를 사용하여 여러 SSL 디코더간에 거친 균형 조정을 수행 한 다음 적절한로드 균형 조정을 위해 haproxy로 전달할 수 있습니다.

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