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로 변경
NginX - Proxy Server
Nginx
- 가볍고 높은 성능을 가지는 오픈소스 웹 서버 소프트웨어
- Tomcat과 Jetty는 자바 서블릿 컨테이너 혹은 웹 애플리케이션 서버지만 Nginx는 웹 서버로 클라이언트에게 정적 리소스를 빠르게 응답한다.
특징
- 트래픽이 많은 웹 사이트 확장성을 위해 개발된 고성능 웹 서버
- 비동기 이벤트를 기반으로 적은 자원으로 높은 성능과 높은 동시성을 위해 개발
- 다수의 클라이언트 연결을 효율적으로 처리
- 클라이언트와 서버 사이에 존재하는 리버스 프록시 서버로 사용 가능
- Nginx를 클라이언트와 서버 사이에 배치하여 무중단 배포 가능
Spring Boot와 Nginx 연동
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로 사용한다는 의미
서브넷(Subnet)
- Subnetwork의 줄임말로 IP 네트워크의 논리적인 하위 부분
- 서브넷을 이용해 하나의 네트워크를 여러 네트워크로 나누는 것이 가능
- VPC를 이용하면 필요에 따라 다양한 서브넷 생성 가능
- 퍼블릭 서브넷: 인터넷을 통해 연결할 수 있는 서브넷
- 프라이빗 서브넷: 인터넷을 연결하지 않고, 보안을 유지하는 배타적 서브넷
- VPN only 서브넷: 기업 데이터 센터와 VPC를 연결하는 서브넷
- 서브넷은 VPC의 CIDR 블록을 이용해 정의, 최소 크기 서브넷은 /28
- 서브넷은 AZ 당 최소 하나를 사용 가능
라우팅 테이블(Routing Table)
- 라우팅 테이블은 트래픽의 전송 방향을 결정하는 라우트와 관련된 규칙을 담은 테이블
- 목적지를 향한 최적 경로로 데이터 패킷 전송
- 라우팅 테이블은 하나의 지점 또 다른 지점으로 가기 위한 정보를 담은 테이블
- 모든 서브넷은 라우팅 테이블을 지닌다.
- 각각의 서브넷은 항상 라우팅 테이블을 가지고 있어야 하고 하나의 라우팅 테이블 규칙을 여러 서브넷에 연결하는 것도 가능
- 서브넷을 생성하고 별도의 라우팅 테이블을 생성하지 않으면 클라우드가 자동으로 VPC의 메인 라우팅 테이블에 연결