컴파일과 빌드
- 컴파일 : 작성한 소스 코드를 바이너리 코드로 변환하는 과정
- 링크 : 여러 개로 분리된 소스 코드들을 컴파일한 결과물들에서 최종 실행 가능한 파일을 만들기 위해 필요한 부분을 찾아서 연결해 주는 작업
- 빌드 : 소스 코드를 실행가능한 소프트웨어 산출물로 만드는 일련의 과정(jar, war...)
<빌드도구1 - Maven>
- 프로젝트에 필요한 모든 종속성(Dependency)을 리스트 형태로 Maven에게 알려주어서 종속성을 관리한다.
- XML, Repository를 가져올 수 있다.
- POM.xml이라는 Maven 파일에 필요한 jar, class Path를 선언만 하면 직ㅈ버 다운로드 할 필요없이 Repository에서 필요한 라이브러리 파일을 불러와준다.
<빌드도구2 - Gradle>
- JVM 기반의 빌드도구
- Ant와 Maven의 단점을 보완
- 오픈소스 기반의 Build 자동화 도구
- Groovy 기반 DSL로 작성한다.
- Build-by-convention을 바탕으로 한다. -> 스크립트 규모가 작고 읽기 쉽다.
- 설정 주입 방식 (configuration injection)
=> Gradle이 Maven보다 빌드에 소요되는 시간, 유연성, 종속성 관리 등 다양한 측면에서 뛰어나다
라이브러리가 종속될 경우, 특정 조건을 표현할 경우에 Maven이 이를 처리하기 복잡하다고 한다. 반면 Gradle은 스크립트가 더 짧고 읽기 쉽게 되어있다.
배포란 ? 작성한 코드를 빌드하고 빌드가 완성된 실행 가능한 파일을 사용자가 접근할 수 있는 환경에 배치하는 것.
빌드를 하고 생성된 jar 또는 war 파일을 WAS에 올리는 것이 배포이다.
CI : Continuous Integration (지속적 통합)
- 개발자를 위한 자동화 프로세스인 지속적 통합으로 모든 개발이 끝난 이후에 코드 품질을 관리하는 고전적 방식의 단점을 해소하기 위해 나타난 개념 => 젠킨스, Travis
CD : Continuous Deploy (지속적 배포)
- 소프트웨어가 항상 신뢰가능한 수준에서 배포될 수 있도록 관리하자는 개념
포트 충돌을 막기위해 배포를 할 때 서버를 다운시켰다가 새롭게 배포할 서버를 띄우게 되는데 그 때 다운타임(유저에게 서비스가 불가능한 시간)이 발생하게 된다.
무중단 배포 - 필요조건
1. 두 대 이상의 서버를 서비스해야 한다.
2. 다운 타임이 발생하지 않으려면 실제 서비스 중인 서버와 새롭게 배포한 서버가 동시에 존재해야 한다.
3. 비용을 줄이려면 배포할 때만 새롭게 서버를 띄우고 배포가 완료된 후에 기존 서버는 죽이면 된다.
<무중단배포 - Rolling 배포>
1. 서버1을 로드밸런서에서 뺀다.
2. 서버1을 배포한다.
3. 서버1을 다시 로드밸런서에 넣는다
4. 서버 2를 로드밸런서에서 뺀다.
5. 서버 2에 배포한다.
6. 서버 2를 다시 로드 밸런서에 넣는다.
단점
- 배포할 서버가 너무 많다면 n대 단위로 배포하기도 하는데 배포가 모두 끝나기 전까지는 누구는 이전 서비스를 받고 누구는 신규 서비스를 받을 수 있다는 문제가 존재한다.
- 1대에 배포하는 것보다 최소 2배 이상 느리다.
<무중단 배포 - Canary 배포>
소수의 유저(혹은 사내)만 사용하는 환경(Canary 환경)에 신규 버전을 배포하고 문제가 없다고 판단 됐을 때 다른 모든 서버에 배포한다.
<무중단 배포 - Blue / Green 배포>
실제로 서비스 중인 환경(Blue)와 새롭게 배포할 환경(Green)을 세트로 준비해서 배포하는 방식을 말한다.
장점
- 새롭게 배포할 환경에만 배포하면 되기 때문에 배포 속도가 매우 빠르다.
- 언제나 Green 환경이 떠있기 때문에 만약 잘못된 버전으로 배포를 했을 경우에 신속하게 롤백이 가능하다.
단점
- Green 환경이 항상 떠있어야 하기 때문에 비용이 두 배로 든다.
Q. 과거 장애 떠올리면서 추가로 생각해본 점...
사내 서비스에 Canary 배포를 하고... 그다음에 대외 채널에 오픈했는데.. 에러가 났다...
이랬을때 빠르게 롤백하는 방법..?
이중화 서버에서 공유디스크를 소스코드만 하게하고... 라이브러리는 제외할 수 있었으면...
한 대만 라이브러리 올려서 테스트하고, 나머지 한 대는 그대로 냅뒀다면.. 장애를 반으로 줄일 수 있지 않았을까..(Rolling배포도 추가로 적용) 이게 되는건가???? NAS...? 알려주실분..
아니면... 비정상활동 감지해서 메일로 이슈 보내주는 서비스도 만들었어야했는데..