Skip to content

트래픽 분산 처리

Changhee Choi edited this page Dec 29, 2020 · 9 revisions

도입 이유

  • 현재 단계에서는 크게 중요하지 않은 부분일 수도 있지만 웹 서비스에서 항상 고민하는 부분인 안정적인 트래픽 처리를 도전해보고 싶었다.
  • 서버 환경은 비용이 발생하기 때문에 항상 머뭇거려 졌었는데 마침 지원받은 크레딧으로 서버 환경을 만들어 볼 수 있었기 때문에 아낌없이 크레딧을 낭비해보기로 결정.

Docker

  • 개발이 완료된 코드를 CI/CD 를 통해 버전별 도커 이미지로 배포

  • 버그가 발생했을때 배포 버전을 되돌리거나 새로운 서버로 확장이 용이

DockerSwarm

  • 도커 컨테이너를 클러스터링, 스케줄링 하기 위한 툴.

  • 여러 개의 서버와 컨테이너 관리를 쉽게 할 수 있다.

    • 간단한 명령어로 서버들을 클러스터로 연결할 수 있고 각 서버로 균등하게 컨테이너를 배포 가능.

이슈

1. 인증정보 관리

Session

  • 로그인 인증 정보를 로그인된 서버에서 관리

  • 분산된 요청을 받은 다른 서버에서는 인증 정보가 존재하지 않아 401 Unauthorized 응답이 발생

  • 인증 정보를 공유하기 위한 분산 세션등의 기법이 필요

JWT

  • 로그인 인증 정보를 토큰에 포함

  • 인증 정보를 공유하기 위한 기법이 필요하지 않음


2. 서버 관리

원했던 모습

  • 불필요한 서버 비용을 줄이기 위해서 예비용 서버를 대기 상태로 변경. (upstream에는 등록된 상태)
  • Nginx에서 upstream으로 요청을 분산시킬때 대기상태의 예비용 서버를 제외하고 나머지 서버에 요청을 분산.
  • 예비용 서버를 재실행 시키면 예비용 서버로도 다시 요청이 분산됨.

동작한 모습

  • Nginx에서 대기상태의 예비용 서버로도 요청을 보내면서 timeout이 발생하는 경우가 생김.
  • Nginx 설정에서 대기 서버의 IP를 주석처리해두었다가 재실행 했을때 주석을 풀어주어야 함.
  • Nginx의 Health Check는 상용 버전에서만 지원...

해결

  • Nginx 대신 Health Check를 지원하는 오픈소스 라이브러리인 HAProxy 사용
  • 서버 상태를 주기적으로 확인하고 가동중인 서버로만 요청을 전달
  • 설정을 변경할 필요없이 서버만 다시 실행시키면 Health Check에 의해 가동중인 서버로 판별되고 다시 요청이 전달됨

적용 모습

ezgif com-gif-maker (2)

HAProxy

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

JMeter 성능 테스트

1000명의 유저가 20회씩 요청을 보낼때 처리 속도 비교

서버 1대에서 처리(1분 11초) 스크린샷 2020-12-21 오전 2 03 38

서버 2대에서 처리(48초) 스크린샷 2020-12-21 오전 2 04 53

서버 4대에서 처리(27초) 스크린샷 2020-12-21 오전 2 13 26

한계점 및 고민사항

  • Manual 방식의 스케일링
  • 예비용 서버를 어떻게 관리할 것인가?
    • 다운 시킨 상태로 물려놓아도 괜찮은 것인가?
Clone this wiki locally