배포 전략

InSeok·2023년 1월 31일
0

TIL

목록 보기
47/51

**프록시 서버**

  • 프록시 서버(Proxy Server)는 클라이언트가 서버와 소통할 때, 서버에 바로 접근하지 않고 자신을 통해 서버에 접근할 수 있도록 해주는 일종의 대리 서버입니다.
  • 일반 사용자는 지역이 제한되어있는 서비스를 이용하기 위해 우회하거나, 캐시를 통해 더 빠른 이용을 하기 위해 프록시 서버를 사용합니다.

종류

  • 프록시 서버가 클라이언트에 가까이 있는지, 서버에 가까이 있는지로 구분
  • **Forward Proxy**
    • 클라이언트 가까이에 위치한 프록시 서버로 클라이언트를 대신해 서버에 요청을 전달합니다.
    • 캐싱을 통해 빠른 서비스 이용 가능
      • 클라이언트는 서비스의 서버가 아닌 프록시 서버와 소통하게 됩니다. 그러한 과정에서 여러 클라이언트가 동일한 요청을 보내는 경우 첫 응답을 하며 결과 데이터를 캐시에 저장해놓고, 이후 서버에 재 요청을 보내지 않아도 다른 클라이언트에게 빠르게 전달할 수 있습니다.
    • 보안
      • 클라이언트에서 프록시 서버를 거친 후 서버에 요청이 도착하기 때문에, 서버에서 클라이언트의 IP 추적이 필요한 경우 클라이언트의 IP가 아닌 프록시 서버의 IP가 전달됩니다. 서버가 응답받은 IP는 프록시 서버의 IP이기 때문에 서버에게 클라이언트를 숨길 수 있습니다.

  • **Reverse Proxy**
    • 서버 가까이에 위치한 프록시 서버로 서버를 대신해서 클라이언트에 응답을 제공
    • 분산처리를 목적으로 하거나 보안을 위해 프록시 서버를 이용
    • 분산처리
      • 클라이언트 - 서버 구조에서 사용자가 많아져 서버에 과부하가 올 경우를 위해 부하를 분산할 수 있습니다. Reverse Proxy 구조에서 프록시 서버로 요청이 들어오면 여러대의 서버로 요청을 나누어 전달 후 처리합니다. 자세한 내용은 로드밸런서 챕터에서 학습할 수 있습니다.
    • 보안
      • 클라이언트에게 서버를 숨길 수 있습니다. 클라이언트 입장에서의 요청보내는 서버가 프록시 서버가 되므로 실제 서버의 IP주소가 노출되지 않습니다.

**로드밸런서**

  • 요청을 여러 서버에 나눠 처리할 수 있도록 교통정리를 해주는 역할

로드 밸런싱

  • 여러 서버에 교통정리를 해주는 기술 혹은 프로그램

종류

  • 로드 밸런서는 클라이언트의 요청을 어떤 것을 기준으로 분산시키냐에 따라 네 가지의 종류로 나뉩니다.

  • 서비스에 너무 많은 사용자(클라이언트)가 접속하면 어떻게 될까요? 하나의 서버에 너무 많은, 혹은 너무 잦은 요청을 보낸다면 서버에는 과부하가 오게 됩니다.

  • 과부하로 인해 서버가 원활한 서비스를 제공하지 못하는 경우를 해결하기 위해 크게 서버의 하드웨어를 업그레이드하는 방법과 서버의 갯수를 늘리는 방법, 두가지 선택을 할 수 있습니다.

**Scale-Up**

  • 물리적으로 서버의 사양을 높이는 하드웨어적인 방법
  • 서버의 사양을 높이는데엔 굉장히 높은 비용이 들고, 하드웨어의 업그레이드엔 한계있다

Scale-Out

  • Scale-Out은 서버의 갯수를 늘려 하나의 서버에 줄 부하를 분산시키는 방법
  • 많은 요청이 오더라도 여러대의 서버가 나눠서 처리를 하기 때문에 서버의 사양을 높이지 않고도 비교적 저렴한 방법으로 부하를 처리

**오토스케일링**

  • 오토스케일링은 Scale-Out 방식으로 서버를 증설할 때 자동으로 서버(리소스)를 관리해주는 기능
  • 클라이언트의 요청이 많아져 서버의 처리 요구량이 증가하면 새 리소스를 자동으로 추가하고 반대로 처리 요구량이 줄어들면 리소스를 감소시켜 적절한 분산 환경을 만들어줍니다.

**장점**

  • 동적 스케일링 : Auto Scaling의 가장 큰 장점은 사용자의 요구 수준에 따라 리소스를 동적으로 스케일링 할 수 있다는 점입니다. 스케일 업 할 수 있는 서버의 수에는 제한이 없고, 필요한 경우 서버 두 대에서 수백 ~ 수만 대의 서버로 즉시 스케일 아웃 할 수 있습니다.
  • 로드 밸런싱 : Auto Scaling은 리소스를 동적으로 스케일업 혹은 스케일다운 합니다. 로드밸런서와 함께 사용하면, 다수의 EC2 인스턴스에게 워크로드를 효과적으로 분배할 수 있어 사용자가 정의한 규칙에 따라 워크로드를 효과적으로 관리 할 수 있습니다.
  • 타겟 트래킹 : 사용자는 특정 타겟에 대해서만 Auto Scaling을 할 수 있으며, 사용자가 설정한 타겟에 맞춰 EC2 인스턴스의 수를 조정합니다.
  • 헬스 체크와 서버 플릿 관리 : Auto Scaling을 이용하면 EC2 인스턴스의 헬스 체크 상태를 모니터링 할 수 있습니다. 헬스 체크를 하는 과정에서 특정 인스턴스의 문제가 감지되면, 자동으로 다른 인스턴스로 교체 합니다.
  • 다수의 EC2 서버에서 애플리케이션을 호스팅 하는 경우, 이들 일련의 EC2 서버 집합을 AWS는 서버 플릿(Fleet)이라 부릅니다. Auto Scaling은 적정 수준의 서버 플릿 용량을 유지하는 데도 도움을 줍니다.
  • 한 대 또는 그 이상의 서버가 다운 되면 Auto Scaling은 6대의 서버 인스턴스 처리 용량을 유지하기 위해 부족분 만큼의 서버를 추가로 실행시키는 방식으로 서버 플릿을 유지합니다.

시작템플릿

  • Auto Scaling으로 인스턴스를 확장 또는 축소하려면 어떤 서버를 사용할지 결정해야 합니다. 이는 시작 템플릿을 통해서 가능하며, AMI 상세 정보, 인스턴스 타입, 키 페어, 시큐리티 그룹 등 인스턴스에 대한 모든 정보를 담고 있습니다. 만약 시작 템플릿을 사용하고 있지 않고 시작 템플릿을 생성하지 않으려는 경우에는 대신 시작 구성을 생성할 수 있습니다. 시작 구성은 EC2 Auto Scaling이 사용자를 위해 생성하는 EC2 인스턴스 유형을 지정한다는 점에서 시작 템플릿과 비슷합니다. 사용할 AMI의 ID, 인스턴스 유형, 키 페어, 보안 그룹 등의 정보를 포함시켜서 시작 구성을 생성합니다.

Auto Scaling 그룹 생성

Auto Scaling 그룹은 스케일업 및 스케인 다운 규칙의 모음으로 EC2 인스턴스 시작부터 삭제까지의 모든 동작에 대한 규칙과 정책을 담고 있습니다.

**Scaling 유형**

  • 인스턴스 레벨 유지
    기본 스케일링 계획으로도 부르며, 항상 실행 상태를 유지하고자 하는 인스턴스의 수를 지정할 수 있습니다. 일정한 수의 인스턴스가 필요한 경우 최소, 최대 및 원하는 용량에 동일한 값을 설정할 수 있습니다.
  • 수동 스케일링
    기존 Auto Scaling 그룹의 크기를 수동으로 변경할 수 있습니다. 수동 스케일링을 선택하면 사용자가 직접 콘솔이나, API, CLI 등을 이용해 수동으로 인스턴스를 추가 또는 삭제 해야 합니다. 해당 방식은 추천하지 않는 방식입니다.
  • 일정별 스케일링
    예측 스케일링트래픽의 변화를 예측할 수 있고, 특정 시간대에 어느 정도의 트래픽이 증가하는지 패턴을 파악하고 있다면 일정별 스케일링을 사용하는 것이 좋습니다. 예를 들어 낮 시간대에는 트래픽이 최고치에 이르고 밤 시간대에는 트래픽이 거의 없다면 낮 시간대에 서버를 증설하고 밤 시간대에 스케일 다운 하는 규칙을 추가하면 됩니다.
  • 동적 스케일링
    수요 변화에 대응하여 Auto Scaling 그룹의 용량을 조정하는 방법을 정의합니다. 이 방식은 CloudWatch가 모니터링 하는 지표를 추적하여 경보 상태일 때 수행할 스케일링 규칙을 정합니다. 예를 들어 CPU 처리 용량의 80% 수준까지 급등한 상태가 5분 이상 지속될 경우 Auto Scaling이 작동돼 새 서버를 추가하는 방식입니다. 이와 같은 스케일링 정책을 정의 할 때는 항상 스케일 업과 스케일 다운 두 가지의 정책을 작성해야 합니다.

**NginX - Proxy Server**

  • 가볍고 높은 성능을 보이는 오픈소스 웹 서버 소프트웨어
  • 웹 서버로 클라이언트에게 정적 리소스를 빠르게 응답하기 위한 웹 서버로 사용할 수 있습니다.

특징

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

  • MacOS는 8080번 포트(localhost:8080), Windows는 80번 포트(localhost:80)가 기본 포트로 설정되어있습니다.

Windows

Nginx 실행파일이 있던 폴더(압축 해제한 폴더)에 설정파일이 모여있는 conf 폴더가 있습니다. conf 폴더 내의 nginx.conf 파일을 수정합니다.

server {
		listen       80; # (Mac OS) 8080 포트에서 80번 포트로 변경합니다.
...
		location / {
				...
				proxy_pass http://localhost:8080; # 요청을 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 재시작**

  • Nginx 실행 파일이 있는 폴더(압축 해제한 폴더)로 이동하여 다음 명령어를 실행

nginx -s reload

Nginx는 다음의 명령어로 종료

$ nginx -s stop

**NGINX - Load Balancer**

  • java -Dserver.port=8081 -jar sample-0.0.1-SNAPSHOT.jar 8081 포트로 서버 실행

NGINX 설정파일 수정

http {
	upstream backend {
		server localhost:8080;
		server localhost:8081;
	}
	location / {
		proxy_pass http://backend;
	}
}
  • backend라는 서버 그룹을 만든 뒤 그룹 자체로 전달을 하는 구조
  • 그룹에 속한 각 서버의 값은 위에서 실행한 두 개의 스프링부트 프로젝트 접속 URL을 작성
    • 포트 번호까지 함께 작성
  • location의 proxy_pass 값으로 해당 서버 그룹을 설정
  • NGINX의 포트는 80번으로 설정되어있기 때문에 포트를 생략한 localhost로 접속시 8080번 포트와 8081번 포트가 번갈아 연결됩니다.

**VPC**

  • Virtual Private Cloud 서비스
  • 클라우드 내 프라이빗 공간을 제공함으로써, 클라우드를 퍼블릭과 프라이빗 영역으로 논리적으로 분리할 수 있게 합니다.

IP 주소

  • IP는 컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신을 하기 위해서 사용하는 특수한 번호
  • IPV4는 2진수 8자리의 형태, 즉 각 8bit(비트)씩 총 32bit로 구성

IP Address Class

  • 호스트가 연결되어 있는 특정 네트워크를 가리키는 8비트의 네트워크 영역(Network Address)과 해당 네트워크 내에서 호스트의 주소(Host Address)를 가리키는 나머지 영역을 구분하기 위해서 클래스(Class)를 사용했습니다.
  • A 클래스단, 0.0.0.0의 경우는 자체 네트워크를 의미하기 때문에 제외되고, 127.0.0.0 ~ 127.255.255.255는 자기 자신을 가리키기 위한 목적으로 예약된 IP주소이기 때문에 사용할 수 없습니다.
    Network AddressHost AddressHost AddressHost Address
    0-1270-2550-2550-255
  • B 클래스
    Network AddressNetwork AddressHost AddressHost Address
    128-1910-2550-2550-255
  • C 클래스
    Network AddressNetwork AddressNetwork AddressHost Address
    192-2230-2550-2550-255

**CIDR(Classless inter-domain routing)**

  • 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한 국제 표준의 IP주소 할당 방법이며, 앞서 설명한 IP 클래스 방식을 대체한 방식
  • 기존에는 클래스에 따라 정해진 Network Address와 Host Address를 사용해야 했다면, CIDR은 원하는 블록만큼 Network Address를 지정하여 운용할 수 있습니다.

  • /16은 첫 16bit를 Network Address로 사용한다는 의미
  • 2^16인 65,536개의 IP주소를 사용할 수 있는 커다란 네트워크 블록을 이러한 방식으로 표시

**서브넷(Subnet)**

  • 서브넷은 서브네트워크(Subnetwork)의 줄임말로 IP 네트워크의 논리적인 하위 부분
  • 퍼블릭 서브넷 : 인터넷을 통해 연결 할 수 있는 서브넷
  • 프라이빗 서브넷 : 인터넷을 연결하지 않고, 보안을 유지하는 배타적인 서브넷
  • VPN only 서브넷 : 기업 데이터 센터와 VPC를 연결하는 서브넷
  • 서브넷은 VPC의 CIDR 블록을 이용해 정의되며, 최소 크기의 서브넷은 /28입니다. 이때 주의 할 점은 서브넷은 AZ당 최소 하나를 사용할 수 있고, 여러 개의 AZ에 연결되는 서브넷은 만들 수 없습니다.

**라우팅 테이블(Routing Table)**

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

0개의 댓글