Skip to content

Commit 94f78f1

Browse files
authored
Merge pull request #8 from ssuperpower-developer/hyegyeong/week2
고가용성 및 오토 스케일링
2 parents 52b6c04 + 6b6f83c commit 94f78f1

11 files changed

+289
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
2+
# Sticky Session (Session Affinity)
3+
4+
쿠키를 통해 클라이언트 요청이 로드밸런서를 거치더라도 **같은 EC2 인스턴스에 지속적으로 연결**되도록 하는 기능이다. **CLB**, **ALB**, **NLB**에서 사용할 수 있다.
5+
6+
## 동작 과정
7+
8+
1. 클라이언트가 로드 밸런서에 요청 시 **쿠키를 받음**
9+
2. 이후 요청 시 이 쿠키를 사용하면 **같은 인스턴스에 라우팅 됨**
10+
3. 쿠키가 만료되면 라우팅 대상이 바뀔 수 있음
11+
12+
## 그 쿠키는 어떻게 만드나요?
13+
14+
1. Application Cookie
15+
어플리케이션이 직접 만든 쿠키를 사용할 수 있다.
16+
2. Duration-based Cookies
17+
로드밸런서가 만들어주는 쿠키를 사용할 수 있다. 이때 쿠키는 AWSALB, AWSALBAPP와 같은 이름으로 만들어진다. 따라서, 저 이름을 어플리케이션에서 사용하면 안된다.
18+
19+
---
20+
21+
# Cross-Zone Load Balancing
22+
23+
**여러 Availability Zone**에 인스턴스들이 있어도 로드밸런서가 **트래픽을 고르게 분산**하는 기능이다.
24+
25+
## 작동 방식
26+
27+
아래 그림을 이해하면 된다.
28+
29+
만약 Cross-Zone Load Balancing 기능이 활성화 되어있지 않다면, AZ 1에 있는 인스턴스들은 25씩의 부하를 받게되고, AZ 2의 인스턴스들은 6.25씩 받게된다.
30+
31+
이런 상황을 막기 위해 로드밸런서가 다른 AZ로 트래픽을 전송하여 고르게 분배되도록 하는 것이다.
32+
![[Pasted image 20250504212253.png]]
33+
34+
## 로드 밸런서별 요금과 기본 값
35+
36+
| 로드 밸런서 유형 | 기본 상태 | 비용 발생 여부 |
37+
| --------- | -------- | ---------------------- |
38+
| **ALB** | **활성화** | **X** (AZ 간 전송 무료) |
39+
| **NLB** | **비활성화** | **O** (활성화 시 전송 요금 발생) |
40+
| **GWLB** | **비활성화** | **O** (NLB와 동일) |
41+
| **CLB** | **비활성화** | **X** (활성화해도 무료) |
42+
43+
### 상황별 예시
44+
45+
- **트래픽 균형이 중요한 경우** -> 사용하는게 좋다.
46+
- **요금이 민감하거나 AZ 구조가 대칭적일 경우** -> 사용하지 않는게 좋다.
47+
- **ALB를 사용하는 경우** -> 기본으로 활성화되며 추가비용도 없으니 사용하는게 좋다.
48+
49+
---
50+
51+
## SSL/TLS 인증서
52+
53+
### 기본 개념
54+
55+
SSL은 연결의 양 끝단에 있는 클라이언트와 서버만 복호화 할 수 있게 암호화하는 기술이다. 이를 In-flight encryption라고 부른다.
56+
57+
### 작동 방식
58+
59+
1. 클라이언트가 **HTTPS**로 로드 밸런서에 트래픽 전송
60+
2. 로드밸런서는 요청을 복호화함. 이를 **SSL 종료(SSL Termination)라고 한다.**
61+
3. 이후 백엔드(EC2 등)에서는 Private IP를 사용하므로 **HTTP** 요청으로 전달해도 안전하다.
62+
63+
### ACM
64+
65+
AWS Certification Manager로 인증서 발급과 관리를 담당한다. 물론 자체 발급 인증서를 업로드 할 수도 있다.
66+
67+
## SNI (Server Name Indication)
68+
69+
Server Name Indication의 약자로, 여러개의 인증서를 웹서버에 로드해서 사용할 수 있는 기술이다.
70+
71+
ALB의 두개의 타겟 그룹이 서로 다른 도메인을 가지고 있다. 하지만 SSL 인증서는 도메인 단위로 발급되기 때문에, 아래 그림과 같은 상황에서는 SNI가 지원되어야만 한다. 클라이언트가 SSL 핸드셰이크를 보낼 때 요청 도메인 정보를 확인해서 올바른 인증서를 로드한다.
72+
![[Pasted image 20250504214611.png]]
73+
74+
### SNI 지원 로드 밸런서
75+
76+
| 로드 밸런서 유형 | SNI 지원 여부 | 다중 인증서 지원 |
77+
| --------- | --------- | --------- |
78+
| **ALB** |||
79+
| **NLB** |||
80+
| **CLB** |||
81+
82+
- **ALB/NLB**: 여러 도메인용 인증서 → 하나의 리스너에서 처리 가능
83+
- **CLB**: 도메인마다 로드 밸런서를 따로 만들어야 함
84+
85+
---
86+
87+
# Connection Draining (Deregistration Delay)
88+
89+
인스턴스를 로드밸런서에서 제거할 때, **기존 연결을 즉시 끊지 않고 일정 시간 동안 유지**하여 **이미 활성 요청을 마무리**할 수 있도록 하는 기능이다. **CLB**에서는 Connection Draining라고 부르고, **ALB와 NLB**에서는 Deregistration Delay라고 부른다.
90+
91+
### 작동 방식
92+
93+
1. 인스턴스가 **로드밸런서 등록 취소 또는 비정상 상태**가 됨.
94+
2. 로드 밸런서는 해당 인스턴스에 **새 요청을 더이상 보내지 않음.**
95+
3. 기존 연결은 **지정된 시간 동안 유지**.
96+
4. 모든 연결이 종료 되면 인스턴스 제거.
97+
98+
### 설정
99+
100+
- **지연 시간 설정 범위**: `1 ~ 3,600초` (최대 1시간)
101+
- **기본값**: `300초` (5분)
102+
- **0초 설정 시**: 기능 비활성화 (인스턴스를 즉시 종료)
103+
104+
-> 요청에 걸리는 평균 시간에 맞게 적절히 설정해주면 된다. 보통의 경우 요청이 1초안에 끝난다면 30초 정도로 설정해주면 좋다.
105+
106+
---
107+
108+
# ASG
109+
110+
Auto Scailing Group의 약자로 현재 부하에 맞게 **EC2 인스턴스를 자동으로 생성하거나 제거**하는 기술이다.
111+
- **스케일 아웃**: 부하 증가 → 인스턴스 추가
112+
- **스케일 인**: 부하 감소 → 인스턴스 제거
113+
114+
## 동작 방식
115+
116+
1. 최소 용량, 희망 용량, 최대 용량을 설정.
117+
2. Launch Template을 정의.
118+
EC2를 생성할 때 어떻게 생성할지를 정의하는 것이다.
119+
포함 내용: AMI, 인스턴스 타입, 사용자 데이터, 보안 그룹, IAM 역할 등
120+
3. CloudWatch 설정
121+
어떤 Metric을 기준으로 부하를 모니터링 할지 정하는 것이다. CPU 사용량 등 원하는 Metric을 지정할 수 있다. CloudWatch에서 Alarm이 울리면 Scale-In이나 Scale-out이 수행된다.
122+
![[Pasted image 20250504220237.png]]
123+
## 스케일링 정책
124+
125+
### 유형
126+
127+
| 정책 유형 | 설명 |
128+
| ------------------- | ------------------------------------ |
129+
| **Target Tracking** | 메트릭을 설정값(예: CPU 40%) 근처로 유지하도록 자동 조절 |
130+
| **Simple** | CloudWatch 알람 기반으로 인스턴스를 증가/감소 |
131+
| **Step** | 임계값을 초과하는 정도에 따라 인스턴스 수를 조절 |
132+
| **Scheduling** | 특정 시간에 스케일 조정 (예: 금요일 17시에 최소 용량 증가) |
133+
| **Predictive** | 과거 부하를 학습해 미래 스케일링을 **미리 예약** |
134+
135+
### Metric의 종류
136+
137+
| 메트릭 | 설명 |
138+
| ----------------- | ----------------------------------- |
139+
| **CPU 사용률** | 가장 일반적인 기준, 평균 CPU가 높으면 확장 |
140+
| **ELB의 타깃당 요청 수** | 평균 미해결 요청 수 기반으로 확장 (L7 애플리케이션에 유용) |
141+
| **네트워크 사용량** | 인/아웃 바이트 수를 기준으로 스케일 |
142+
| **사용자 정의 메트릭** | CloudWatch에서 정의한 커스텀 메트릭 사용 가능 |
143+
144+
### Cooldown
145+
146+
인스턴스를 추가하거나 제거한 후 메트릭이 안정되기를 기다리는 것이다. 쿨다운 시간이 되면 **ASG는 일정 시간 동안 새로운 작업을 보류**한다.
147+
148+
- **기본값**: `300초 (5분)`
149+
- **EC2 설정 속도가 빠르다면** 쿨다운 시간 단축 가능
150+
- CloudWatch의 **고해상도 모니터링(1분 단위)을 함께 사용하면 민첩한 대응 가능
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
2+
## 로드 밸런서란?
3+
![[Pasted image 20250503235709.png]]
4+
- 하나의 엔드포인트로 클라이언트 요청을 받아서 **백엔드 서버들(EC2 등)로 분산 처리**하는 역할을 함.
5+
6+
### 기능과 장점
7+
8+
1. **트래픽 분산**
9+
각 유저의 요청을 다른 인스턴스로 자동 분배
10+
2. **Health Check**
11+
특정 인스턴스가 응답하지 않으면 해당 인스턴스로는 요청 전송 ❌
12+
예: HTTP 4567 포트의 `/health`에서 상태 체크
13+
3. **SSL 종료 (SSL Termination)**
14+
HTTPS 트래픽을 로드 밸런서에서 처리하여 EC2는 HTTP로 통신
15+
4. **고정 세션 (Sticky Session)**
16+
쿠키 기반으로 클라이언트 요청을 동일 인스턴스로 유지 가능
17+
5. **보안 강화**
18+
로드 밸런서는 `0.0.0.0/0`에서 80, 443 포트 허용하고, EC2는 **로드 밸런서 보안 그룹**만 허용
19+
-> EC2는 오직 로드밸런서에서 오는 요청만 받게됨
20+
21+
### ELB의 종류
22+
23+
| 이름 | 프로토콜 | 특징 |
24+
| --------------------- | ---------------------- | -------------- |
25+
| **CLB** (Classic) | HTTP, HTTPS, TCP | 지금은 Deprecated |
26+
| **ALB** (Application) | HTTP, HTTPS, WebSocket | L7 로드 밸런싱 |
27+
| **NLB** (Network) | TCP, UDP, TLS | L4 고성능 트래픽 |
28+
| **GWLB** (Gateway) | L3 (IP 기반) | 보안 어플라이언스 통합용 |
29+
30+
---
31+
32+
# ALB
33+
34+
7계층인 Application Layer에서 작동하는 로드밸런서이다. 하나의 ALB로 **여러 애플리케이션 트래픽**을 처리 가능하다는 특징이 있어서 MSA와 컨테이너 기반 애플리케이션에 아주 적합하다!
35+
36+
### 주요 기능
37+
38+
![[Pasted image 20250503235913.png]]
39+
40+
1. **경로 기반 라우팅 (Path-based Routing)**
41+
`/users` → 대상 그룹 A, `/search` → 대상 그룹 B
42+
2. **호스트 기반 라우팅 (Host-based Routing)**
43+
`one.example.com` → 그룹 A, `other.example.com` → 그룹 B
44+
3. **쿼리 스트링 / 헤더 기반 라우팅**
45+
`?platform=Mobile` → 모바일 전용 그룹
46+
47+
### Target Group (대상 그룹)
48+
49+
ALB가 요청을 분배하는 단위를 말한다. 아래 요소들이 타겟 그룹이 될 수 있다. 또한, **Health Check는 타켓 그룹 레벨에서 수행된다.**
50+
- EC2 인스턴스
51+
- ECS 작업(Task)
52+
- Lambda 함수
53+
- 사설 IP 기반 온프레미스 서버
54+
55+
### 클라이언트, ALB, EC2의 통신
56+
57+
- ALB에는 **DNS Name**이 부여됨. 예를 들어,`abc.amazonaws.com`
58+
- 클라이언트의 실제 IP는 직접 전달되지 않음
59+
![[Pasted image 20250504000004.png]]
60+
1. 클라이언트가 ALB의 Public IP로 요청을 보냄. (DNS Name을 통해 이루어짐.)
61+
2. ALB와 EC2는 각자의 Private IP로 통신하며 클라이언트 요청을 수행함.
62+
따라서, EC2는 클라이언트의 실제 IP를 알 수 없음.
63+
3. `X-Forwarded-For`, `X-Forwarded-Port`, `X-Forwarded-Proto` 헤더로 클라이언트의 정보를 확인 가능.
64+
65+
66+
---
67+
# 네트워크 로드 밸런서 (NLB)
68+
69+
- **4계층**인 TCP, UDP 기반으로 동작하는 **엄청! 고성능인 로드밸런서**이다. 초당 **수백만 건의 요청 처리**가 가능하며, 지연 시간도 짧다. 중요한 특징으로는, 하나의 Availability Zone마다 하나의 고정 IP를 할당받는다. (물론 Elastic IP를 가지고 있다면 사용할 수 있다!)
70+
71+
## 시험에 어떻게 나오는가?
72+
73+
1. 애플리케이션이 하나, 두 개 또는 세 개의 다른 IP로만 접근할 수 있다고 할 때
74+
2. 극한의 성능, TCP 또는 UDP, 고정 IP가 나올 때
75+
76+
## ALB와 비교
77+
78+
작동 방식이 ALB와 아주 유사하다. 보안 그룹과 Target Group을 사용하는 것과 Health Check가 이루어지는 것도 모두 같다. 그래서 ALB를 맨 처음에 배우나보다.. 아래는 NLB만의 차이점이다.
79+
80+
1. **TCP, UDP 지원**
81+
어플리케이션은 여전히 HTTP로 작동하지만, 클라이언트는 TCP로 요청을 보낼 수 있다.
82+
2. **고정 IP 지원**
83+
ALB는 로드밸런서에 고정 IP가 생기는 것이 아니라 DNS Name이 할당된다. 따라서 DNS Name에 할당 된 IP가 변할 수 있으므로 고정 IP가 아니다. 반면, NLB에는 고정 IP가 할당된다.
84+
3. **대상 그룹**
85+
ALB에서 설명한 대상 그룹 모두 동일하게 쓸 수 있다. 단, NLB에서는 ALB를 대상 그룹으로 사용할 수 있다. 이때는 NLB가 ALB 앞에 있는 구조가 된다.
86+
87+
1, 2, 3번을 조합하면 아래 그림과 같은 구조이다.
88+
NLB는 고정 IP를 제공하고, 빠른 속도로 부하를 처리하는 역할을 수행하고, 뒷 단에 있는 ALB는 HTTP 트래픽을 세부 라우팅 하는 역할을 수행한다.
89+
![[Pasted image 20250504004326.png]]
90+
91+
---
92+
93+
# GWLB
94+
95+
**3계층인 IP** 기반으로 작동하는 로드밸런서이다. 다른 것들과는 조금 성격이 다르다. 모든 트래픽이 GWLB를 통과하게 해서 서드파티 보안 어플라이언스를 (방화벽 등) 거치게 하는 것이 주된 목적이다.
96+
97+
## 동작 방식
98+
99+
아래 그림을 이해하는 것이 가장 중요하다.
100+
1. 유저가 보내는 **모든 트래픽이** GWLB를 통과한다.
101+
2. GWLB를 통해 Target Group인 서드파티 보안 어플라이언스로 트래픽이 전송된다.
102+
3. 보안에 위배된 트래픽은 버려지고, 적합한 트래픽만 다시 GWLB로 돌려보내진다.
103+
4. GWLB는 돌아온 트래픽을 ALB나 어플리케이션에 전달한다.
104+
![[Pasted image 20250504205406.png]]
105+
106+
## 시험에 나오는 내용
107+
108+
- Target Group은 보안을 담당하는 서드파티 어플라이언스이다.
109+
이런 어플리케이션이 돌아가는 EC2 ID나 Private IP를 등록하면 된다.
110+
- 포트는 6081번, 프로토콜은 **GENEVE**
111+
- EC2나 ALB 앞 단에 보안 계층 추가가 필요하면 GWLB 고려
112+
113+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
## 확장성 (Scalability)
2+
3+
조정을 통해 시스템이 더 많은 양을 처리할 수 있는 능력
4+
5+
### 수직 확장 (Vertical Scaling)
6+
단일 인스턴스의 퍼포먼스를 올리는 것. 예시로 t2.micro → t2.large
7+
- 주로 분산이 어려운 DB 등에 사용
8+
- 하드웨어 업그레이드에 한계가 존재
9+
10+
### 수평 확장 (Horizontal Scaling)
11+
인스턴스 수를 늘리는 것.
12+
- 작업 분산 처리 가능
13+
- 로드 밸런서 필요
14+
- 클라우드 환경에서 용이
15+
16+
## 고가용성 (High Availability)
17+
18+
시스템의 일부에 장애가 발생해도 계속 서비스를 제공할 수 있는 능력
19+
- **여러 Availability Zone에 인스턴스 분산
20+
- RDS 다중 AZ, ELB + Auto Scaling Group
21+
22+
여기서도 스케일링과 동일하게 Vertical Scaling과 Horizontal Scaling을 사용한다.
23+
- Vertical Scaling으로 인스턴스의 퍼포먼스를 늘리거나 줄이면?
24+
-> Scale up / Down
25+
- Horizontal Scaling으로 인스턴스의 수를 늘리거나 줄이면?
26+
-> Scale Out / In
61.1 KB
Loading
99.8 KB
Loading
41.2 KB
Loading
99.5 KB
Loading
61.5 KB
Loading
74.9 KB
Loading
48.7 KB
Loading
51.1 KB
Loading

0 commit comments

Comments
 (0)