1. 클라이언트 요청 시작
DNS 조회
- 사용자가 브라우저에 https://example.com을 입력하면, **DNS(Domain Name System)**가 도메인 이름을 서버의 IP 주소로 변환.
- 브라우저 → 로컬 DNS 캐시에서 IP 확인 (이미 조회된 경우 바로 반환).
- 로컬에 없으면 ISP DNS 서버로 요청.
- ISP 서버에도 없으면 최종적으로 권한 있는 DNS 서버(Authoritative DNS)로 요청.
- DNS 서버의 역할:
- 사용자 요청을 적합한 서버로 라우팅하기 위해 IP 주소를 반환.
- 예: example.com에 대해 192.168.1.1 반환.
2. 트래픽 라우팅
로드 밸런싱
로드 밸런싱은 정적인 파일이든 동적인 요청이든 상관없이 모든 요청에 대해 트래픽을 분산하는 방식으로 동작합니다
- DNS 기반 로드 밸런싱:
- DNS 서버가 사용자 위치에 따라 적합한 서버 IP를 반환.
- 예: 사용자 위치가 아시아라면 아시아 지역의 서버 IP를 반환.
- 클라이언트 요청이 CDN(Content Delivery Network)으로 전달:
- CDN은 전 세계에 분산된 엣지 서버를 통해 정적 리소스(HTML, CSS, JS, 이미지 등)를 제공.
- 브라우저가 가까운 엣지 서버로 요청 → 응답 속도 최적화.
- 엣지 서버에 요청된 리소스가 없으면 **원본 웹서버(Origin Server)**로 요청을 전달.
- L4 로드 밸런싱:
- TCP/UDP 레벨에서 동작.
- L4: WebSocket, FTP, DNS, VPN 등 비HTTP 트래픽.
- 사용처 : DB연결 등 비 Http요청, Http 서비스 로드밸런싱 후 내부적 로드밸런싱
- 로드밸런서는 클라이언트가 보내는 요청을 "최초로 받는 엔드포인트" 역할을 함. TCP 연결을 받아서 적절한 백엔드 서버(예: 웹 서버)로 중개. 백엔드 서버의 응답을 받아 다시 클라이언트에게 전달하는 역할.
- 1️⃣ 클라이언트 → 로드밸런서로 TCP 연결 요청 (SYN 패킷 전송)
- 2️⃣ 로드밸런서 → 백엔드 서버 중 하나를 선택 후, 해당 서버로 TCP 연결 전달
- 3️⃣ 백엔드 서버가 응답 (SYN-ACK 패킷 전송)
- 4️⃣ 이후 로드밸런서는 TCP 패킷을 백엔드 서버와 클라이언트 사이에서 중계
- IP 주소와 포트를 기반으로 서버 풀(Server Pool) 내 서버 중 하나에 요청을 전달.
- 상태 정보를 보지 않고 빠르게 처리.
- L7 로드 밸런싱:
- 애플리케이션 레벨에서 동작.
- L7: REST API, GraphQL, HTTPS, 동적 요청 처리.
- HTTP 헤더, 쿠키, URL 경로 등의 정보를 분석하여 요청을 적합한 서버로 라우팅.
- 사용처 : Http 서비스 로드밸런싱
- 예: /api/users 요청은 사용자 서비스로, /api/products 요청은 제품 서비스로 전달.
- 로드 밸런서의 역할:
- 요청을 **여러 WAS(Web Application Server)**로 분산하여 서버 부하를 줄임.
- 장애가 발생한 서버는 제외하고 요청을 라우팅(Failover).
- SSL 인증 처리를 통해 서버 부하를 줄일 수 있음.
3. 웹 애플리케이션 서버 (WAS)
WAS의 역할
- 클라이언트 요청을 처리하는 애플리케이션 로직을 수행.
- MSA(Microservices Architecture) 기반으로 설계:
- 여러 서비스가 독립적으로 동작하며, 요청은 API Gateway를 통해 라우팅.
WAS의 내부 구조:
- 프론트엔드 서버:
- HTML 템플릿 제공 또는 SSR(Server-Side Rendering) 수행.
- 예: Next.js, NGINX.
- 백엔드 서비스:
- 비즈니스 로직 처리.
- REST API 또는 gRPC를 통해 클라이언트와 통신.
요청 흐름
- 프론트엔드 서버에서 HTML 생성 요청.
- 백엔드 API Gateway로 요청 전달.
- Gateway는 요청을 분석하여 각 서비스로 라우팅.
- 예: /api/users → 사용자 서비스, /api/orders → 주문 서비스.
- 각 서비스는 필요한 데이터를 조회하거나, 비즈니스 로직 수행 후 응답.
캐싱 사용:
- Redis/Memcached를 통해 데이터베이스 요청 전에 캐싱 계층에서 데이터 조회.
- 캐시가 없으면 데이터베이스 요청 수행.
4. 데이터베이스 계층
DB 요청 흐름
- WAS가 필요한 데이터를 데이터베이스에서 조회.
- RDBMS(MySQL, PostgreSQL): 관계형 데이터베이스.
- NoSQL(MongoDB, DynamoDB): 비정형 데이터 저장.
- 샤딩 및 리플리케이션:
- 데이터를 **샤딩(Sharding)**하여 트래픽 분산.
- 읽기/쓰기 분리(Replication):
- Primary DB는 쓰기 작업 담당.
- Read Replica는 읽기 작업 담당.
- 쿼리 최적화:
- 인덱스 생성을 통해 조회 속도 개선.
- 복잡한 쿼리를 캐싱하여 데이터베이스 부하 감소.
5. 클라이언트 응답
HTML 생성 및 반환
- WAS는 최종적으로 HTML을 생성:
- SSR(Server-Side Rendering):
- 서버에서 동적으로 HTML 생성 후 클라이언트로 반환.
- CSR(Client-Side Rendering):
- WAS는 정적 HTML을 반환.
- 클라이언트가 JavaScript를 통해 추가 데이터를 요청(API 호출).
- SSR(Server-Side Rendering):
- HTML과 필요한 정적 리소스 경로를 반환:
- 예: CSS, JS, 이미지 경로 포함.
정적 리소스 제공
- 브라우저는 HTML에서 참조하는 리소스(CSS, JS, 이미지 등)를 요청.
- CDN에서 리소스를 다운로드:
- 엣지 서버에서 제공 → 빠른 응답.
- 리소스가 없으면 원본 서버로 요청 전달.
'개발기술 > 테스트, 인프라' 카테고리의 다른 글
테스트의 종류와 선택 (0) | 2025.03.31 |
---|---|
Prometheus 모니터링 + Grafana (0) | 2025.01.26 |
모니터링 툴 (0) | 2025.01.05 |
AWS 서비스 (1) | 2025.01.02 |
데이터베이스 스케일 업 & 아웃 (0) | 2024.09.02 |