2009-05-13 3 views
17

로드 균형 조정 된 톰캣 웹 서버가 있습니다. 모든 요청은 다른 Tomcat 서버에 의해 제공 될 수 있습니다.부하 균형 웹 응용 프로그램

j2ee (스트럿츠) 기반 웹 응용 프로그램 용 코드를 작성하는 동안 어떻게해야할까요?

답변

30

우선 세션 선호도/고정 세션에 대한로드 밸런서를 설정하여 모든 요청을 JSESSIONID를 기준으로 동일한 Tomcat (계속 진행중인 경우)으로 계속 전달할 수 있습니다.

  • 모든 세션 속성이 java.io.Serializable
  • 것은 당신의 web.xml이 <distributable/> 요소가 있는지 확인 구현해야하거나 <Context distributable="true" /> 설정 :

    The Tomcat clustering doc 성공적으로이 세션이 복제 된 것 가지고 응용 프로그램에 대한 두 가지 중요한 요구 사항을 명시

Serializable을 구현하지 않는 세션에 개체를 넣기 시작하면 속성/필드에 Serializable을 구현하지 않으면 문제가 발생합니다.

는 (사실이 점은 모두 내가 믿는 관계없이 사용하는 서블릿 컨테이너의 적용됩니다.)

업데이트 : 당신이 균형을 유지하기 위해 노력하고 있습니다 끈적 세션을 사용하는 이유에 대한 코멘트에 몇 가지 질문을 해결하기 위해 여러 서버 사이에서로드하는 경우이를 예제로 설명하는 것이 가장 쉽습니다.

우선, 응용 프로그램이 일종의 데이터를 세션에 유지하는 경우 (이는 대부분의 경우 일지라도) 모든 단일 응용 프로그램이 아닐 수 있습니다. 데이터를 세션에 보관하지 않으면이 문제에 관심을 두지 않고 여기에서 읽을 수 있습니다.

세션에서 데이터를 유지하지만 이 아닌 환경에서이 끈적 세션을하면 두통이 생길 수 있습니다.

first.jsp이 특정 세션 속성에서 일부 값을 업데이트하고 second.jsp이 동일한 세션 속성을 읽는 경우를 가정 해 보겠습니다. 세션 데이터를 클러스터의 모든 서버에 복제하도록 Tomcat을 설정할 수 있지만이 복제는 즉시 발생하지 않습니다. first.jsp에 대한 초기 요청이 으로 처리되고 완료된 후 1 초가 지나면 동일한 방문자가 second.jsp으로 요청합니다. 비 스티커 환경에서는 server2으로 처리합니다. 복제가 순간적이지 않으므로 가장 최신의 세션 데이터를 읽는 지 알 수있는 방법이 있습니까? 클러스터 전체에서 읽기를 동기화하는 일종의 논리를 추가해야합니까? 이것은 거대한 고통이 될 것입니다.

세션 선호도/고정 세션을 설정하면이 두통이 제거됩니다. 동일한 노드에서 동일한 클라이언트 서버의 모든 요청을 처리함으로써 "요청을 처리 할 때까지이 노드가 최신입니까?"라는 걱정을하지 않아도됩니다. 노드가 실패하면 클라이언트는 여전히 세션 데이터 사본을 가지고있는 클러스터의 다른 노드로 페일 오버 할 수 있지만 끈끈한 세션이 있으면 드문 경우가되며 표준이 아닙니다.

끈끈한 세션을 원하는 또 다른 이유가 있습니다. 클러스터의 노드간에로드합니다.어떤 노드가 세션에서 요청을 처리 할 수 ​​있다면 클러스터에 all-to-all 복제가 설정되었음을 의미합니다 (즉, node1의 세션 데이터가 node2, node3, ...에 복제됨을 의미 함) N이면 node2의 세션 데이터가 node1, node3, ... none N 등으로 복제됩니다. 클러스터에 추가 될 때마다 클러스터의 다른 모든 단일 노드와 통신해야하는 또 다른 노드를 의미하기 때문에 전체 세션 복제는 클러스터가 커지면 대역폭과 리소스를 많이 소비 할 수 있습니다.

대신 노드의 데이터가 클러스터의 몇 "친구"에게 복제되므로 노드에 장애가 발생해도 모든 노드가 사본을 가지고 있지 않아도 데이터를 사용할 수 있습니다. 이 시나리오에서는 node1이 노드 2와 3에 복제 된 데이터를 갖도록 노드 2를 연결하고 노드 3과 4 등에 데이터를 복제하여 체인을 구성하도록 클러스터를 구성합니다. 이 시나리오에서는 클러스터에 노드를 추가해도 노드 간의 통신량이 all-to-all 방식과 같이 빠르게 증가하지 않습니다.

+0

첫 번째 요청에서 Tomcat이 첫 번째 요청을 처리하도록 선택되면 해당 브라우저에서 오는 다음 요청을 처리 할 때 동일한 Tomcat을 사용해야한다는 것을 의미합니까? 이 경우 동일한 Tomcat 서버가 모든 요청을 처리하는 경우로드 균형 조정이 어떻게 도움이됩니까? – user32262

+0

로드 밸런싱의 주요 아이디어는 여러 대의 서버를 사용하여 여러 대의 클라이언트를 서비스하는 것입니다. 동일한 클라이언트에서 오는 모든 요청을 여러 서버에 배포해야 함을 의미하지는 않습니다. 그냥 생각, 확실하지 않습니다. –

+0

이 경우에는 Struts가 다르지 않습니다. Matt가 제공 한 충고에 충실하십시오. +1 –

관련 문제