확장 가능한 Java 웹앱 구축을 위한 모범 사례

확장 가능한 Java 웹앱 구축을 위한 모범 사례

현재 단일 서버에서 실행 중인 JavaEE WebApp(JSP+Struts+Hibernate+MySQL)이 있습니다. 웹사이트의 성장과 성능 문제로 인해 일부 시스템에서 프로젝트를 클러스터링하기로 결정했습니다. 웹 사이트는 초당 5000개의 요청을 허용해야 합니다. 인터넷 검색과 내용을 읽은 후 이 작업을 수행하기 위한 몇 가지 전략을 생각해 냈습니다.

  • Apache를 프런트 엔드 로드 밸런서 및 역방향 프록시로 사용하고, 일부 Tomcat 인스턴스를 별도의 시스템에 각각 설치하고, 마지막으로 MySQL을 실행하는 DB 서버를 사용합니다. Tomcat 인스턴스는 필요할 때 확장할 수 있습니다.
  • 사용엔진스프런트 엔드 로드 밸런서 및 역방향 프록시로 사용됩니다. 나머지는 위와 같을 겁니다.
  • 사용HAProxy프런트 엔드 로드 밸런서 및 역방향 프록시로 사용됩니다. 나머지는 위와 같을 겁니다.

앞서 언급한 접근 방식에서는 모든 트래픽이 프런트 엔드 로드 밸런서(Apache, Nginx 또는 HAProxy Server)를 통과해야 한다고 가정합니다. 이로 인해 프런트 엔드 서버에 병목 현상이 발생하고 SPOF도 발생하게 됩니다. 그렇죠? 단일 프런트 엔드 서버가 대규모 웹앱의 모든 트래픽을 견딜 수 있습니까?

이 문제를 해결하기 위해 저는 일종의 손수 만든 전략을 생각해 냈습니다.

  • 로그인 페이지를 배치하고 프런트 엔드 서버에 작업을 인증합니다(예: myapp.com에서 액세스할 수 있음). 사용자가 성공적으로 로그인하면 백엔드 서버 중 하나로 리디렉션되고(예: srv1.myapp.com) 그곳에서 활동을 계속합니다.

그렇다면 나는 올바른 길을 가고 있는 걸까?

이러한 접근 방식에 대한 귀하의 의견을 알려주십시오. 더 나은 접근 방식을 생각하고 있다면 여기에 언급해 주십시오.

답변1

로그인 페이지를 프런트엔드 서버에 두고 백엔드로 리디렉션하는 것은 좋지 않은 생각입니다. 사용자는 백엔드 서버를 북마크에 추가할 수 있으며, 분산이 고르지 않게 될 수 있으며, 서버가 다운되더라도 사용자는 동일한 세션에 있으면 여전히 서버를 공격하려고 할 것입니다.

당신에게 필요한 것은 능동/수동(하트비트/맥박 조정 장치/IP 장애 조치/DNS 장애 조치) 또는 활성/활성(DNS 라운드 로빈/네트워크 부하 분산) 프런트엔드 서버.

활성/수동을 사용하면 모든 트래픽이 하나의 프런트엔드 서버로 리디렉션되고 두 번째 서버는 (핫 대기). 첫 번째 서버가 다운되면 어떻게든 두 번째 서버를 가리키도록 장애 조치(IP 주소를 다시 할당하거나 DNS*를 수정하여 Ether)를 수행하게 됩니다.

활성/활성을 사용하면 에테르를 사용하여 두 개 이상의 서버가 지속적으로 활성화됩니다.DNS 라운드 로빈또는IP/네트워크 부하 분산둘 사이에 하중을 (대략) 균등하게 분배합니다. 그런 다음 두 서버는 다시 백엔드 서버에 로드를 분산합니다.

활성/활성은 대부분의 대규모 웹 응용 프로그램에서 사용되는 방법입니다(YouTube/Google/Twitter/Wordpress.com/Tumblr의 DNS 레코드를 보면 DNS 라운드 로빈을 위한 서버에 대해 여러 IP가 있습니다.

결정을 내리고 구현한 후에는 솔루션 중에서 선택하는 것이 전부입니다. 개인적으로 나는 제안하고 싶다.엔진엑스하지만 모두가 선호하는 것이 있습니다 (HAProxy,오징어,체로키어,빛의 속도,F5(하드웨어),시스코(하드웨어) 및 수많은 기타).

안타깝게도 이런 종류의 질문에 대해서는 "이렇게 하세요"라고만 말할 수는 없습니다. 왜냐하면 이는 실제로 요구 사항이 무엇인지에 달려 있기 때문입니다. 위의 키워드 중 일부를 조사하고 구체적인 질문이 있는 경우 언제든지 문의하세요.

*DNS 기반 장애 조치는 가능하면 피해야 합니다. 일부 클라이언트는 TTL을 초과하여 DNS를 캐시하므로 이상적이지 않습니다.

답변2

nginx에 대해서는 모르지만 haproxy가 단일 실패 지점이 되는 것을 방지하기 위해 활성/수동 구성에서 두 개의 haproxy 로드 밸런서를 쌍으로 연결할 수 있습니다.

상용 솔루션도 있지만 어떤 이유에서든 서버 오류에 대해 많은 "잉크"를 얻지 못하는 것 같습니다.

관련 정보