[DevOps] AWS ELB 사용하여 로드 밸런싱 적용하기

2024. 11. 13. 17:48· DevOps
목차
  1. 1. 로드 밸런싱
  2. 1-1. 로드 밸런싱 필요성
  3. 1-2. AWS ELB
  4. 1-3. ELB 구성 요소
  5. 1-4. ELB 동작 과정
  6. 2. AWS ELB 사용하기
  7. 2-1. 예시 상황 설명
  8. 2-2. ALB
  9. 2-2-3. ALB 동작 확인
  10. 2-3. ALB 경로 기반 라우팅
  11. 2-4. NLB
  12. 2-5. NLB 교차 영역 로드 밸런싱

1. 로드 밸런싱

  • 네트워크 트래픽을 여러 서버로 분산시키는 기술
  • 하나의 서버에 부하가 집중되는 것을 방지 ⇒ 애플리케이션의 가용성과 성능 높일 수 있음!

 

1-1. 로드 밸런싱 필요성

  • 트래픽 분산
    • 사용자가 많은 애플리케이션 ⇒ 모든 요청이 단일 서버로 들어오면 해당 서버가 과부하 ⇒ 성능 저하
    • 로드 밸런서는 트래픽을 여러 서버로 분산시켜 이 문제를 해결 가능
  • 고가용성
    • 서버 중 하나가 장애가 발생하더라도 로드 밸런서는 자동으로 다른 서버로 트래픽을 우회시킴 ⇒ 서비스의 지속성 유지
  • 장애 조치(Failover)
    • 특정 서버에 장애 발생 ⇒ 이를 감지하고 자동으로 다른 서버로 요청 전환 ⇒ 서비스 중단을 최소화할 수 있음
  • 스케일링
    • 사용자가 증가함 ⇒ 서버 추가, 수평 확장 해야할 때 ⇒ 로드 밸런서는 새로운 서버를 쉽게 통합하여 트래픽을 분산시킴
  • 성능 향상
    • 각 서버의 상태를 모니터링 ⇒ 가장 적절한 서버에 요청 전달 ⇒ 응답 시간 단축 + 사용자 경험 개선 가능

 

1-2. AWS ELB

  • ELB (Elastic Load Balancing)
    • AWS가 제공하는 로드 밸런싱 서비스임
    • 트래픽 변화 감지
      • 트래픽 증가 ⇒ 로드 밸런서 수를 자동으로 증가
      • 트래픽 감소 ⇒ 로드 밸런서 수를 자동으로 감소
    • 주기적인 health check
      • ELB와 연결된 서버들의 상태를 주기적으로 체크
      • 장애 발생 or 부하 집중 ⇒ 다른 서버로 요청 전송함
    • 다양한 종류
      1. Application Load Balancer (ALB)
        • HTTP 및 HTTPS 트래픽 처리
        • URL 기반 라우팅, 웹소켓 지원, HTTP/2 지원
        • 마이크로서비스 아키텍처 or 웹 애플리케이션에 적합함
      2. Network Load Balancer (NLB)
        • TCP 및 UDP 트래픽 처리 ⇒ 고속의 성능 제공
        • 수백만 개의 요청을 초당 처리 가능
        • 실시간 데이터 처리 또는 대량의 트래픽을 요구하는 애플리케이션에 적합함
      3. Gateway Load Balancer (GLB)
        • 가상 어플라이언스 (ex. 방화벽, IDS/IPS) 의 배포와 관리를 용이하게 함
        • 트래픽을 자동으로 가상 어플라이언스로 전달
        • 보안 및 네트워크 서비스를 제공하는 경우에 유용함

 

1-3. ELB 구성 요소

  1. 로드 밸런서 (Load Balancer)
    • ELB의 핵심 컴포넌트
    • 클라이언트 요청 수신 → 리스너로 전달 → (리스너가 대상 그룹을 선택하면) → 대상 그룹 내 서버들의 헬스 체크 진행 → 트래픽을 적절한 서버로 전달
  2. 헬스 체크 (Health Check)
    • 로드 밸런서가 각 대상의 상태를 확인하는 방법
    • 설정한 주기마다 각 대상(서버)으로 요청을 보냄 ⇒ 정상 응답을 받지 못하는 경우, 해당 대상을 비활성화함
    • 위의 과정으로 트래픽이 정상 상태의 대상으로만 전달되도록 할 수 있음
  3. 리스너 (Listener)
    • 로드 밸런서가 수신하는 요청의 프로토콜과 포트 정의
    • HTTP, HTTPS, TCP, UDP 등 다양한 프로토콜 지원
    • 요청을 적절한 대상 그룹으로 라우팅 하는 규칙(리스너 규칙) 설정 가능
  4. 리스너 규칙 (Linstener Rules)
    • 리스너가 수신한 요청을 어떤 대상 그룹으로 라우팅할 지를 결정하는 조건 설정
  5. 대상 그룹 (Target Group)
    • 로드 밸런서가 트래픽을 분산시킬 대상으로 설정하는 서버들의 집합

 

1-4. ELB 동작 과정

  1. 클라이언트 요청: 사용자가 웹 브라우저나 애플리케이션을 통해 로드 밸런서의 DNS 이름 또는 IP 주소로 요청 보냄
  2. 로드 밸런서 수신: ELB가 클라이언트의 요청을 수신함
    • 로드 밸런서는 설정된 리스너를 통해 요청을 처리
  3. 리스너 규칙 적용: 로드 밸런서는 요청의 프로토콜과 포트에 따라 리스너 규칙을 확인함
    • 요청의 URL 경로, 헤더, 메소드 등을 기준으로 어떤 대상 그룹으로 라우팅할지를 결정.
  4. 헬스 체크 수행: 로드 밸런서는 각 대상 그룹의 인스턴스에 대해 헬스 체크를 수행하여 정상 상태인지 확인함
    • 비정상 상태인 인스턴스는 요청에서 제외
  5. 대상 선택: 헬스 체크를 통과한 대상 인스턴스 중에서 로드 밸런서는 부하 분산 알고리즘(ex. 라운드 로빈, 최소 연결 등)에 따라 최적의 인스턴스를 선택함
  6. 요청 전달: 선택된 대상 인스턴스에 클라이언트의 요청을 전달함
    • 이 때, 로드 밸런서는 클라이언트와 인스턴스 간의 트래픽을 처리함
  7. 응답 수신 및 전달: 대상 인스턴스가 클라이언트의 요청을 처리하고 응답을 생성함 → 로드 밸런서는 이 응답을 다시 클라이언트에게 전달함
  8. 모니터링 및 로그 기록: ELB는 트래픽 패턴, 응답 시간, 오류 등의 데이터를 모니터링하고, 필요 시 로그를 기록하여 성능을 분석함

 


 

2. AWS ELB 사용하기

 

2-1. 예시 상황 설명

  • 구조 설명
    • Client VPC
      • CLIENT-Public-Subnet
        • ClientEC2
    • Server VPC
      • SERVER-Public-Subnet-1
        • SERVER-EC2-1
        • SERVER-EC2-2
      • SERVER-Public-Subnet-2
        • SERVER-EC2-3
        • SERVER-EC2-4
        • SERVER-EC2-5
  • foo, bar 디렉토리 설명
    • foo 디렉토리
      • 서버: SERVER-EC2-1
      • 위치: /var/www/html/foo
      • 이 디렉토리 내부에 index.html 파일이 생성됨
      • 파일의 내용은 "foo page in SERVER-EC2-1"임. 이는 SERVER-EC2-1에 접속했을 때 보여지는 웹 페이지의 내용임
    • bar 디렉토리
      • 서버: SERVER-EC2-3
      • 위치: /var/www/html/bar
      • 이 디렉토리 내부에 index.html 파일이 생성됨
      • 파일의 내용은 "bar page in SERVER-EC2-3"임. 이는 SERVER-EC2-3에 접속했을 때 보여지는 웹 페이지의 내용임

 

2-2. ALB

2-2-1. 대상 그룹 생성

  • 검색창에 EC2 검색 → 클릭

 

  • 왼쪽의 대상 그룹 클릭 → 대상 그룹 생성 클릭

 

  • 인스턴스 선택 → 대상 그룹 이름 입력 → SERVER-VPC 선택 → 다음 클릭

 

  • 모든 인스턴스 선택 → 아래에 보류 중인 것으로 포함 클릭

 

  • 모든 인스턴스가 대상으로 추가됨을 확인 → 대상 그룹 생성 클릭

 

  • 대상 그룹 생성 완료 확인

 

2-2-2. ALB 생성

  • 왼쪽의 로드밸런서 클릭 → 로드 밸런서 생성 클릭

 

  • Application Load Balancer 탭의 생성 클릭

 

  • 로드 밸런서 이름 입력 → SERVER-VPC 선택 → 가용 영역 모두 체크 → 보안 그룹 선택 → (리스너 및 라우팅에서) 다음으로 전달: 이전에 생성한 대상 그룹 선택 → 로드 밸런서 생성 클릭

 

  • 시간이 지나고 새로고침 클릭 → 상태가 (프로비저닝 중) ⇒ (활성) 으로 변경됨을 확인

 

2-2-3. ALB 동작 확인

  • 왼쪽의 인스턴스 클릭 → CLIENT-EC2 체크 → 퍼블릭 IPv4 복사

 

  • 터미널 실행 → ssh로 CLIENT-EC2 인스턴스 접속
ssh -i PEM키 이름.pem 인스턴스 계정이름@퍼블릭IPv4

# 예시
ssh -i myPemKey.pem ec2-user@3.36.69.141

 

  • AWS에서 왼쪽의 로드 밸런서 클릭 → 생성한 로드 밸런서 체크 → DNS 이름 복사

 

  • ALB의 DNS 이름을 환경 변수로 등록
Test_ALB=test-ALB-1447934206.ap-northeast-2.elb.amazonaws.com

# 확인
echo $Test_ALB

 

  • ALB에 연결된 A 레코드 확인
dig $Test_ALB

⇒ ALB에 연결된 A 레코드가 2개임!

⇒ A 레코드 2개 = 퍼블릭 IP 2개 = 서브넷 1, 2에 각각 존재하는 ENI에 할당된 퍼블릭 IP

 

  • ALB 도메인으로 100번 접근
for i in {1..100}; do curl $Test_ALB --silent ; done | sort | uniq -c | sort -n

⇒ 1 ~ 5의 서버로 요청이 분산되어 전달됨을 확인 가능!

 

ALB : 교차 영역 로드 밸런싱이 기본적으로 활성화됨

⇒ 서브넷 (가용 영역 당 하나) 내 인스턴스 수가 달라도 대상 그룹내에서 고르게 부하 분산해줌!

 

2-3. ALB 경로 기반 라우팅

 

2-3-1. ALB 경로 기반 라우팅 설정

  • 왼쪽의 대상 그룹 클릭 → 대상 그룹 생성 클릭

 

  • 인스턴스 선택 → 대상 그룹 이름 입력 → SERVER-VPC 선택 → 다음 클릭

 

  • SERVER-EC2-1, SERVER-EC2-2 체크 → 아래에 보류 중인 것으로 포함 클릭

 

  • 체크한 인스턴스가 대상으로 추가됨을 확인 → 대상 그룹 생성 클릭

 

  • 동일한 작업 반복 *(이때, 인스턴스는 SERVER-EC2-3, SERVER-EC2-4, SERVER-EC2-5를 체크함!)

 

  • 왼쪽에서 로드밸런서 클릭 → test-ALB 체크 → 리스너 및 규칙 탭 클릭 → HTTP:80 체크 → 규칙 관리 클릭 → 규칙 추가 클릭

 

  • 규칙 이름 입력 → 다음 클릭

 

  • 조건 추가 클릭 → 규칙 조건 유형: 경로 선택 → 경로에 “/foo/*” 입력 → 확인 클릭 → 다음 클릭

 

  • 대상 그룹으로 전달 선택 → 대상 그룹 (test-Foo-target-group) 선택 → 다음 클릭

 

  • 우선 순위 1 입력 → 다음 클릭

 

  • 생성 클릭

 

  • 동일한 과정 진행 (규칙을 1개 더 생성함)
    • 규칙 이름 : test_Bar
    • 경로 : /bar/*
    • 대상 그룹 : test-Bar-target-group 선택
    • 우선 순위 : 2

 

2-3-2. ALB 경로 기반 라우팅 동작 확인

  • foo 경로에 대한 경로 기반 라우팅 테스트
for i in {1..100}; do curl $Test_ALB/foo/ --silent ; done | sort | uniq -c | sort -n

⇒ foo 경로로 요청함 → 우선 순위 1 규칙인 경로 기반 라우팅이 먼저 이루어짐 → SERVER EC2-1, SERVER EC2-2로만 라우팅됨 → 우선순위 마지막 규칙에 따라 균등하게 부하 분산됨

 

  • bar 경로에 대한 경로 기반 라우팅 테스트
for i in {1..100}; do curl $Test_ALB/bar/ --silent ; done | sort | uniq -c | sort -n

⇒ bar 경로로 요청함 → 우선 순위 2 규칙인 경로 기반 라우팅이 먼저 이루어짐 → SERVER EC2-3, SERVER EC2-4, SERVER EC2-5로만 라우팅됨 → 우선순위 마지막 규칙에 따라 균등하게 부하 분산됨

 

2-4. NLB

 

2-4-1. 대상 그룹 생성

  • 왼쪽의 대상 그룹 클릭 → 대상 그룹 생성 클릭

 

  • 인스턴스 선택 → 대상 그룹 이름 입력 → 프로토콜: UDP 선택 → 포트: 161 입력 → SERVER-VPC 선택

 

  • 상태 검사 프로토콜: HTTP 선택 → 고급 상태 검사 설정 탭 열기 → 상태 검사 포트 : 재정의 선택 → 80 입력 → 다음 클릭

 

  • 모든 인스턴스 선택 → 아래에 보류 중인 것으로 포함 클릭

 

  • 모든 인스턴스가 대상으로 추가됨을 확인 → 대상 그룹 생성 클릭

 

2-4-2. NLB 생성

  • 왼쪽에서 로드밸런서 클릭 → 로드 밸런서 생성 클릭

 

  • Network Load Balancer 탭의 생성 클릭

 

  • 로드 밸런서 이름 입력 → SERVER-VPC 선택 → 가용 영역 모두 체크 → 보안 그룹 선택 → 프로토콜: UDP 선택 → 포트: 161 입력 → 다음으로 전달: 생성한 대상 그룹 선택 → 로드 밸런서 생성 클릭

 

  • 시간이 지나고 새로고침 클릭 → 상태가 (프로비저닝 중) ⇒ (활성) 으로 변경됨을 확인

 

2-4-3. NLB 동작 확인

  • DNS 이름 복사

 

  • 터미널 실행 → ssh로 CLIENT-EC2 인스턴스 접속

 

  • NLB의 DNS 이름을 환경 변수로 등록
Test_NLB=test-NLB-edf781ea8ff75454.elb.ap-northeast-2.amazonaws.com

# 확인
echo $Test_NLB

 

  • NLB에 연결된 A 레코드 확인
dig $Test_NLB

⇒ NLB에 연결된 A 레코드가 2개임!

⇒ A 레코드 2개 = 퍼블릭 IP 2개 = 서브넷 1, 2에 각각 존재하는 ENI에 할당된 퍼블릭 IP

 

  • NLB 도메인으로 100번 접근
for i in {1..100}; do snmpget -v2c -c public $Test_NLB 1.3.6.1.2.1.1.5.0; done | sort | uniq -c | sort -n

⇒ 서브넷 1 (SERVER-EC2-1, SERVER-EC2-2) : 23 + 27 = 50

⇒ 서브넷 2 (SERVER-EC2-3, SERVER-EC2-4, SERVER-EC2-5) : 15 + 14 + 21 = 50

⇒ 가용 영역을 기준으로 고르게 분산함! (NLB는 교차 영역 로드 밸런싱이 기본적으로 비활성화 상태이므로)

 

2-5. NLB 교차 영역 로드 밸런싱

 

2-5-1. NLB 교차 영역 로드 밸런싱 활성화

  • 왼쪽의 로드밸런서 클릭 → 생성한 NLB 체크 → 속성 탭 클릭 → 편집 클릭

 

  • 교차 영역 로드 밸런싱 활성화 체크 → 변경 내용 저장 클릭

 

  • 속성 탭의 교차 영역 로드 밸런싱 값이 켬 으로 변환됨을 확인

 

2-5-2. NLB 교차 영역 로드 밸런싱 동작 확인

  • NLB 도메인으로 100번 접근
for i in {1..100}; do snmpget -v2c -c public $Test_NLB 1.3.6.1.2.1.1.5.0; done | sort | uniq -c | sort -n

⇒ 서브넷 1 (SERVER-EC2-1, SERVER-EC2-2) : 20 + 21 = 41

⇒ 서브넷 2 (SERVER-EC2-3, SERVER-EC2-4, SERVER-EC2-5) : 22 + 17 + 20 = 59

⇒ 모든 인스턴스에 고르게 분산됨! (가용 영역 내 인스턴스의 수가 불균등하더라도 각 인스턴스는 균등한 부하를 부여받음!)

저작자표시 변경금지 (새창열림)

'DevOps' 카테고리의 다른 글

[DevOps] AWS EC2 인스턴스에 Spring 애플리케이션 배포하기 / + 백그라운드에서 배포 방법 (nohup, tmux, (리눅스) systemd 서비스 파일)  (0) 2024.11.06
[DevOps] 구매한 도메인을 EC2에 연결 (AWS Route 53, 가비아)  (0) 2024.04.04
  1. 1. 로드 밸런싱
  2. 1-1. 로드 밸런싱 필요성
  3. 1-2. AWS ELB
  4. 1-3. ELB 구성 요소
  5. 1-4. ELB 동작 과정
  6. 2. AWS ELB 사용하기
  7. 2-1. 예시 상황 설명
  8. 2-2. ALB
  9. 2-2-3. ALB 동작 확인
  10. 2-3. ALB 경로 기반 라우팅
  11. 2-4. NLB
  12. 2-5. NLB 교차 영역 로드 밸런싱
'DevOps' 카테고리의 다른 글
  • [DevOps] AWS EC2 인스턴스에 Spring 애플리케이션 배포하기 / + 백그라운드에서 배포 방법 (nohup, tmux, (리눅스) systemd 서비스 파일)
  • [DevOps] 구매한 도메인을 EC2에 연결 (AWS Route 53, 가비아)
공대생안씨
공대생안씨
전자공학과 학부생의 코딩 일기
티스토리
|
로그인
공대생안씨
공대생의 코딩 일기
공대생안씨
글쓰기
|
관리
전체
오늘
어제
  • All Categories (153)
    • Spring Boot (46)
      • JPA (7)
      • Lombok (2)
    • Java (21)
    • DevOps (3)
      • CI,CD (8)
      • Monitoring (2)
    • Database (7)
      • MySQL (5)
      • MongoDB (1)
      • H2 (1)
    • Trouble Shooting (5)
    • FE (4)
    • IntelliJ (3)
    • Git (3)
    • Algorithm (41)

블로그 메뉴

  • 홈
  • 태그
  • Github

공지사항

인기 글

hELLO · Designed By 정상우.v4.2.2
공대생안씨
[DevOps] AWS ELB 사용하여 로드 밸런싱 적용하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.