일상/IT

Apache APPIX를 사용한 고정 세션

얇은생각 2023. 7. 25. 07:30
반응형

이 게시물에서는 스틱 세션의 배경, 사용 가능한 대안 및 Apache APPIX를 통해 구현하는 방법에 대해 설명하겠습니다.

세션 선호도라고도 하는 스틱 세션은 파사드 역할을 하는 라우팅 구성 요소가 항상 동일한 기본 업스트림 노드로 요청을 라우팅하는 메커니즘입니다. 이 게시물에서는 스틱 세션의 배경, 사용 가능한 대안 및 Apache APPIX를 통해 구현하는 방법에 대해 설명하겠습니다.

 

 

고정 세션이 필요한 이유

데이터베이스가 아닌 업스트림 노드에 상태를 저장했을 때 스틱 세션이 인기를 끌었습니다. 저는 단순화된 전자 상거래 상점의 예를 사용하여 더 자세히 설명하겠습니다.

소규모 전자 상거래 사이트의 기본 기반은 웹 애플리케이션과 데이터베이스로 구성될 수 있습니다.

비즈니스가 성공적이면 비즈니스가 성장할 것이며, 어느 시점에서 이 아키텍처를 확장해야 합니다. 수직으로 확장할 수 없는 경우(더 큰 시스템)에는 수평으로 확장해야 합니다(더 많은 노드). 앱 노드가 추가되면 웹 앱 노드 앞에 로드 밸런서 메커니즘이 있어야 로드를 분산할 수 있습니다.

 

임시변통한 세션

 

매번 데이터베이스로 이동하는 것은 비용이 많이 드는 작업입니다. 자주 접속하지 않는 데이터는 괜찮습니다. 그러나 모든 요청에 대해 카트의 내용을 표시하려고 합니다. 속도를 높이기 위해 몇 가지 대안을 사용할 수 있습니다. 웹 앱이 서버-사이드 렌더링을 사용한다고 가정할 경우, 카트 관련 데이터를 웹 앱 노드의 메모리에 보관하는 것이 고전적인 해결 방법입니다.

그러나 사용자 X의 카트를 노드 1에 저장할 경우 사용자 X의 모든 요청을 동일한 노드로 전달해야 합니다. 그렇지 않으면, 그들은 카트의 내용물을 잃어버린 것처럼 느낄 것입니다. 고정 세션 또는 세션 선호도는 동일한 사용자를 동일한 노드로 일관되게 라우팅하는 메커니즘입니다.

 

 

고정 세션 제한

더 나아가기 전에 스틱 세션의 상당한 제한을 설명해야 합니다. 데이터를 저장하는 웹 앱 노드가 어떤 이유로든 작동 중단되면 데이터는 복구할 수 없게 됩니다. 위의 전자 상거래 시나리오의 경우, 사용자가 카트를 가끔 잃어버리는 것을 의미하며, 이는 비즈니스 관점에서 용납할 수 없습니다.

이러한 이유로, 스틱 세션은 세션 복제와 함께 진행되어야 합니다. 노드에 저장된 데이터는 복사되어 다른 모든 노드와 동기화된 상태로 유지되어야 합니다.

세션 복제는 모든 기술 스택에 존재하지만 관련 사양은 없습니다. JVM에 대해 잘 알고 있으므로 다음과 같은 몇 가지 옵션이 있습니다:

  •  Tomcat은 즉시 세션 복제를 제공합니다
  • Hazelcast는 다양한 레벨에서 통합할 수 있는 클러스터형 메모리 솔루션을 제공합니다
  • Spring Session은 특정 솔루션에 대한 추상화 계층입니다

 

모든 노드(또는 원격 클러스터)에서 데이터가 복제되면 더 이상 스틱 세션이 필요하지 않다고 생각할 수 있습니다. 가용성만 고려하고 성능은 고려하지 않는 것이 사실입니다. 데이터 지역성에 관한 것입니다. 네트워크를 통해 다른 곳에서 데이터를 가져오는 것보다 현재 노드에서 데이터를 가져오는 것이 더 빠릅니다.

 

 

Apache APPIX의 고정 세션

고정 세션은 로드 밸런서, 역방향 프록시 및 API 게이트웨이에 적합한 필수 항목입니다. 하지만 Apache APPIX의 문서에는 주제에 대한 쉬운 진입점이 필요하다는 것을 인정해야 합니다.

Apache APIIX는 경로를 업스트림에 바인딩합니다. 업스트림은 하나 이상의 노드로 구성됩니다. 요청이 경로와 일치하면 Apache APPIX는 요청을 전달할 사용 가능한 모든 노드 중에서 선택해야 합니다. 기본적으로 알고리즘은 가중치 라운드 로빈입니다. 라운드 로빈은 하나의 노드를 차례로 사용하고 마지막 노드를 사용한 후 첫 번째 노드로 돌아갑니다. 가중치 라운드 로빈을 사용하면 Apache APPIX가 다음 노드로 전환되기 전에 노드로 전달하는 요청의 수에 가중치가 적용됩니다.

그러나 다른 알고리즘을 사용할 수 있습니다:

  • 일관된 해싱
  • 지수 가중 이동 평균 관리도
  • 최소 연결
  • 주문 제작한 것

 

일관된 해시를 사용하면 NGINX 변수, HTTP 헤더, 쿠키 등의 일부 값에 따라 동일한 노드로 전달할 수 있습니다.

HTTP는 상태 비저장 프로토콜이므로 응용프로그램 서버는 HTTP 요청을 통해 사용자를 추적하기 위해 첫 번째 응답에 쿠키를 설정합니다. 이것이 우리가 "세션"이라고 부르는 것입니다 기본 세션 쿠키 이름을 알아야 합니다. 응용 프로그램 서버마다 다른 쿠키가 배포됩니다:

  •  JVM 기반 서버의 JSessionID
  • PHP용 PHPESSID
  • ASP.Net에 대한 ASP 세션 ID
  • 기타

 

일반 Tomcat을 사용할 것이기 때문에 세션 쿠키는 JSESSIONID입니다. 이후 두 노드에 대한 Apache APPIX 설명서는 다음과 같습니다:

routes:
  - uri: /*
    upstream:
      nodes:
        "tomcat1:8080": 1            #1
        "tomcat2:8080": 1            #1
      type: chash                    #2
      hash_on: cookie                #3
      key: cookie_JSESSIONID         #4

 

 

  • 업스트림 노드 정의
  • 일관된 해싱 알고리즘 선택
  • 쿠키의 해시
  • 해시할 쿠키 정의

 

 

결론

이 게시물에서는 스틱 세션에 대해 자세히 설명하고, 항상 스틱 세션과 함께 세션 복제를 사용해야 하며, Apache APPIX에서 스틱 세션을 구현하는 방법에 대해 설명합니다.

반응형