-
Notifications
You must be signed in to change notification settings - Fork 1
트래픽 분산 처리
Changhee Choi edited this page Dec 29, 2020
·
9 revisions
- 현재 단계에서는 크게 중요하지 않은 부분일 수도 있지만 웹 서비스에서 항상 고민하는 부분인 안정적인 트래픽 처리를 도전해보고 싶었다.
- 서버 환경은 비용이 발생하기 때문에 항상 머뭇거려 졌었는데 마침 지원받은 크레딧으로 서버 환경을 만들어 볼 수 있었기 때문에 아낌없이 크레딧을 낭비해보기로 결정.
-
개발이 완료된 코드를 CI/CD 를 통해 버전별 도커 이미지로 배포
-
버그가 발생했을때 배포 버전을 되돌리거나 새로운 서버로 확장이 용이
-
도커 컨테이너를 클러스터링, 스케줄링 하기 위한 툴.
-
여러 개의 서버와 컨테이너 관리를 쉽게 할 수 있다.
- 간단한 명령어로 서버들을 클러스터로 연결할 수 있고 각 서버로 균등하게 컨테이너를 배포 가능.
Session
-
로그인 인증 정보를 로그인된 서버에서 관리
-
분산된 요청을 받은 다른 서버에서는 인증 정보가 존재하지 않아 401 Unauthorized 응답이 발생
-
인증 정보를 공유하기 위한 분산 세션등의 기법이 필요
JWT
-
로그인 인증 정보를 토큰에 포함
-
인증 정보를 공유하기 위한 기법이 필요하지 않음
원했던 모습
- 불필요한 서버 비용을 줄이기 위해서 예비용 서버를 대기 상태로 변경. (upstream에는 등록된 상태)
- Nginx에서 upstream으로 요청을 분산시킬때 대기상태의 예비용 서버를 제외하고 나머지 서버에 요청을 분산.
- 예비용 서버를 재실행 시키면 예비용 서버로도 다시 요청이 분산됨.
동작한 모습
- Nginx에서 대기상태의 예비용 서버로도 요청을 보내면서 timeout이 발생하는 경우가 생김.
- Nginx 설정에서 대기 서버의 IP를 주석처리해두었다가 재실행 했을때 주석을 풀어주어야 함.
- Nginx의 Health Check는 상용 버전에서만 지원...
해결
- Nginx 대신 Health Check를 지원하는 오픈소스 라이브러리인 HAProxy 사용
- 서버 상태를 주기적으로 확인하고 가동중인 서버로만 요청을 전달
- 설정을 변경할 필요없이 서버만 다시 실행시키면 Health Check에 의해 가동중인 서버로 판별되고 다시 요청이 전달됨
적용 모습
Install (버전확인)
sudo apt-get install --no-install-recommends software-properties-common
sudo add-apt-repository ppa:vbernat/haproxy-2.2
sudo apt-get install haproxy=2.2.\*
haproxy.cfg
frontend https_in
mode http
bind :443 ssl crt /etc/ssl/www.tess.kro.kr/tess.kro.kr.pem
acl PATH_api path_beg -i /api/
use_backend accountbook_backend if PATH_api
default_backend accountbook_client
backend accountbook_client
mode http
option forwardfor
server fe_node1 {FRONT_NODE_IP} check
backend accountbook_backend
mode http
balance roundrobin
option forwardfor
server be_node1 {BACKEND_NODE1_IP} check
server be_node2 {BACKEND_NODE2_IP} check
1000명의 유저가 20회씩 요청을 보낼때 처리 속도 비교
서버 1대에서 처리(1분 11초)
서버 2대에서 처리(48초)
서버 4대에서 처리(27초)
- Manual 방식의 스케일링
- 예비용 서버를 어떻게 관리할 것인가?
- 다운 시킨 상태로 물려놓아도 괜찮은 것인가?