다운타임 없이 ASP.NET 애플리케이션을 배포하는 방법
새 버전의 웹 사이트를 배포하려면 다음을 수행합니다.
- 새 코드를 압축하여 서버에 업로드합니다.
- 활성 서버에서 IIS 웹 사이트 디렉토리에서 모든 활성 코드를 삭제합니다.
- 새 코드 zip 파일을 현재 비어 있는 IIS 디렉토리에 추출합니다.
이 프로세스는 모두 스크립트로 작성되어 있으며 매우 빠르게 수행되지만 이전 파일이 삭제되고 새 파일이 배포될 때에도 10-20초의 다운타임이 발생할 수 있습니다.
0초 다운타임 방법에 대한 제안이 있습니까?
서버 2대와 로드 밸런서가 필요합니다.다음은 단계입니다.
- 서버 2의 모든 트래픽 설정
- 서버 1에 배포
- 테스트 서버 1
- 서버 1의 모든 트래픽 설정
- 서버 2에 배포
- 테스트 서버 2
- 두 서버 모두에서 트래픽 설정
문제는 이 경우에도 "고정 세션"을 사용하는 경우 응용 프로그램이 다시 시작되고 세션이 손실된다는 것입니다.데이터베이스 세션이나 상태 서버가 있으면 모든 것이 정상입니다.
Microsoft Web Deployment Tool은 이 기능을 어느 정도 지원합니다.
윈도우즈 TxF(트랜잭션 파일 시스템) 지원을 실행합니다.TxF 지원을 사용하도록 설정하면 파일 작업이 원자적으로 수행됩니다. 즉, 성공하거나 완전히 실패합니다.이렇게 하면 데이터 무결성이 보장되고 데이터 또는 파일이 "중간" 또는 손상된 상태로 존재하는 것을 방지할 수 있습니다.MS Deploy에서는 TxF가 기본적으로 사용되지 않도록 설정되어 있습니다.
전체 동기화를 위한 트랜잭션인 것 같습니다.또한 TxF는 Windows Server 2008의 기능이므로 이 트랜잭션 기능은 이전 버전에서는 작동하지 않습니다.
폴더를 버전으로 사용하고 IIS 메타베이스를 사용하여 0-다운타임 동안 스크립트를 수정할 수 있다고 생각합니다.
- 기존 경로/url의 경우:
- 새(또는 수정된) 웹 사이트를 다음 서버에 복사합니다.
- \web\app\v2입니다.1\
- 웹 사이트 경로를 변경하도록 IIS 메타베이스 수정
- \web\app\2에서.0\
- \web\app\v2로 이동합니다.1\
이 방법은 다음과 같은 이점을 제공합니다.
- 새 버전에 문제가 있는 경우 v2.0으로 쉽게 롤백할 수 있습니다.
- 여러 실제 또는 가상 서버에 배포하려면 스크립트를 사용하여 파일 배포를 수행할 수 있습니다.모든 서버가 새 버전을 갖게 되면 Microsoft Web Deployment Tool을 사용하여 모든 서버의 메타베이스를 동시에 변경할 수 있습니다.
서로 다른 포트에 있는 두 로컬 IIS 사이트 간의 소프트웨어 로드 밸런서로 IIS의 응용 프로그램 요청 라우팅을 사용하여 단일 서버에서 다운타임 없이 배포할 수 있습니다.이는 로드 밸런서에서 두 사이트 중 하나만 사용할 수 있는 파란색 녹색 배포 전략으로 알려져 있습니다."중단"된 사이트에 배포하고 준비한 후 로드 밸런서로 가져온 다음(일반적으로 애플리케이션 요청 라우팅 상태 검사를 통과함으로써), 가동 중이던 원래 사이트를 "풀"에서 꺼냅니다(상태 검사가 실패함).
저는 최근에 이것을 겪었고, 제가 생각해낸 해결책은 IIS에 두 개의 사이트를 설정하고 그들 사이를 전환하는 것이었습니다.
구성을 위해 각 A 및 B 사이트에 대해 다음과 같은 웹 디렉터리가 있었습니다. c:\Intranet\라이브 A\인터페이스 c:\인트라넷\라이브 B\인터페이스
IIS에는 두 개의 동일한 사이트(동일한 포트, 인증 등)가 있으며 각각 고유한 응용 프로그램 풀이 있습니다.사이트 중 하나가 실행 중이고(A) 다른 사이트가 중지되었습니다(B).라이브 호스트 헤더도 라이브 호스트 헤더가 있습니다.
라이브로 배포하는 경우에는 STOPED 사이트의 위치에 게시하기만 하면 됩니다.포트를 사용하여 B 사이트에 액세스할 수 있기 때문에 첫 번째 사용자가 애플리케이션을 시작하지 않도록 사이트를 사전 준비할 수 있습니다.그런 다음 배치 파일을 사용하여 라이브 호스트 헤더를 B에 복사하고 A를 중지하고 B를 시작합니다.
좋아요, 모두가 반대표를 던지고 있기 때문에 제가 2008년에 쓴 답은*...
2014년에 어떻게 하는지 말씀드리겠습니다.현재 ASP.NET MVC를 사용하고 있기 때문에 더 이상 웹 사이트를 사용하지 않습니다.
이를 위해 로드 밸런서와 두 대의 서버가 필요하지는 않습니다. 유지 관리하는 모든 웹 사이트에 대해 서버가 3대인 경우에는 문제가 없지만 대부분의 웹 사이트에서는 완전히 오버킬 상태입니다.
또한 Microsoft의 최신 마법사에 의존하지 않습니다. 너무 느리고 숨겨진 마법이 너무 많으며 이름을 바꾸기 쉽습니다.
방법은 다음과 같습니다.
생성된 DLL을 'bin-pub' 폴더에 복사하는 빌드 후 단계가 있습니다.
우리는 Beyond Compare(우수**)를 사용하여 변경된 파일을 확인하고(FTP를 통해) 프로덕션 서버까지 동기화합니다.
웹 사이트에는 'bin-pub'의 모든 내용을 'bin'으로 복사하는 버튼이 포함된 보안 URL이 있습니다(빠른 롤백을 활성화하기 위해 백업을 먼저 수행).이 시점에서 앱이 자동으로 재시작됩니다.그런 다음 ORM은 추가해야 할 테이블이나 열이 있는지 확인하고 만듭니다.
이는 몇 밀리초의 다운타임에 불과합니다.앱을 다시 시작하는 데 1~2초가 걸릴 수 있지만 다시 시작하는 동안 요청이 버퍼링되므로 다운타임이 효과적으로 발생하지 않습니다.
전체 배포 프로세스는 변경된 파일 수와 검토할 변경 사항 수에 따라 5초에서 30분까지 소요됩니다.
이렇게 하면 전체 웹 사이트를 다른 디렉터리로 복사할 필요가 없고 bin 폴더만 복사할 수 있습니다.또한 프로세스를 완벽하게 제어하고 무엇이 변화하고 있는지 정확하게 파악할 수 있습니다.
**우리는 항상 구현 중인 변경 사항을 마지막 순간에 다시 한 번 확인하기 위해 신속하게 검토합니다. 따라서 무엇을 테스트해야 하는지, 무엇이 준비를 방해하는지 알 수 있습니다.Beyond Compare는 FTP를 통해 파일을 쉽게 분산시킬 수 있기 때문에 사용합니다.BC가 없었다면 나는 절대 이것을 하지 않았을 것입니다. 당신은 당신이 무엇을 덮어쓰고 있는지 전혀 모릅니다.
*아래쪽으로 스크롤하여 확인해 보십시오. ( BTW 웹 사이트는 빌드 속도가 느리고 절반으로 컴파일된 임시 파일과 충돌할 수 있기 때문에 더 이상 권장하지 않습니다.과거에는 파일 단위로 보다 신속하게 배포할 수 있었기 때문에 이러한 기능을 사용했습니다.사소한 문제를 매우 빠르게 해결할 수 있으며 배포하는 내용을 정확하게 확인할 수 있습니다(물론 비교 범위를 넘어서 사용하는 경우에는 제외).
Microsoft를 사용합니다.Web.Administration의 ServerManager 클래스에서 자체 배포 에이전트를 개발할 수 있습니다.
이 방법은 가상 디렉터리의 물리적 경로를 변경하여 이전 웹 앱과 새 웹 앱 간에 온라인 아토믹 스위치를 생성하는 것입니다.
이로 인해 이전 및 새 AppDomain이 동시에 실행될 수 있습니다!
문제는 데이터베이스 등에 대한 변경사항을 동기화하는 방법입니다.
이전 또는 새 물리적 경로를 사용하는 AppDomain의 존재 여부를 폴링하면 이전 AppDomain이 종료된 시기와 새 AppDomain이 시작되었는지 여부를 감지할 수 있습니다.
AppDomain을 강제로 시작하려면 HTTP 요청을 해야 합니다(IIS 7.5는 자동 시작 기능을 지원합니다).
이제 새로운 AppDomain에 대한 요청을 차단할 수 있는 방법이 필요합니다.이름이 지정된 뮤텍스를 사용합니다. 이 뮤텍스는 배포 에이전트에서 생성 및 소유하고 새 웹 앱의 Application_Start에서 대기한 후 데이터베이스 업데이트가 완료되면 배포 에이전트에서 릴리스합니다.
(웹 앱에서 마커 파일을 사용하여 뮤텍스 대기 동작을 활성화합니다) 새 웹 앱이 실행되면 마커 파일을 삭제합니다.
다운타임이 없는 유일한 방법은 최소 2대의 서버에서 호스팅하는 것입니다.
저는 단일 서버에 대해 George의 답변을 다음과 같이 조금 더 구체화할 것입니다.
- 웹 배포 프로젝트를 사용하여 사이트를 단일 DLL로 사전 컴파일
- 새 사이트의 압축을 풀고 서버에 업로드합니다.
- 사이트에 대한 올바른 사용 권한이 있는 폴더에 있는 새 폴더에 압축을 풀면 압축 해제된 파일이 사용 권한을 올바르게 상속합니다(예:\web, 하위 폴더 v200901, v2009016 등).
- IIS 관리자를 사용하여 사이트를 포함하는 폴더 이름 변경
- 문제가 발생할 경우 이전 폴더로 이동할 수 있도록 오래된 폴더를 잠시 보관합니다.
4단계를 수행하면 IIS 작업자 프로세스가 재활용됩니다.
이는 InProc 세션을 사용하지 않는 경우에만 다운타임이 발생합니다. 가능하면 SQL 모드를 사용하십시오(세션 상태를 완전히 방지하는 것이 더 좋습니다).
물론 여러 대의 서버 및/또는 데이터베이스가 변경될 경우에는 좀 더 많은 문제가 발생합니다.
일종의 로드 밸런서(또는 동일한 서버의 대기 복사본)를 갖는 것에 의존했던 sklivz의 답변을 확장하기 위해
- 모든 트래픽을 사이트/서버 2로 유도
- 가능한 한 적은 수의 사용자가 배포된 버전에서 보류 중인 워크플로우를 가질 수 있도록 잠시 기다리십시오.
- 사이트/서버 1에 배포하고 최대한 예열
- 트랜잭션 방식으로 데이터베이스 마이그레이션 실행(이를 위해 노력)
- 모든 트래픽을 사이트/서버 1로 즉시 전송
- 사이트/서버 2에 배포
- 트래픽을 두 사이트/서버로 직접 전송
데이터베이스 스냅샷/복사본을 생성하여 약간의 연기 테스트를 도입할 수 있지만 항상 가능한 것은 아닙니다.
가능하고 필요한 경우 서로 다른 테넌트 URL:s(customerX.myapp.net ) 또는 서로 다른 사용자와 같은 "벤더 차이"를 사용하여 알 수 없는 기니피그 그룹에 먼저 배포합니다.실패하는 것이 없으면 모두에게 릴리스하십시오.
데이터베이스 마이그레이션이 수반되므로 이전 버전으로 롤백하는 것이 불가능한 경우가 많습니다.
이벤트 대기열 및 재생 메커니즘을 사용하는 등 이러한 시나리오에서 애플리케이션의 성능을 향상시킬 수 있는 방법이 있습니다. 하지만 사용 중인 항목에 변경 사항을 배포하는 것에 대해 이야기하고 있기 때문에 이를 입증할 수 있는 방법은 없습니다.
이렇게 해야 합니다.
절대 최소 시스템 요구 사항:
1개의 서버(포함)
- 포트 80에서 실행 중인 로드 밸런서/패킷 프록시(예: nginx) 1개
- 2개의 서로 다른 TCP 포트에서 수신 중인 2개의 ASP.NET-Core/mono reverse-proxy/fastcgichroot-jail 또는 도커 컨테이너
(또는 샌드박스 없이 2개의 서로 다른 TCP 포트에서 2개의 역방향 프록시 애플리케이션만 사용)
워크플로우:
내 업데이트 트랜잭션 트랜잭션 시작
try
Web-Service: Tell all applications on all web-servers to go into primary read-only mode
Application switch to primary read-only mode, and responds
Web sockets begin notifying all clients
Wait for all applications to respond
wait (custom short interval)
Web-Service: Tell all applications on all web-servers to go into secondary read-only mode
Application switch to secondary read-only mode (data-entry fuse)
Updatedb - secondary read-only mode (switches database to read-only)
Web-Service: Create backup of database
Web-Service: Restore backup to new database
Web-Service: Update new database with new schema
Deploy new application to apt-repository
(for windows, you will have to write your own custom deployment web-service)
ssh into every machine in array_of_new_webapps
run apt-get update
then either
apt-get dist-upgrade
OR
apt-get install <packagename>
OR
apt-get install --only-upgrade <packagename>
depending on what you need
-- This deploys the new application to all new chroots (or servers/VMs)
Test: Test new application under test.domain.xxx
-- everything that fails should throw an exception here
commit myupdate;
Web-Service: Tell all applications to send web-socket request to reload the pages to all clients at time x (+/- random number)
@client: notify of reload and that this causes loss of unsafed data, with option to abort
@ time x: Switch load balancer from array_of_old_webapps to array_of_new_webapps
Decomission/Recycle array_of_old_webapps, etc.
catch
rollback myupdate
switch to read-write mode
Web-Service: Tell all applications to send web-socket request to unblock read-only mode
end try
다운타임이 없고 정기적으로 사용하고 있는 해결 방법은 다음과 같습니다.
실행 중인 .NET 코어 응용 프로그램 dll의 이름을 filename.dll.backup으로 변경합니다.
새 .dll 업로드(파일이 업로드되는 동안 웹 애플리케이션을 사용할 수 있고 요청을 처리할 수 있음)
업로드가 완료되면 응용 프로그램 풀을 재활용합니다.호스팅 제어판에서 응용프로그램 풀을 재활용하려면 서버 또는 기능에 대한 RDP 액세스가 필요합니다.
IIS는 재활용 시 앱 풀과 겹치기 때문에 일반적으로 재활용 중에 다운타임이 발생하지 않습니다.따라서 애플리케이션 풀이 재활용되어 다운타임 없이 원활하게 제공된다는 사실을 전혀 알지 못한 채 여전히 요청이 들어오고 있습니다.
나는 여전히 이것보다 더 좋은 방법을 찾고 있어요..!! :)
IIS/Windows
가능한 모든 솔루션을 시도한 후 다음과 같은 매우 간단한 기술을 사용합니다.
- IIS 응용 프로그램이 폴더를 가리킵니다.
/app
그것은 에 대한 심볼 링크(!)입니다./app_green
- 앱을 배포하여
/app_blue
- 다음을 가리키도록 심볼 링크를 변경합니다.
/app_blue
(앱이 계속 작동합니다) - 애플리케이션 풀을 재활용합니다.
다운타임이 없지만 앱이 3-5초 동안 질식합니다(JIT 컴파일 및 기타 초기화 작업).
누군가는 로드 밸런서가 없는 "가난한 사람의 청록색 배치"라고 말했습니다.
Nginx/linux
nginx/linux에서는 "적절한" 청록색 배포를 사용합니다.
- : nginx 방록시점
localhost:3000
- 는 에배니다합에 합니다.
localhost:3001
- 몸을 녹입니다
localhost:3001
- 역프록시를 전환
localhost:3000
(또는 도커 사용)
Windows 및 Linux 솔루션은 powershell/bash 스크립트를 통해 쉽게 자동화할 수 있으며 Github Actions 또는 유사한 CD/CI 엔진을 통해 호출할 수 있습니다.
오래된 파일은 그대로 두고 덮어쓰는 것이 좋습니다.이렇게 하면 다운타임이 단일 파일 덮어쓰기 시간으로 제한되고 한 번에 하나의 파일만 누락됩니다.
하지만 이것이 "웹 응용 프로그램"에 도움이 되는지는 잘 모르겠습니다(당신이 그것을 사용하고 있다고 생각합니다). 그래서 우리는 항상 "웹 사이트"를 사용합니다.또한 "웹 사이트"를 배포해도 사이트가 다시 시작되지 않고 모든 사용자 세션이 삭제되지 않습니다.
언급URL : https://stackoverflow.com/questions/148084/how-to-deploy-an-asp-net-application-with-zero-downtime
'itsource' 카테고리의 다른 글
VBA를 사용하여 HTML 테이블을 Excel로 변환 (0) | 2023.06.01 |
---|---|
표시된 보기 컨트롤러 해제 (0) | 2023.06.01 |
텍스트/입력 상자 주변의 포커스 테두리(아웃라인)를 제거하는 방법은 무엇입니까?(크롬) (0) | 2023.06.01 |
iOS에서 입력 텍스트 색상 사용 안 함 (0) | 2023.06.01 |
wpf 데이터 그리드에 상황에 맞는 메뉴를 추가하는 방법은 무엇입니까? (0) | 2023.06.01 |