Web 서버 기본 구조
- 가장 간단한 구조
- 서버가 죽을시 데이터 소멸, 서비스 중지
- 요청이 늘어날 경우 Scale up(서버의 스펙 상승) 또는 Scale out(서버의 대수 증가) 방법을 사용하여 처리 능력을 향상시킬 수 있음
서버 Scale out
- 서버를 단순히 Scale out하여 대수를 늘린 경우
- 특정 서버에 부하가 집중될 수 있음
- 각 서버마다 가지고있는 데이터가 다름
- 가용성, 정합성 문제를 해결하지 못함
Load Balancer, DB 추가
- 로드 밸런서를 추가해 서버에 가해지는 트래픽을 여러대의 서버에 균등하게 분산
- 모든 서버가 동일하게 공유하는 데이터베이스에서 데이터를 관리하므로 데이터의 일관성이 유지됨
- DB를 통해 데이터를 더 효율적으로 관리할 수 있으며, 보안 / 백업 등에도 이점이 생김
Load Balancing
로드 밸런싱에는 다음과 같은 알고리즘들이 사용됨
- 라운드로빈(Round Robin) : 서버에 들어온 요청을 순서대로 돌아가면서 배정
여러 대의 서버가 동일한 스펙을 가지는 경우 사용 - 가중 라운드로빈(Weighted Round Robin) : 서버마다 가중치를 매긴 후 가중치가 높은 서버에 요청을 우선적으로 배정
서버마다 트래픽 처리 능력이 상이한 경우 사용 - IP 해시(IP Hash) : 클라이언트의 IP 주소를 특정 서버로 매핑하여 요청을 처리
사용자가 항상 동일한 서버로 연결되는 것을 보장 - 최소 연결(Least Connection) : 요청이 들어온 시점에 가장 적은 연결상태를 보이는 서버에 우선적으로 트래픽 배분
서버에 분배된 트래픽들이 일정하지 않은 경우에 적합 - 최소 리스폰타임(Least Response Time) : 서버의 현재 연결상태와 응답시간을 고려하여 트래픽을 배분
로드 밸런싱은 OSI 7 Layer 중 어느 계층에서 밸런싱이 이루어지냐에 따라서 구분 가능
- L2 : Mac 주소를 바탕으로 로드 밸런싱
- L3 : IP 주소를 바탕으로 로드 밸런싱
- L4 : TransPort 계층에서 로드 밸런싱
- IP 주소 / 포트번호 / Mac 주소 / 전송 프로토콜에 따라 트래픽을 분산
- 패킷 레벨에서만 트래픽을 분산하기 때문에 속도가 빠르고 효율이 높음
- L7 : Application 계층에서 로드 밸런싱
- 패킷의 내용을 확인하고 그 내용에 따라 특정 서버에 분배 가능
- 패킷의 내용을 복호화해야하기 때문에 L4보다 더 높은 비용을 지불해야
AWS에서는 ELB(Elastic Load Balancer)라는 이름으로 로드 밸런서를 제공
이 때 ELB는 ALB, NLB, CLB를 모두 포함하는 포괄적인 개념
- ALB(Application Load Balancer) : OSI 7계층에서 동작, HTTP/HTTPS 트래픽을 처리에 적합
- NLB(Network Load Balancer) : OSI 4계층에서 동작, TCP/UDP 및 TLS 트래픽 처리에 적합
- CLB(Classic Load Balancer) : OSI 4, 7계층에서 동작하지만 현재는 거의 사용하지 않음
DB의 레플리케이션
- DB를 Master와 Slave로 나누어 Master에서는 Insert / Update / Delete 등의 Wrtie 작업, Slave에서는 Select의 Read 작업을 수행
- 자원을 많이 소비하는 Read 작업을 여러 개의 Slave에서 진행하기 때문에 부하를 분산시킬 수 있음
- Master의 내용을 복제하기 때문에 데이터를 백업하는 용도로도 사용 가능
- 단, Slave는 Master의 복사본이기 때문에 데이터의 정합성을 보장할 수 없
- MySQL에서는 레플리케이션에 비동기 복제 방식을 사용
Master 노드에서 변경되는 데이터에 대한 이력을 로그에 전송시 Replication Master Thread가 비동기적으로 이를 확인 후 Slave에 전송
KVS 추가
KVS(Key Value Store)
Key와 Value 쌍으로 데이터를 관리하는 DB
Memcache, DynaamoDB, Redis 등이 있으며 각 DB마다 특징, 사용방법, 용도가 다름
- KVS중 하나인 Redis는 주로 캐시 데이터베이스 서버로 활용
데이터베이스 확장
수직 파티셔닝(Vertical Partitioning)
테이블의 컬럼을 분할하여 다른 테이블에 저장
테이블의 크기를 줄이고 특정 컬럼에 대한 접근 속도를 향상시킬 수 있음
수평 파티셔닝(Horizontal Partitioning)
데이터를 테이블의 행 단위로 분할하여 서로 다른 테이블에 저장
샤딩(Sharding)
데이터를 레코드 또는 테이블 단위로 분할하여 서로 다른 DB에 분산 저장
각 DB 서버는 독립적인 데이터베이스 인스턴스를 가지고 동작하며, 쿼리가 여러 서버에 분산되어 실행될 수 있음
단, 여러 샤드에 걸친 데이터를 조인하는 것이 어렵고 한 데이터베이스에 부하가 집중될 경우 성능이 저하됨
'개인공부 > Web API 게임 서버 공부' 카테고리의 다른 글
Web API 서버 예시 (0) | 2023.04.24 |
---|---|
배경지식 - ZLogger (0) | 2023.04.20 |
배경지식 - Redis (0) | 2023.04.20 |
배경지식 - ORM (1) | 2023.04.20 |
배경지식 - C# (0) | 2023.04.20 |
댓글