본문 바로가기
교육

[70일 차] 21.11.02 : DevOps 11

by ballena 2021. 11. 2.

RTO, RPO

동기적/비동기적 디커플링


1교시

 

 

어제는 고가용성을 위해 CloudWatch, AutoScaling 수업

 

다른 가용 영역에 복구 - 오토스케일링을 활용하여 장애가 발생한 가상 서버 복구

 

  • 복구 시간 목표(RTO)

시스템이 오류를 복구하는데 걸리는 시간(= 시스템 중단 후 서비스를 다시 제공하기까지 걸린 시간). 서버 장애 이후 새로운 서버가 시작되고, 내용물이 설치되고 실행되기까지의 시간

  • 복구 지점 목표(RPO)

오류 발생 시 수용할 수 있는 데이터 손실 기간. 데이터 손실의 양은 시간으로 측정된다(오전 10시에 장애 발생 후 오전 9시의 스냅숏으로 시스템을 복구한다면 데이터 손실의 시간 범위는 1시간).

 

어제 한 실습에서는 yml 템플릿을 배포, EC2 인스턴스를 오토스케일링으로 배포했다.

-> 배포된 젠킨스 EC2 인스턴스 종료 후 새롭게 생성된 젠킨스 EC2 인스턴스 확인

이 방식에는 2가지 문제가 있다.

1. 젠킨스 서버는 데이터를 디스크에 저장하는데, 새로운 가상 서버가 시작되면 디스크가 생성되기에 이전 데이터는 손실된다.

-> 여러 가용 영역을 사용하는 관리 서비스 사용(RDS, DynamoDB, S3)

-> EBS 볼륨의 스냅샷을 생성하고 가상 서버를 다른 가용 영역에서 복구할 때 이 스냅숏 사용(EBS 스냅숏은 여러 가용 영역에서 사용할 수 있도록 S3에 저장되어 있다)

-> 분산 서드파티 스토리지 솔루션 사용(GlusterFS, DRBD 등)

※ 젠킨스는 디스크에 데이터를 직접 저장하기에 RDS, DynamoDB, S3 사용 불가. 블록 수준 스토리지를 대신 사용해야 한다.

2. 복구를 위해 새로운 가상 서버가 시작되면 젠킨스 서버의 공용/사설 IP 주소가 바뀐다. 엔드포인트가 변경된다.

-> EIP를 사용하면 해결

-> ELB를 정적 엔드포인트로 사용한다.

AutoScaling EIP 부착


2교시

 

 

받은 템플릿으로 스택 구축

AutoScaling 시작 그룹의 설정에 의해 생성된 인스턴스 종료 후 새롭게 생성된 인스턴스 확인

-> 탄력적 IP 주소 다시 할당되었는지 확인

 

 

RPO를 줄이겠다고 백업을 너무 자주 하면 시스템 성능이 떨어질 수 있다. 데이터 중요도에 따라 RPO를 조절

 

  • Cloud Native

클라우드를 적극적으로 활용하는 것. 

 

 

단일 가상 서버에 대한 RTO와 RPO의 비교

  RTO RPO 가용성
가상 서버가 CloudWatch 알람에 의해 Trigger되어 복구되는 경우 약 10분 데이터 손실 없음 가상 서버의 오류는 복구되지만, 전체 가용 영역의 장애로부터의 복구는 불가
가상 서버가 AutoScaling으로 복구되는 경우 약 10분 마지막 스냅샷 이후의 모든 데이터 손실. 스냅샷을 다시 찍을 수 있는 간격은 30분 ~ 24시간 가상 서버의 오류도 복구되고, 전체 가용 영역의 장애로부터의 복구 가능

 

  • 고가용성 요약

기반 HW와 SW에서 오류가 발생하면 가상 서버에도 오류가 발생한다.

CloudWatch 알람을 활용하여 장애가 발생한 가상 서버를 복구할 수 있다.

-> 동일한 가용 영역 안에서.

AWS 리전은 가용 영역이라는 격리된 데이터센터들로 구성된다.

여러 가용 영역을 사용하면 데이터센터에 장애가 발생해도 복구할 수 있다.

몇몇 AWS 서비스는 기본적으로 여러 가용 영역을 사용하지만, 가상 서버는 단일 가용 영역에서 실행된다.

가용 영역 장애가 발생하는 경우라도 Auto Scaling을 사용해서 단일 가상 서버가 항상 실행되도록 보장할 수 있다.

데이터를 RDS, S3, DynamoDB 같은 관리형 스토리지 서비스 대신 EBS 볼륨에 저장하면 다른 가용 영역에서 복구하기 까다롭다.

 

 

  • 동기(Synchronous)

동시에 일어난다는 뜻. 요청과 그 결과가 동시에 일어난다.

요청을 하면 시간이 얼마가 걸리던 요청한 자리에서 결과가 주어져야 한다.

-> 설계가 간단하고 직관적이지만, 결과가 주어질 때까지 대기해야 한다.

  • 비동기(Asynchronous)

동시에 일어나지 않는다는 뜻. 요청과 결과가 동시에 일어나지 않는다.

요청한 그 자리에서 결과가 주어지지 않으며, 노드 사이의 작업 처리 단위를 동시에 맞출 필요 없다.

-> 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 작업 중 다른 작업을 할 수 있다.

 

  • 인프라 디커플링 개요

회의를 한다고 치면 만족해야 할 조건들이 있다.

같은 위치, 같은 시간, 회의를 할 상대

-> 회의는 '위치'라는 조건에 연결(Coupled)되어 있다.

화상 회의를 한다면 '같은 위치' 조건을 삭제할 수 있다.

-> 회의를 '위치'라는 조건으로부터 연결 해제(Decoupling)

이메일로 대체한다면 '같은 시간', '같은 위치' 조건을 삭제할 수 있다.

 

시스템에서도 커플링된 요소들이 있다.

1. 웹 서버에 요청을 하려면 해당 서버의 공인 IP 주소를 알아야 하고, 서버가 그 주소에 연결되어 있어야 한다.

회의 장소 = 공인 IP 주소

-> EIP를 할당한 Auto Scaling 그룹으로 연결된 ELB를 통해 접근 = 장소(주소) 조건 삭제됨

 

2. 웹 서버에 요청을 하려면 해당 시점에 웹 서버가 온라인 상태여야 한다.

회의 시간 = 특정 시점에 온라인 상태

-> Auto Scaling을 통한 가용성 확보

 

위 2가지 문제는 동기적 디커플링 방법인 ELB로 해결 가능.

 

ELB는 동기적 디커플링 방법

비동기적 디커플링을 위해서는 SQS(Somple Queue Service), SNS(Simple Notification Service) 사용

 

  • SNS

Topic(Publisher/Subscriptor)

Push : 사용자에게 메시지 전송

Fanout : 같은 메시지를 여러 방향으로 발행

메시지를 받는 사용자가 없으면 몇 번 시도하다가 삭제된다(동기식).

하나의 메시지를 사용자들이 각각 다른 방식으로 활용

 

  • SQS

Queue

Pull : 사용자가 메시지를 가져온다

Decouple : 여러 서비스로 분리하여 병렬식 비동기 처리

메시지는 일정 기간동안 유지된다.

하나의 메시지를 사용자들이 동일한 방식으로 활용

(대충 이메일같은 방식이라고 생각하자)

 

 

외부에 웹 서버를 노출하면 종속성이 하나 생긴다.

-> EC2 인스턴스의 공인 IP 주소에 대한 종속성.

= 클라이언트들이 이 주소로 요청을 보낼 것이기에 공인 IP를 변경하기 어렵다.

-> 새로운 서버를 추가해 부하를 분산하려 해도 클라이언트들은 새로운 서버의 주소를 모르고 계속 기존 주소로 요청을 보낸다.

DNS를 사용할 수도 있지만, 이러면 다른 문제가 발생할 수 있으니 배제하고 생각하자.

가장 좋은 해결 방법은 로드 밸런서를 사용하는 것.

-> 동기식 디커플링에 활용 가능 : 로드 밸런서가 요청을 받고, 로드 밸런서는 응답이 가능한 웹 서버에게 요청을 넘기고 응답을 받아서 클라이언트에게 응답


4교시

 

 

그동안 실습에서 HTTP를 사용했는데, 이러면 암호화 문제로 탈취당할 수 있다.

-> HTTPS를 사용해야 한다.

-> 사용하려면 인증서를 만들어야 한다.

-> 인증서가 ELB에도 설정되어 있어야 한다.

 

CMK, ACM, KMS - 키나 인증서까지도 클라우드에서 관리(Cloud Native)


5교시

 

 

로드 밸런서로 동기 디커플링 하기 - ELB와 Auto Scaling의 연동

오토 스케일링 그룹의 앞단을 ELB로 묶는다.

오토 스케일링 그룹은 항시 2대 이상의 서버가 실행되고 있고, 여기서 시작되는 서버는 자동으로 ELB에 등록된다.

 

 

과거에는 ELB-리스너-타겟 그룹을 만들고, 여기에 미리 생성한 EC2 인스턴스 ID를 입력해 연결했다.

-> TargetGroups 타입에 Targets 지시자에 인스턴스 ID를 작성했었다.

 

오토 스케일링 시작 구성 설정 - 인스턴스 2대로 시작해서, 최소 1대, 최대 4대 가동하도록 설정

-> 오토 스케일링 시작 구성이 관리하는 EC2의 주소는 동적이기에 예전처럼 인스턴스 ID로 연동 불가.

Auto Scaling Group

TargetGroup은 ELB TargetGroup 타입의 작업명이다.

TargetGroup

위 코드를 보면 예전에는 Targets 지시자가 있었는데, 여기에는 없다.

기존에는 EC2로 대상을 찍었는데, 이제는 AutoScaling Group을 대상으로 찍어서 그룹 안에서 인스턴스가 늘어나든 말든 알아서 하라고 내버려두는 것.


6~7교시

 

 

받은 템플릿에 에러가 많아서 종일 고쳤다.

오토 스케일링 그룹에서 프라이빗 서브넷을 연결했는데, 이러면 시작 구성을 통해 시작되는 인스턴스들이 프라이빗 인스턴스가 된다.

-> 프라이빗을 그대로 두면 외부 통신이 안되서 패키지가 설치 안됨. NAT 게이트웨이, 프라이빗 라우팅 테이블 생성

-> NAT 게이트웨이로의 라우팅 경로 생성 및 프라이빗 서브넷에 프라이빗 라우팅 테이블 연결

 

AWS::AutoScaling::LaunchConfiguration 타입(시작 구성)은 수정할 수 없는 리소스라 업데이트가 안된다.

-> 이 부분에 수정 사항이 있다면 스택을 삭제 후 재생성할 것.

 

어쨌건 완성한 스택의 작동을 확인

시작하면 2개의 인스턴스가 가동되고 있다.

-> ELB 도메인으로 접속해서 부하 발생시키면 인스턴스가 4개까지 늘어난다


8교시

 

 

그런데 늘어난 인스턴스가 다시 줄어드는데는 시간이 꽤 걸리는 것 같다.

-> 어디서인지는 몰라도 요청이 주기적으로 들어오고 있다.

 

뒤져보니 인스턴스 중 하나가 계속 CPU 사용량이 99 퍼였다.

-> 해당 인스턴스로 들어가 httpd를 종료시키던가, 인스턴스를 종료시키던가


3교시(11:30 ~ 11:50) 동기/비동기 설명 다시 듣기

4교시(12:30~12:45)

'교육' 카테고리의 다른 글

[72일 차] 21.11.04 : DevOps 13  (0) 2021.11.04
[71일 차] 21.11.03 : DevOps 12  (0) 2021.11.03
[69일 차] 21.11.01 : DevOps 10  (0) 2021.11.01
[68일 차] 21.10.29 : DevOps 9  (0) 2021.10.29
[67일 차] 21.10.28 : DevOps 8  (0) 2021.10.28

댓글