본문 바로가기
Backend boot camp/Session4

[Cloud] 운영 전략

by orioncsy 2022. 12. 9.

Proxy Server

프록시 서버

개념

  • 대리라는 뜻의 proxy로 클라이언트가 서버와 소통할 때 서버에 바로 접근하지 않고 프록시 서버를 거쳐서 접근하게 해주는 대리 서버
  • 주로 지역이 제한되어있는 서비스를 이용하기 위해 우회하거나 캐시를 통해 더 빠른 이용을 위해 사용

프록시 서버의 종류

  • 프록시 서버가 클라이언트와 가까이 있는지에 따라 Forward Proxy, Reverse Proxy로 나뉜다.
  • Forward Proxy
    • 클라이언트와 가까이 위치한 프록시 서버로 클라이언트를 대신해 서버에 요청 전달
    • 캐싱: 캐싱을 제공하여 빠른 서비스 이용 가능
    • 보안: 클라이언트에서 프록시 서버를 거치기 때문에 서버 입장에서 프록시 서버 IP를 받기 때문에 서버에게 클라이언트를 숨길 수 있다.
  • Reverse Proxy
    • 서버 가까이에 프록시 서버가 위치해서 클라이언트에 응답을 제공
    • 분산 처리: 서버 구조에서 사용자가 많아져 과부하가 올 경우를 위해 분산처리가 가능
    • 보안: 클라이언트에게 서버를 숨길 수 있다.

수평 확장

로드 밸런서

  • 서버에 과부하로 인해 서비스를 원활하게 제공하지 못하는 경우 서버의 하드웨어를 업그레이드하는 방법과 서버의 개수를 늘리는 두 가지 방법 존재

Scale-Up

  • 물리적인 서버의 사양을 높이는 하드웨어적 방법
  • 서버 수를 늘리지 않고 프로그램 구현에 있어 변화가 필요 없다.
  • 서버 사양을 높이는데 비용이 들고 업그레이드에 한계가 존재

Scale-out

  • 서버의 갯수를 늘려서 하나의 서버에 줄 부하를 분산시키는 방법
  • 서버의 사양을 높이지 않고 부하 처리 가능
  • 클라이언트로부터 온 요청을 여러 서버 중에 나눠 처리할 수 있도록 로드 밸런서가 처리한다.
  • 로드 밸런서 종류
    • L2: 데이터 전송 계층에서 Mac 주소를 바탕으로 로드 밸런싱
    • L3: 네트워크 계층에서 IP 주소를 바탕으로 로드 밸런싱
    • L4: 전송 계층에서 IP 주소와 포트를 바탕으로 로드 밸런싱
    • L5; 응용 계층에서 클라이언트 요청을 바탕으로 로드 밸런싱

오토 스케일링

AWS 기반 Auto Scaling

  • 자동으로 scale-out 방식으로 서버를 증설하여 관리하는 기능
  • 서버의 처리 요구량이 증가하면 새 리소스를 자동으로 추가하고 반대로 처리 요구량이 줄어들면 리소스를 감소시켜 적절한 분산 환경 구성

Auto Scaling의 장점

  • 동적 스케일링
    • 사용자의 요구 수준에 따라 리소스를 동적으로 스케일링 가능
  • 로드밸런싱
    • 리소스를 동적으로 스케일링할 수 있어 로드밸런서와 함께 사용할 수 있어 다수의 EC2 인스턴스에 업무를 효과적으로 분배 가능
  • 타깃 트래킹
    • 특정 타깃에 대해서만 auto scaling 가능
  • 헬스 체크와 서버 플릿 관리
    • EC2 인스턴스의 헬스 체크 상태를 모니터링 가능
    • 특정 인스턴스에 문제가 발생하면 자동으로 다른 인스턴스로 교체
  • 서버 플릿
    • 여러 EC2 서버에 애플리케이션을 호스팅할 경우 EC2 서버 집합을 서버 플릿이라 부른다.
    • Auto Scaling은 적정 수준의 서버 플릿 용량 유지 도움
    • 문제가 발생하여 다운된 서버의 수만큼 다른 서버를 추가로 실행시키는 방식으로 서버 플릿 유지

EC2 Auto Scaling

  • 시작 템플릿(Launch Configuration)
    • AMI 상세정보, 인스턴스 타입, 키 페어, 시큐리티 그룹 등 인스턴스에 대한 정보를 저장
    • 시작 템플릿을 사용하지 않으면 시작 구성으로 EC2 인스턴스 유형을 지정
  • Auto Scaling 그룹 생성
    • 스케일업, 다운 규칙 모음으로 EC2 인스턴스 시작부터 삭제까지 모든 동작에 대한 규칙과 정책

Scaling 유형

  • 인스턴스 레벨 유지
    • 기본 스케일링 계획이라고도 부르고 항상 실행을 유지하고자 하는 인스턴스 수를 지정 가능
  • 수동 스케일링
    • 기존 auto scaling 그룹의 크기를 수동으로 변경 가능
    • 수동으로 API, CLI, 콘솔 등을 이용해 인스턴스 추가 혹은 삭제해야 한다.
  • 일정별 스케일링
    • 예측 스케일링 트래픽의 변화를 예측하고 특정 시간대에 트래픽이 어느 정도 증가하는지 패턴을 알고 있을 때 일정별로 스케일링 가능
  • 동적 스케일링
    • 수요 변화에 대응해서 auto scaling 그룹의 용량을 조절하는 방법
    • CloudWatch가 모니터링하는 지표를 추적하여 경보 상태일 때 수행할 스케일링 규칙 규정
    • 스케일링 정책을 정의할 때 스케일 업과 스케일 다운 두 가지 정책을 작성

웹 서버

TOMCAT

Tomcat

  • Apache 사에서 개발한 서블릿 컨테이너에 있는 오픈소스 웹 애플리케이션 서버
  • Spring Boot 내장 서버로 별도 설치 과정 없이 사용 가능

특징

  • 자바 애플리케이션을 위한 대표적인 WAS(Web Application Server)
  • 오픈소스이기 때문에 라이선스 비용 부담 없이 사용 가능
  • 독립적으로 사용 가능하고 Apache 같은 다른 웹 서버와 연동하여 사용 가능
  • Tomcat은 자바 서블릿 컨테이너에 대한 공식 구현체로 Spring Boot에 내장되어 있어 별도의 설치가 필요 없다.

Tomcat 실행 및 의존성

  • Spring Boot 서버를 실행시키면 로그에 Tomcat initialized with port(s): 8080(ttp) 확인 가능
  • 의존성 확인은 view → tool windows → gradle 접속
    • 서버를 구성하기 위해 추가한 spring-boot-starter-web에서 spring-boot-starter-tomcat 모듈을 확인할 수 있다.

Jetty

jetty

  • 이클립스 재단의 HTTP 서버이자 자바 서블릿 컨테이너
  • Tomcat처럼 서블릿 컨테이너이자 서버로 개발자가 선택하여 서버를 구성 가능

특징

  • 2009년 이클립스 재단으로 이전해 오픈소스 프로젝트로 개발
  • 타 웹 애플리케이션에 비해 상대적으로 적은 메모리를 사용하고 가볍고 빠르다.
  • 애플리케이션에 내장 가능
  • 경량 웹 애플리케이션으로 소형 장비, 소규모 프로그램 더 적합

Spring Boot 서버 Jetty로 변경

  • build.gradle 파일에서 spring-boot-starter-web 의존성이 추가된 부분에서 Tomcat 제외
    • dependencies에서 tomcat을 제외하고 jetty 추가
    implementation ('org.springframework.boot:spring-boot-starter-web') {
    		exclude module: 'spring-boot-starter-tomcat'
    	}
    implementation 'org.springframework.boot:spring-boot-starter-jetty'
    
    • gradle 파일에서 dependencies에서 complieClasspath에서 org.springframework.boot:spring-boot-starter-jetty:2.7.6 확인
  • 서버를 실행하면 로그에서 아래와 같이 jetty가 실행된 것을 확인 가능
    • o.s.b.w.e.j.JettyServletWebServerFactory : Server initialized with port: 8080

NginX - Proxy Server

Nginx

  • 가볍고 높은 성능을 가지는 오픈소스 웹 서버 소프트웨어
  • Tomcat과 Jetty는 자바 서블릿 컨테이너 혹은 웹 애플리케이션 서버지만 Nginx는 웹 서버로 클라이언트에게 정적 리소스를 빠르게 응답한다.

특징

  • 트래픽이 많은 웹 사이트 확장성을 위해 개발된 고성능 웹 서버
  • 비동기 이벤트를 기반으로 적은 자원으로 높은 성능과 높은 동시성을 위해 개발
  • 다수의 클라이언트 연결을 효율적으로 처리
  • 클라이언트와 서버 사이에 존재하는 리버스 프록시 서버로 사용 가능
  • Nginx를 클라이언트와 서버 사이에 배치하여 무중단 배포 가능

Spring Boot와 Nginx 연동

  • 스프링 부트 앞에 Nginx로 리버스 프록시 서버를 구축하여 클라이언트와 서버가 Nginx를 통해 소통하도록 연동
  • Nginx 설치
    • Mac OS : 터미널에 brew install nginx로 다운로드 후 brew services start nginx를 통해 실행
    • window: Nginx 사이트에서 stable 버전으로 다운로드 후 nginx.exe 실행(추가 정보 클릭 후 실행)
  • 실행 확인
  • Nginx 설정 파일 수정
    • Mac OS
      • nginx -t를 통해 경로를 확인
      • vi [확인 경로]
    • Windows
      • Nginx 실행파일이 존재하는 폴더에 conf 폴더 내 nginx.conf 파일을 수정
    • 다양한 설정 값 중에 MacOS의 경우 포트 번호를 80으로 변경하고 리버스 프록시 서버로서 Spring Boot 프로젝트 연동
    • 아래 설정 사항을 수정하고 저장
    location /{
    	...
    	proxy_pass <http://localhost:8080>;
    	proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_set_header Host $http_host;
    }
    
  • Nginx 재시작
    • MacOS
      • brew services restart nginx
    • Windows
      • 명령 프롬프트로 해당 파일이 존재하는 곳으로 가서 nginx -s reload로 재시작
  • Spring Boot 8080 포트 서버를 실행
  • Nginx 종료
    • MacOS
      • brew services stop nginx
    • Windows
      • nginx -s stop

NginX - Load Balancer

두 개의 스프링 부트 서버 실행

  • Spring boot로 만든 프로젝트를 빌드
    • ./gradlew build
    • java -Dserver.port=8081 -jar [빌드된 파일]을 통해 8081 포트로 서버를 하나 올린다.
    • 다른 터미널 창에서 하나는 원래 실행하는 대로 서버 실행
    • PID를 자바로 구현할 수 있다.
      • 아래와 같이 구현하고 실행하면 pid를 확인 가능
      @RestController
      public class IndexController {
          @GetMapping("/")
          public String index() throws IOException {
              String pid= ManagementFactory.getRuntimeMXBean().getName();
              pid=pid.substring(0, pid.indexOf("@"));
              String line="Hello World, @PID : "+pid;
      
              return line;
          }
      }
      
      • 서로 실행을 해보면 다른 프로세스에서 작동한다.

NGINX 설정 파일 수정

  • nginx 설정 파일에 다시 들어가 이전 내용은 주석 처리하고 아래와 같이 수정
http {
	upstream backend {
		server localhost:8080;
		server localhost:8081;
	}
	location / {
		proxy_pass <http://backend>;
	}
}
  • backend라는 서버 그룹을 만든 뒤 그룹 자체로 전달을 하는 구조
  • 그룹에 속한 각 서버는 URL을 작성하고 포트 번호까지 함께 작성
  • proxy_pass 값으로 서버 그룹을 설정하면 localhost로 접속 시 8080번 포트와 8081번 포트를 번갈아 연결된다.
  • 이제 다시 웹 브라우저에 localhost를 접속하면 PID가 번갈아 나온다.

VPC 관련 개념

VPC

  • VPC는 Virtual Private Cloud 서비스로 클라우드 내 개인 공간을 제공하여 클라우드 퍼블릭과 프라이빗 영역을 논리적으로 분리
  • VPC가 없다면 리소스를 격리할 수 없고 인스턴스가 복잡하게 의존성을 가지며 구성되어 유지 및 관리에 큰 비용이 발생
  • VPC를 통해 확장성과 네트워크 통제권 확보 가능

VPC 구성 요소와 용어

  • IP Address
    • IP는 네트워크 장치들이 서로 인식하고 통신하기 위해 사용하는 번호로 IPv4, IPv6 존재
    • IPv4
      • 172.1.0.0과 같이 총 32bit로 8bit씩(Octet)을 .으로 구분
  • IP Address class
    • 호스트가 연결되어 있는 네트워크를 가리키는 8비트의 network address와 해당 네트워크 내에 호스트 주소(Host address)를 가리키는 나무지 영역 구분을 위해 class 사용
    • 총 A, B, C, D, E로 5개의 클래스로 나뉘고 D와 E는 멀티캐스트, 연구 개발을 위한 예약 IP이다.
    • A class
      • network Address - 0 ~127, host addresss - 0.0.0 ~ 255.255.255
      • 0.0.0.0은 자체 네트워크라 제외하고 127 ~ 127.255.255.255는 자기 자신을 가리키기 위한 목적으로 예약된 IP 주소
    • B class
      • network Address - 128.0 ~191.255, host addresss - 0.0 ~ 255.255
    • C class
      • network Address - 192.0.0 ~223.255.255, host addresss - 0 ~ 255

CIDR(Classless inter-domain routing)

  • 클래스 없는 도메인 간 라우팅 기법으로 국제 표준 IP 주소 할당 방법
  • IP 클래스 방식을 대체한 방식
  • 원하는 블록만큼 Network Address를 지정 가능
  • 172.1.0.0/16의 경우 첫 16bit를 network address로 사용한다는 의미
    • 총 2^16개의 IP 주소 이용 가능

서브넷(Subnet)

  • Subnetwork의 줄임말로 IP 네트워크의 논리적인 하위 부분
  • 서브넷을 이용해 하나의 네트워크를 여러 네트워크로 나누는 것이 가능
  • VPC를 이용하면 필요에 따라 다양한 서브넷 생성 가능
    • 퍼블릭 서브넷: 인터넷을 통해 연결할 수 있는 서브넷
    • 프라이빗 서브넷: 인터넷을 연결하지 않고, 보안을 유지하는 배타적 서브넷
    • VPN only 서브넷: 기업 데이터 센터와 VPC를 연결하는 서브넷
  • 서브넷은 VPC의 CIDR 블록을 이용해 정의, 최소 크기 서브넷은 /28
  • 서브넷은 AZ 당 최소 하나를 사용 가능

라우팅 테이블(Routing Table)

  • 라우팅 테이블은 트래픽의 전송 방향을 결정하는 라우트와 관련된 규칙을 담은 테이블
  • 목적지를 향한 최적 경로로 데이터 패킷 전송
  • 라우팅 테이블은 하나의 지점 또 다른 지점으로 가기 위한 정보를 담은 테이블
  • 모든 서브넷은 라우팅 테이블을 지닌다.
  • 각각의 서브넷은 항상 라우팅 테이블을 가지고 있어야 하고 하나의 라우팅 테이블 규칙을 여러 서브넷에 연결하는 것도 가능
  • 서브넷을 생성하고 별도의 라우팅 테이블을 생성하지 않으면 클라우드가 자동으로 VPC의 메인 라우팅 테이블에 연결

'Backend boot camp > Session4' 카테고리의 다른 글

웹 애플리케이션 로컬 배포  (1) 2022.12.13
[Cloud] 배포 자동화  (0) 2022.12.09
[Cloud]배포 컨테이너  (1) 2022.12.09
[Cloud] 운영 환경 구성  (1) 2022.12.09
[Spring WebFlux] Spring WebFlux  (0) 2022.12.09