여러 웹 서버에서 세션 고착은 어떻게 달성됩니까? 있습니까? 대답이 ‘둘 이상’인 경우 DNS 폴링

StackOverflow / ServerFault에는 몇 개의 웹 서버가 있습니까?

대답이 ‘둘 이상’인 경우 DNS 폴링 중에 세션 고착 을 달성 합니까?



답변

대규모 웹 사이트는 여러 컴퓨터에서 “로드 밸런싱”될 수 있습니다. 많은로드 밸런싱 설정에서 사용자는 세션 중에 백엔드 머신 중 하나를 칠 수 있습니다. 이로 인해 많은 시스템이 사용자 세션을 공유 할 수있는 여러 가지 방법이 있습니다.

선택한 방법은 채택 된로드 밸런싱 스타일과 백엔드 스토리지의 가용성 / 용량에 따라 다릅니다.

쿠키에만 저장된 세션 정보 : 세션 식별자 (세션 식별자가 아닌)는 사용자 쿠키에 저장됩니다. 예를 들어, 사용자 쿠키에는 장바구니 내용이 포함될 수 있습니다. 사용자가 세션 데이터를 무단 변경하는 것을 방지하기 위해 쿠키와 함께 HMAC가 제공 될 수 있습니다. 이 방법은 대부분의 응용 프로그램에 가장 적합하지 않을 수 있습니다.

  • 백엔드 스토리지가 필요하지 않습니다
  • 사용자는 매번 같은 머신을 사용할 필요가 없으므로 DNS로드 밸런싱을 사용할 수 있습니다
  • HTTP 요청과 함께 제공되는 데이터베이스 시스템에서 세션 정보 검색과 관련된 대기 시간은 없습니다. 사이트가 다른 대륙에있는 시스템에 의해로드 밸런싱되는 경우에 유용합니다.
  • 세션에 저장할 수있는 데이터의 양이 제한됩니다 (4K 쿠키 크기 제한)
  • 사용자가 세션 내용을 볼 수없는 경우 암호화를 사용해야합니다.
  • 세션 데이터의 사용자 변조를 방지하기 위해 HMAC (또는 이와 유사한)를 사용해야합니다.
  • 세션 데이터는 서버 측에 저장되지 않기 때문에 개발자가 디버그하기가 더 어렵습니다.

로드 밸런서는 항상 사용자를 동일한 머신으로 안내합니다 . 많은로드 밸런서는 사용자가 요청하는 백엔드 머신을 나타내는 자체 세션 쿠키를 설정하여 나중에 해당 머신으로 보낼 수 있습니다. 사용자는 항상 같은 컴퓨터로 연결되므로 여러 컴퓨터 간의 세션 공유가 필요하지 않습니다. 일부 상황에서는 유용 할 수 있습니다.

  • 여러 응용 프로그램을 인식하기 위해 기존 응용 프로그램의 세션 처리를 변경할 필요가 없습니다
  • 세션을 저장하는 데 공유 데이터베이스 시스템 (또는 이와 유사한)이 필요하지 않으므로 안정성이 향상 될 수 있지만 복잡성
  • 다운 엔드 시스템이 다운되면 시스템에서 시작된 모든 사용자 세션이 중단됩니다.
  • 기계를 사용하지 않는 것이 더 어렵습니다. 유지 보수를 위해 기계에서 중단 될 세션이있는 사용자는 기계를 끄기 전에 작업을 완료 할 수 있어야합니다. 이를 지원하기 위해 웹로드 밸런서는 특정 백엔드 시스템에 요청을 “배출”하는 기능이있을 수 있습니다.

공유 백엔드 데이터베이스 또는 키 / 값 저장소 : 세션 정보는 모든 웹 서버가 쿼리 및 업데이트에 액세스 할 수있는 백엔드 데이터베이스에 저장됩니다. 사용자의 브라우저는 세션 정보를 가리키는 식별자 (예 : 세션 ID)를 포함하는 쿠키를 저장합니다. 이것은 아마도 세 가지 중 가장 깨끗한 방법 일 것입니다.

  • 사용자는 저장된 세션 정보에 노출 될 필요가 없습니다.
  • 사용자는 매번 같은 머신을 사용할 필요가 없으므로 DNS로드 밸런싱을 사용할 수 있습니다
  • 한 가지 단점은 사용 된 백엔드 스토리지 시스템에 배치 할 수있는 병목 현상입니다.
  • 세션 정보가 만료되어 일관되게 백업 될 수 있습니다.

전반적으로 대부분의 동적 웹 응용 프로그램은 여러 데이터베이스 쿼리 또는 키 / 값 저장소 요청을 수행하므로 데이터베이스 또는 키 / 값 저장소는 세션 데이터의 논리적 저장소 위치입니다.


답변

여러 프런트 엔드 웹 서버에서 세션을 유지 관리하는 방법에 대한 질문은 대개 중앙 집중식 데이터베이스를 사용하는 것입니다. 로컬 파일 시스템에서 세션 파일을 추적하기 위해 웹 서버 인스턴스에 의존하는 대신 세션 ID와 데이터를 중앙 DB에 작성하면 모든 웹 서버가 대신 해당 데이터를 검색합니다.


답변

@David Pashley가 언급하지 않은 nemcached를 사용하는 것이 좋은 해결책 인 것 같습니다.

이는 모든 서버가 원격 memcached 인스턴스를 공유하고 자체 세션 핸들러를 제공하는 memcache PECL 확장을 사용함을 의미합니다.

PHP 설정에서 두 개의 매개 변수 만 변경하면됩니다!

다음은 좋은 튜토리얼입니다. http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/


답변

IIRC, DotNetRocks # 440에서 그들은 한 서버 기간을 말했다. 여전히 그런지 모르겠다.

편집 : 실제로 Hanselminutes # 134 였습니다. 죄송합니다.


답변

쿠키를 설정할 수 있습니다.

원격 IP의 해시를 계산할 수 있습니다 (가장 간단한 홀수 번호의 원격 호스트는 서버 A로, 번호가 매겨진 호스트는 서버 B로 이동).

SSL 터널을 사용하는 경우 소스 시스템에 남아있는 일부 값을 통해 수행 할 수도 있습니다.

일반적으로 위의 각 메커니즘에는 “리버스 프록시”서버 또는 일종의로드 밸런서가 필요합니다. 해당로드 밸런서는 트래픽을 수락 한 다음 위의 기준 중 하나에 따라 세션을 처음 시작한 서버로 보냅니다.

그래도 “DNS 폴링”이 무슨 뜻인지 잘 모르겠습니다.


답변

a) 세션 정보를 사용자 쿠키에 저장할 수 있습니다. 서버 측에 데이터는 저장하지 않지만 세션 상태는 유지하는 상태 비 저장 강화 쿠키 ( http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf)를 참조하십시오 . b) 세션 백엔드 스토리지를 데이터베이스 또는 memcached로 변경할 수 있습니다. 단일 실패 지점을 제거하기 위해 데이터베이스 복제 또는 여러 memcached 노드를 설정할 수 있습니다. memcached는 세션에서 사용자 상태를 잃는 것이 큰 오류가 아니며 그를 불행하게 만들지 않는 설정에서 권장됩니다. 보존 상태가 중요한 경우 데이터베이스를 사용하십시오. PHP, Django 및 Rails를 통해 개발자는 사용자 정의 세션 백엔드를 작성할 수 있습니다.