2010-05-31 4 views
11

Java WAR를 프로덕션 서버 (클러스터가없고 OSGi가 없음)에 재배포하는 '매끄러운 방법'이 있는지 궁금합니다.프로덕션 환경에서 WAR를 원활하게 재배포 할 수 있습니까?

전 서버를 중지하고, 파일을 업데이트하고, 서버를 다시 시작합니다. 그리고 10 분 전에 사이트에 유지 보수 경고를 표시해야합니다.

귀하의 접근 방법은 무엇입니까?

+0

왜 서버를 중지하고, 파일을 업데이트하고, 서버를 다시 시작하고 배포를 취소/배포하지 않을까요? 우리는 프로덕션 서버에 여러 개의 .war 웹 응용 프로그램을 가지고 있으며 일반적으로 배포 취소/재배포 만 수행합니다. 모든 웹 응용 프로그램과 함께 전체 서버를 사용할 필요가 없습니다! – NoozNooz42

+1

@nooz : 글쎄, 서버에서 1 개의 앱만 실행합니다. 나는 방파제와 함께 재배포하는 것에 대한 자습서/안내서를 찾을 수 없었다. 내가 아는 바로는 빠른 개발을 위해 이것을하는 방법이다. – stephanos

+0

아 ... 나는 부두 (아마도 다른 사람은 논평 할 것이다) . 하지만 Tomcat을 사용하면 단일 .war 파일을 배포 취소/재배포 할 수있는 여러 가지 방법이 있습니다 (예전에 Ant 태스크에서 사용했지만 지금은 관리자 응용 프로그램을 사용하고 있습니다). 이렇게하면 Tomcat을 종료/다시 시작하는 데 필요한 시간을 절약 할 수 있습니다. – NoozNooz42

답변

8

첫째, 핫 전개가 항상 작동하지 않습니다. 우리는 많은 시간을 들여 모든 새로운 모듈이로드되고 문제가 될만한 가치가 없다고 결정했습니다. 그래서 당신이하는 일은 나쁘지는 않지만 새로운 WAR를 배포하는 가장 확실한 방법입니다.

현재 우리의 접근 방식은 모든 서버 앞에로드 밸런서가있는 스위치를 사용하는 것입니다. 우리는 적어도 2 개의 애플리케이션 서버 인스턴스를 실행합니다. 유지 관리를 위해 하나의 서버를 종료하면 트래픽이 자동으로 다른 서버로 이동합니다.

일부 스위치는 정말 저렴합니다. 새 상자를 정당화하기에 충분한로드가 없으면 2 개의 인스턴스를 동일한 상자에서 실행할 수 있습니다.

경우에 따라 스위치로 실제로 비용을 절약 할 수 있습니다. 예를 들어, 우리는 6 개의 박스를 사용하는 SSL 페이지를 가지고 있으며 이제는 스위치에서 SSL 가속을 사용하여 2 개의 박스에서 잘 실행됩니다.

+0

매우 똑똑한 소리 - 아직 나는 궁금해 : 어떻게 상태를 처리합니까? 하나를 사용하면 분명히 다른 상태 (DB, 캐시, 두 번째 응용 프로그램)에서 모든 상태를 사용할 수 있어야합니다. 둘째, 얼마나 효과가 있습니까? - 내 겸손한 자바 프레임 워크 경험 (jsf, seam, wicket)을 기반으로하면 클러스터에서 '끈적 세션'을 사용하지 않을 때 꽤 많은 시간을 소비해야 할 것입니다. – stephanos

+2

좋은 질문입니다. 무국적 서버가 오랫동안 여기에있어 당연한 것으로 여기 있습니다. 서버에 상태가있는 경우 소스 IP 또는 쿠키를 기반으로하는 고정 라우팅과 같은로드 밸런서에서 약간의 트릭을 수행해야합니다. –

1

생산에 사용하지 않더라도 JRebel을 볼 수 있습니다. 우리의 상사가 뜨거운 재배치를 꿈꾸지 만 생산 과정에서 우리는 기본적으로 동일합니다. 유감스럽게도 대부분 용지에서 지원됩니다. 가장 복잡한 애플리케이션의 경우 핫 재배포자가 항상 잘못 처리됩니다. 심지어는 증분 핫 재배포자를위한 더 진실합니다 ...

0

보통, mv old.war new.war 매우 바쁜 24/7 서비스로, 나는 이것이 선택권이 아닐지도 모르다, AS는 그것을 거기에서 가지고 가게하십시오.

+0

흠, 나는 부두로 한 번 이걸 시도했다. 잘못되었지만 몇 분 후에 아무 일도 일어나지 않았습니다. 아마도 각각의 AS가 다르게 처리합니다. 실제로 어떤 일을하셨습니까? – stephanos

+0

설정이 가능합니다. Tomcat과 JBoss가 그런 식으로 작동하도록 만들 수 있습니다. 부두가 비슷한 방식으로 설치하도록 허용하지 않는다는 사실에 놀랐습니다. 용어의 문제처럼 Tomcat과 Jetty는 서블릿 컨테이너이고 JBoss (및 Glassfish, JOnAS 등)는 응용 프로그램 서버입니다. –

1

일부 응용 프로그램 서버는 서비스 중단없이 재배포를 지원합니다. WebLogic의 경우 최소한 그렇습니다 (Using Production Redeployment to Update Applications 참조). 이것은 이 아니며 hot deploy가 아니며 프로덕션 서버와 함께 배포하지 마십시오.

응용 프로그램 서버를 지원하지 않으면 실제 "원활한"재배포를 수행 할 수 없습니다. 다운 타임을 최소화하려는 경우 한 가지 방법은 새 응용 프로그램을 동일한 서버 또는 다른 서버에 병렬로 배포하고 완료되면 라우팅 규칙을 변경하는 것입니다. 그러나 고객들은 그들의 세션을 풀 것입니다.

1

일반적으로 시작 시간을 최적화 할 수 있습니다. 웹 애플리케이션은 5 ~ 7 초 내에 Jetty로 시작됩니다. 다른 Java 웹 서버는 매우 느리게 시작하기 때문에 더 나쁩니다.

또한 프런트 엔드 웹 서버 (예 : lighttpd를 사용하는 apache)는 요청을 일정 시간 (최대 30 초간) 유지하도록 구성 될 수 있습니다.) 부두가 준비되지 않은 동안. 따라서 우리는 설치하는 동안 Jetty를 다시 시작하기 만하면됩니다. 사용자는 최악의 경우 몇 초간 지연이 발생합니다. 보통 인터넷 연결 결함처럼 보입니다.

+0

타임 아웃으로 좋은 아이디어! 고마워 – stephanos

0

마찬가지로 ZZ 코더는로드 밸런서가 이미 대규모 배포의 경우 좋은 솔루션이라는 점을 언급했습니다. 내 자신의 프로젝트에 대해 nginx 웹 서버의 역방향 HTTP 프록시 기능을 사용합니다. 지정된 웹 컨텍스트 (인터넷에서 볼 때)의 모든 http 패킷을 내 네트워크의 서버로 리디렉션합니다.구성은 정말 간단하다

location /best-app-ever/ { proxy_pass host-address:8080/some-app-1.1 root /home/www/some-app-1.1 }

전환 버전도 부드럽게해야한다. 이미 응용 프로그램의 새 버전을 배포 한 것으로 가정하면 단지의 nginx 설정 파일을 변경하고 적용 변경 :

location /best-app-ever/ { proxy_pass host-address:8080/some-app-1.2 root /home/www/some-app-1.2 }

sudo nginx -t
sudo service nginx restart

는 경우에 대비하여 웹 응용 프로그램 상태 및/또는 포함되어 있는지주의 할 일부 실행 또는 예약 된 프로세스의 경우 배포 및 배포 취소가 원활하지 않을 수 있습니다.

관련 문제