일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Alembic
- 백엔드 개발자
- AWS
- 로드밸런서
- 가비지컬렉션
- golang
- 회고
- 캐시서버
- FastAPI
- 스레드풀
- SQLAlchemy
- 메모리구조
- nodejs
- Django
- 싱글톤 디자인 패턴
- K8S
- 2022년
- nestjs
- 글또
- CPU스케쥴링
- alb
- 쿠베네티스
- 멀티스레드
- Python
- EKS
- gunicorn
- 스케줄링
- 쿠버네티스
- 분산처리
- uvicorn
- Today
- Total
서버에서 살아남기
서버의 부하 분산 본문
성공과 실패를 결정하는 1%의 네트워크
책을 읽고 리퀘스트를 분배한 서버의 부하 분산과 캐시 서버를 이용한 서버의 부하 분산을 정리하려고 합니다.
1. 리퀘스트를 분배한 서버의 부하 분산
분산 처리 : 복수의 서버를 사용하여 처리를 분담하는 방법으로 서버 한 대당 처리량을 줄이는 것
부하 분산의 가장 간단한 방법은 서버를 여러 대 두는 것입니다. 이 방법을 사용할 경우 클라이언트가 보내는 리퀘스트를 웹 서버에 분배하는 구조가 필요합니다.
서버에 엑세스 할 때 DNS서버에 조회하여 IP주소를 조회하는데, DNS서버는 조회가 있을 때마다 차례대로 IP주소를 되돌려줍니다.
예를 들어 http://www.soohyun.co.kr 이라는 서버명이 있고, 192.0.2.10 192.0.2.20 192.0.2.30 이 있다고 가정해보면,
이렇게 그림과 같이 차례를 바꿔가며 회답을 합니다. 1주기를 순환하고 원래대로 돌아가는 것을 라운드 로빈이라고 합니다.
그러나 웹 서버 중 문제가 있는 서버가 있어도 DNS서버는 웹 서버가 동작하는지 안하는지 확인하지 못하므로 웹 서버가 멈췄어도 IP주소를 회답합니다.
이러한 단점을 피하기 위해 부하 분산 장치, 로드 밸런서 등이 나왔습니다.
부하 분산 장치에 웹 서버가 연상되는 http://www.soohyun.co.kr 과 똑같은 이름을 붙이고, 부하 분산 장치의 IP주소를 DNS서버에 등록합니다.
그러면 클라이언트는 부하 분산 장치가 웹 서버라고 생각하여 여기에 리퀘스트를 보내고 부하분산 장치는 여러대의 서버에 리퀘스트를 분배합니다.
1-1. 여러대의 웹 서버에 리퀘스트를 전송 시, 판단 하는 기준
1) 통신이 단순한 엑세스 일 때
- 웹 서버의 부하 상태가 판단 근거입니다. 웹서버와 정기적으로 정보를 교환하여 CPU나 메모리의 사용률 등을 수집하고 이것을 바탕으로 부하가 낮은지, 시험 패킷을 웹 서버에 보내 응답 시간으로 부하를 판단하는 방법이 일반적입니다.
2) 통신이 복수 페이지에 걸려 있을 때
- 웹 서버의 부하와 관계없이 이전의 리퀘스트와 같은 웹 서버에 전송해야 하는데, 그러려면 통신이 복수의 페이지에 걸려있는지 먼저 판단해야 합니다. 첫번째 보낸 통신과 그 다음에 보내는 통신이 같은 것인지 전후 관계를 확인하기 위한 정보를 HTTP 헤더에 부가합니다(쿠키) 그래서 이전과 같은 통신이라면 이전과 같은 웹서버에 보내고, 그렇지 않으면 부하가 적은 웹 서버에 전송하도록 처리합니다.
2. 캐시서버를 이용한 서버의 부하 분산
데이터베이스 서버와 웹 서버 같이 역할에 따라 분산 처리하는 방법 중 하나가 캐시 서버를 사용하는 방법입니다.
캐시 서버는 프록시 라는 구조를 사용하여 데이터를 캐시에 저장하는 서버입니다.
프록시
: 웹 서버와 클라이언트 사이에 들어가서 웹 서버에 대한 엑세스 동작을 중개하는 역할
: 웹 서버에서 받은 데이터를 디스크에 저장해두고, 웹 서버를 대신하여 클라이언트에 데이터를 반송하는 기능(=캐시)
케시 서버는 웹 서버에서 받아 보관해둔 데이터를 클라이언트에 송신만 하면 되기 때문에 빠르게 데이터를 송신할 수 있지만, 웹 서버의 데이터가 변경되면 캐시의 데이터는 사용할 수 없습니다.
2-1. 캐시서버의 동작
클라이언트에서 캐시 서버로 요청을 보낼 수 있게 웹 서버 대신 캐시 서버를 DNS 서버에 등록합니다.
1) 데이터가 캐시에 저장이 안되어 있는 경우
- 캐시 서버는 클라이언트에서 받아온 리퀘스트 메세지에 캐시 서버를 경유한 것을 나타내는 값을 헤더에 추가하여 웹 서버에 전달 (캐시 서버의 설정에 따라 붙지 않는 경우도 있음)
- 응답 메세지를 캐시 서버로 전달
- 응답 메세지에 1-1) 과 같이 캐시 서버를 경유했다는 것을 나타내는 값을 헤더에 추가
- 응답 메세지를 캐시에 저장하고 저장한 일시 기록
2) 데이터가 캐시에 저장이 되어 있는 경우
- 캐시 서버는 클라이언트에서 받아온 리퀘스트 메세지에 캐시 서버를 경유한 것을 나타내는 값을 헤더에 추가하여 웹 서버에 전달 (캐시 서버의 설정에 따라 붙지 않는 경우도 있음)
- 웹 서버측에서 데이터가 변경되었는지 조사하기 위한 If-Modified-Since 라는 헤더 필드를 추가하여 웹 서버에 전송
- 웹 서버는 If-Modified-Since값과 페이지 데이터의 최종 갱신 일시를 비교하여 변경이 없으면 변경이 없다라는 것을 나타내는 응답 메세지 반송
- 캐시 서버는 최신 데이터와 같다는 것을 확인했기 때문에 캐시에서 데이터를 추출하여 클라이언트에게 전다
'네트워크' 카테고리의 다른 글
사설 IP와 VPN (0) | 2023.07.27 |
---|---|
브라우저에 www.google.com 을 입력하면? (0) | 2023.03.26 |
라우터가 하는 일 (0) | 2022.05.29 |